【问题标题】:REST method for UI and API access用于 UI 和 API 访问的 REST 方法
【发布时间】:2015-07-25 04:35:33
【问题描述】:

大家:

这是一个 REST 设计问题,不特定于任何编程语言。我正在创建一个通过 REST API 访问的应用程序后端。我想为 UI 和基于 API 的访问使用相同的 API。我正在尝试找出对用户进行身份验证的最佳方法,以便我可以重复使用相同的方法。

我目前对认证的想法如下:

API 用户

这些用户会获得一个用户 GUID 和一个预共享的对称密钥。在每个 API 请求中,它们都包含额外的标头或请求参数,其中包含:

  1. 他们的 GUID
  2. 包含用户 GUID、当前时间戳和另一个 GUI(令牌 GUID)的安全令牌,它们连接在一起并使用共享密钥进行加密

服务器收到请求后,会查看声明的 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 的服务器端框架。

期待社区的一些见解。

谢谢。

【问题讨论】:

    标签: api rest authentication flask


    【解决方案1】:

    我们使用节点作为我们的服务器,但我认为我们使用的方法很常见。 express 可以使用会话库,它们可以很好地利用任何数据库来存储会话信息。他们使用带有密钥的 cookie,该密钥在客户端进入时对数据库进行查找。会话数据在客户端进行身份验证时创建,并将带有客户端密钥的 cookie 添加到浏览器中。客户端 GUID 存储在会话中,它永远不会离开服务器。当他们访问服务器时,我们会使用该信息来检查他们是否已登录、他们是谁以及他们可以做什么。我们使用了 FB,(客户端检查 FB,然后将 FB id 和令牌发送到服务器,然后重新检查并设置会话或拒绝它,)或旧的经典,电子邮件和密码。当您必须跨多个应用服务器进行扩展时,这很有效,因为会话独立于服务器,它适用于移动客户端和网络。

    【讨论】:

    • 感谢 CargoMeister。你能给我一个在服务器上处理无会话 API 请求和会话感知 UI 请求的 REST 方法的示例吗?
    • 嗯,无会话是个问题。我们为移动设备和网络开发,在移动设备中,有一些 http 请求模块可以完全像浏览器一样运行。那么,您可以使用它吗?
    • 好吧,如果你不能为 API 使用会话,那么你所做的就是你能做的。真的,如果您通过两个不同的功能设置用户,就是这样,您应该能够避免代码重复。不知道你还在寻找什么,我以为你在质疑你正在传递令牌这一事实,
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 2020-03-16
    • 2023-03-09
    • 2014-01-28
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多