【问题标题】:OpenID authentication and API accessOpenID 身份验证和 API 访问
【发布时间】:2023-03-27 08:38:01
【问题描述】:

OpenID 身份验证本质上是基于浏览器的。如果我想允许 OpenID 用户针对 API 进行身份验证以在替代客户端中使用,是否有公认的最佳实践?

例如,如果用户尝试使用他们的 OpenID 登录 iPhone 应用程序,那将如何工作?我能想到的唯一一件事就是为他们生成某种 API 令牌并让用户在某处手动输入它。这种方法对用户不友好。

Basecamp 之类的网站就是这样工作的,但对我来说还是很笨拙。

【问题讨论】:

    标签: api authentication openid


    【解决方案1】:

    您看到的问题并不是 OpenID 独有的。任何无密码身份验证方案都可能存在此问题。 OAuth (http://oauth.net/) 是一个开放标准的解决方案,在许多网站上迅速获得关注。它完全独立于用户的身份验证方式,因此他们的 OpenID 提供者不需要需要支持甚至知道您的站点(OAuth 术语中的“服务提供者”)正在使用 OAuth。您的 API 客户端可以是基于 Web 的,甚至可以是本地应用程序!

    这个过程是这样的:

    角色:

    • 用户:拥有您网站帐户的人。
    • 服务提供商:您的网站,它有一个程序化 API,需要一些凭据才能访问。
    • 消费者:需要访问服务提供商 API 的客户端,无论是 Web 还是本地应用程序。

    流程:

    1. 用户位于消费者处。他表示他想访问服务提供商的数据。
    2. 用户要么被重定向(如果消费者是网站),要么浏览器被弹出(如果消费者是本地应用程序)并且用户看到服务提供商网站。
    3. 用户要么已经通过持久性 cookie 登录到服务提供者,要么用户必须先登录到服务提供者,但是这样做(在你的情况下是 OpenID)。
    4. 然后,服务提供商会询问用户:“消费者(某些消费者)想要访问您的数据(或我们的 API 或其他)。您要授权吗?(是/否)
    5. 用户确认,浏览器窗口关闭或被重定向回消费者站点。
    6. 通过一些 OAuth 协议魔法,消费者现在拥有一个秘密凭据,它可以使用它来访问您的 API 并访问您刚刚授权的任何用户私有信息。

    显然,我无法在此处包含整个 OAuth 规范,但您可以从上面看到,这应该可以解决您的问题。 OAuth 库的存在是为了轻松添加对它的支持。

    如果您碰巧使用的是 ASP.NET,我建议您使用 http://dotnetopenid.googlecode.com/,因为它最近添加了 OAuth 支持(v3.0 beta 1)。

    【讨论】:

    • 感谢您的精彩解释。
    • 我正在寻找同样的解释,你的回答做了很多改进,但我最缺乏信息的地方是 5 到 6 之间。你的“OAuth 协议 magic " 对我没有多大帮助 :p 你有没有可能给我(我们?)更多关于restful服务器如何确保不受信任的消费者拥有正式登录用户的神奇之处的详细信息?非常感谢!
    • “OAuth 魔法”是由一个好的 OAuth 库来处理的,或者是阅读规范并自己实现它,但简而言之,消费者使用“验证器代码”向服务提供者发送最终请求",作为回报,服务提供者向消费者发送一个“访问令牌”,它可以用来签署后续的授权请求。
    【解决方案2】:

    OpenID 和 OAuth 都没有定义用户的身份验证方式。它们定义了消费者如何将用户代理定向到身份验证提供者,如何将用户代理返回,以及消费者如何验证用户通过身份验证的身份。

    用于验证的实际方法对于这两种方案都是带外的。

    OpenID 和 OAuth 之间存在差异,但两者都要求消费者使用 HTTP 重定向和回调 URL。它们都是基于浏览器的。如果您的应用程序使用 HTTP,它可以做到。但是,重点是用户只是将凭据输入到受信任的应用程序中。

    【讨论】:

      【解决方案3】:

      OpenID 无法实现您想要的。 OpenID 的前提是您(iPhone 应用程序)只想了解您的用户,即他们的 OpenID 提供者信任他们。他们从不向您验证自己的身份。

      良好的 OpenID 提供者实际上甚至 prevent 都在您调解身份验证过程(因为这会使用户面临可能的攻击 - 由您发起!):他们要求用户直接使用他们登录并拒绝通过推荐登录.

      【讨论】:

      • 这是不准确的。 OpenID 是关于用户身份验证的——它不排除 API 访问的其他身份验证/授权方式。这就是 OAuth 的全部意义所在。
      • 我只是在回答这个问题:“如果我想允许 OpenID 用户针对 API 进行身份验证以用于替代客户端......” - 这是您无法控制的:提供商控制模式互动,而不是消费者。你说你自己也在你的解决方案中......
      【解决方案4】:

      见:related question

      问题在于,openid 规范没有与提供者进行身份验证的标准规定,因此提供者可以选择通过电话或其他方式进行身份验证。

      希望更多的供应商embrace OAuth。或者,您可以为一些较大的站点手动编写身份验证代码。

      【讨论】:

      • 假设他们已经在我们这里设置了一个帐户,我可以将 OAuth 用作 OpenID 消费者吗?还是提供商必须支持它?
      • 在 OpenID 中有两个角色:“OpenID 提供者”和“依赖方”。在 OAuth 中有两个角色:“服务提供者”和“消费者”。这很令人困惑,因为在 OpenID 1.1 中,依赖方曾经被称为消费者。无论如何,OP Provider 不需要支持 OAuth。请参阅我自己的答案。
      猜你喜欢
      • 2015-11-15
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多