Python 中的授权 REST 服务
我正在设计以及决定是否选择 python 作为主要语言来实现该软件。任务是:
- 实现一组 Restful Web 服务,
- 将 http 方法授权给某些用户组,因为需要使用 xacml 进行策略定义(或者可以是另一个标准),使用 saml 进行信息。交换
I am in the design as well as at the deciding phase whether to choose python as a primary language to implement the software. The task is to:
- implement a set of restful web services
- authorizing the http methods to certain group of users, for that it is required to use xacml for the policies definition (or can be another standard) and saml for the info. exchange
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您的问题是可以使用哪些库来实现这些 RESTful 服务,请查看 BaseHTTPServer< /a> 标准 python 库的模块。
下面的代码展示了实现一个接受 GET 请求的简单服务器是多么容易:
当然,该代码不是我自己写的,是我发现的 此处。
If your question was what libraries you can use to implement these RESTful services, then have a look into the BaseHTTPServer module of the standard python library.
The following code shows how easy it is to implement a simple server accepting GET requests:
Of course, the code is not from myself, I found it here.
使用 Python,您可能希望创建一个包含用户 ID 的 XACML 请求(您可以从通常在身份验证之前发生的身份验证阶段获取该 ID)并添加有关用户所针对的 WS 的信息。它可能是 URI,也可能是 HTTP 方法...
最后您可能会得到类似这样的信息:
例如,您需要使用 Python 和 lxml 构建请求。
响应将如下所示
因此,您再次需要解析 XML 以提取决策,例如 Permit。我为 XACML PDP 编写了一个类似 REST 的基本接口,您所要做的就是将 HTTP GET 发送到 URI,将变量作为 GET 变量传递,例如 http://www.xacml.eu/AuthZ/?a=alice&b=/someuri/myapi/target.py&c=GET
这有帮助吗?
Using Python you would want to create a XACML request that would include your user's id (you would get that from the authentication phase that typically takes place before you authenticate) and add information about the WS the user is targetting. It could be the URI, the HTTP method too...
In the end you may get sthg like:
You need to construct the request using Python and lxml for instance.
The response will look like
So again you need to parse the XML to extract the decision e.g. Permit. I wrote a basic REST-like interface to a XACML PDP where all you have to do is send an HTTP GET to a URI passing variables as GET variables e.g. http://www.xacml.eu/AuthZ/?a=alice&b=/someuri/myapi/target.py&c=GET
Does that help?
我同意 Constantinius 的观点,即
BaseHTTPServer
是在 Python 中实现 RESTful 的好方法。它预装了 Python 2.7,并且在此类事情上的扩展性比 Gunicorn/flask/wsgi/gevent 好得多。并支持您将来可能想要的流媒体。下面的示例显示了 Web 浏览器如何对 BaseHTTPServer 进行远程 POST 调用并获取数据。
JS(放入 static/hello.html 以通过 Python 提供服务):
Python 服务器(用于测试):
控制台日志 (chrome):
控制台日志 (firefox):
控制台日志 (Edge):
Python 日志:
您还可以通过以下方式轻松添加 SSL :在将套接字传递给 BaseHTTPServer 之前对其进行包装。
I agree with Constantinius that
BaseHTTPServer
is a great way to do RESTful in Python. It is pre-installed with Python 2.7 and scales much better than gunicorn/flask/wsgi/gevent for that sort of thing. And supports streaming which you might want down the road.Below is an example showing how a web browser does a remote POST call to a BaseHTTPServer and gets data back.
JS (put in static/hello.html to serve via Python):
Python server (for testing):
Console log (chrome):
Console log (firefox):
Console log (Edge):
Python log:
Also you can easily add SSL by wrapping the socket before passing it to BaseHTTPServer.