【问题标题】:How to use OpenID in RESTful API?如何在 RESTful API 中使用 OpenID?
【发布时间】:2010-12-22 10:27:26
【问题描述】:

我正在使用 RESTful API 构建基于 Pylons 的 Web 应用程序,该应用程序目前缺少任何身份验证。所以我要实现它,为了避免存储用户密码的所有麻烦和谨慎,我想使用 OpenID 进行身份验证。最好的方法是什么?这两件事兼容吗?是否存在使用 OpenID 的现有 REST API,我可以从中获得灵感?

【问题讨论】:

    标签: api rest openid pylons


    【解决方案1】:

    我现在花了一些时间研究这些选项,并想总结一下结果。 首先,多一点上下文——我开发和控制服务和 API 使用者。 Consumer 是基于 Flash 的应用程序,由 API 现在所在的同一主机提供服务,并且应该在浏览器中使用。目前还没有第三方客户。

    所以问题可以分为两部分,

    • 如何通过 API 进行 OpenID 身份验证
    • 如何在后续请求中保持“已验证”状态

    对于第一部分,OpenID 身份验证几乎总是包含交互步骤。在身份验证过程中,很可能会有一个步骤,即用户在 OpenID 提供商的网页中,登录并按下一些“我同意”按钮。所以 API 不能也不应该透明地处理这个问题(不要“告诉我你的 OpenID 提供者和密码,剩下的我来做”)。它可以做的最好的事情是传递和返回客户端必须打开并遵循说明的 HTTP 链接。

    保持“已验证”状态

    REST API 应该是无状态的,每个请求都应该包含处理它所需的所有信息,对吧?对每个请求都针对 OpenID 提供者进行身份验证没有任何意义,因此需要 某种 类型的会话。用于通信会话密钥(或“访问令牌”或用户名/密码)的一些选项是:

    • HTTPS + BASIC 身份验证(每个请求中的“Authorization: Basic ...”标头)
    • 签署请求Amazon-style(“授权:AWS ...”每个请求中的标头)
    • OAuth:获取访问令牌,在每个请求中包含该令牌和一堆其他参数
    • 存储会话密钥的 Cookie(每个请求中的“Cookie: ...”标头)
    • 在 cookie 本身中存储会话信息的签名 cookie

    现在只有一个 API 使用者,所以我选择了最简单的可能工作的东西——cookie。在 Beaker 的帮助下,它们在 Pylons 中非常易于使用。它们还在 Flash 应用程序中“正常工作”——因为它在浏览器内运行,浏览器将在 Flash 应用程序发出的请求中包含相关的 cookie——应用程序根本不需要对此进行更改。这里有一个 StackOverflow 问题也提倡使用 cookie:RESTful authentication for web applications

    Beaker 还具有 cookie-only sessions 的出色功能,其中所有会话数据都包含在 cookie 本身中。我想这几乎是无国籍状态。服务器上没有 no 会话存储。 Cookie 被签名并可选择加密,以避免在客户端被篡改。缺点是 cookie 变得有点大,因为它现在需要存储的不仅仅是会话密钥。通过删除会话中我并不真正需要的一些东西(OpenID 身份验证的剩余部分),我将 cookie 大小缩减到了大约 200 字节。

    【讨论】:

      【解决方案2】:

      OAuth 更适合 API 使用。以下是 Python 中使用的 OAuth 示例:oauth-python-twitter。 Leah Culver 的 python-oauth 库是 Python 中 OAuth 的规范实现,但 python-oauth2 是最近引起轰动的竞争者。至于灵感,django-piston 支持在为 Django 创建 RESTful API 时使用 OAuth 进行身份验证,尽管该特定主题的文档不如我想要的那么好。

      【讨论】:

      • 该API目前针对客户端-服务器场景。客户端是 Flash 应用程序,服务器是 Pylons webapp。目前没有服务器到服务器的东西,所以还不需要三足的东西。我目前的问题是如何在系统中引入“经过身份验证的用户”,而无需处理存储密码、发送密码提醒、重置密码等。目前尚不清楚 OAuth 在这里如何帮助我,因为在 2-legged 版本中它只是指定如何签署请求。
      • 在这种情况下,pylonshq.com/pasties/by_tag/openid 的其中一个粘贴可能会有所帮助。
      【解决方案3】:

      如果你构建 API,你可以检查 OAuth 协议。它是 OpenID 的补充。

      【讨论】:

        猜你喜欢
        • 2017-10-01
        • 2021-01-22
        • 2023-03-07
        • 2016-06-23
        • 1970-01-01
        • 2019-08-12
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        相关资源
        最近更新 更多