民间:
这是一个REST设计问题,并非特定于任何编程语言。我正在创建一个通过REST API访问的应用程序后端。我想对UI和基于API的访问使用相同的API。我试图找出验证用户的最佳方法,以便我可以重复使用相同的方法。
我目前对身份验证的看法如下:
API用户
这些用户获得用户GUID和预共享对称密钥。在每个API请求中,它们都包含其他标头或请求参数,其中包含:
收到请求后,服务器会查看声明的GUID,检索共享密钥,尝试解密并验证令牌。
用户界面
这些用户将发出登录请求,提供人工凭证(用户ID /密码)。经过身份验证后,将建立一个由cookie支持的会话,并根据此会话确保进一步的REST呼叫。
问题
编写一个保护两种方式的REST端点的最佳方法是什么:API访问和UI访问干净,没有太多重复?我正在寻找相同的以下内容,但也许更干净:
@app.route('/')
def hello():
user = None
if session:
user = get_authenticated_user()
else:
user = process_auth_headers()
# Do something with user
我希望在Flask中对服务器进行编码,但我确信该解决方案可以轻松应用于任何基于REST的服务器端框架。
期待社区的一些见解。
感谢。
答案 0 :(得分:0)
我们为服务器使用node,但我认为我们使用的方法很常见。有表达的会话库可以使用,并且它们可以很好地利用任何数据库来存储会话信息。他们使用带有密钥的cookie,当客户端进入时,该密钥会对数据库进行查找。会话数据在客户端进行身份验证时创建,并且带有客户端密钥的cookie将添加到浏览器中。客户端GUID存储在会话中,它永远不会离开服务器。我们在访问服务器时使用该信息来检查他们是否已登录,他们是谁以及他们可以做什么。我们使用了两个FB,(客户端检查FB,然后将FB id和令牌发送到服务器,然后重新检查并设置会话或拒绝它),或旧的经典,电子邮件和密码。当您必须跨多个应用服务器进行扩展时,这很有效,因为会话独立于服务器,它适用于移动客户端和Web。