OAuth2用于自定义API

时间:2013-07-25 09:32:09

标签: php api rest oauth-2.0 laravel-4

我正在尝试将OAuth2用于我正在创建的API,但可以使用一些解释流程如何工作。我发现了类似的问题(例如:Securing my REST API with OAuth while still allowing authentication via third party OAuth providers (using DotNetOpenAuth))但是他们没有说清楚第三方登录。

我不希望使用OpenID(但是,无论如何),特别是当通过委派进行身份验证可能正常工作时。它似乎过于复杂,并没有很多支持良好的库。 (我正在使用PHP + Laravel 4)

问题分为4个(ish)实体:

  • 资源所有者 - 最终用户
  • 客户端 - 浏览器(我的网站),移动应用或类似的
  • 授权服务器 - 我的OAuth2服务器
  • 资源服务器 - 我的API。提供用户数据。

我想我已经找到了用户在我的auth服务器上创建帐户并使用该帐户登录时的流程:

  1. 用户在客户端填写用户名/密码。
  2. 客户端使用资源所有者流程连接到Auth服务器,对用户进行身份验证,并自动授权客户端。
  3. 用户将从AUth服务器重定向回客户端,并使用包含用户ID的令牌+签名JWT。
  4. 客户端将令牌保存在会话中。
  5. 客户端使用令牌+已签名的JWT用户ID从资源服务器请求数据。
  6. 资源服务器验证JWT并根据令牌范围返回数据。
  7. 我还没有测试过工作流程,但这似乎可行。但是,第三方登录已证明更加困难。这是我到目前为止所得到的:

    1. 用户点击Google / Facebook / LinkedIn登录。
    2. 用户从客户端重定向到Google的Auth服务器(不是我的)。
    3. 用户使用user / pass登录并授权客户端获取某些受保护资源(userinfo.email) - 这通过委派对用户进行身份验证。
    4. 用户被重定向回客户端,其中包含一个包含Google用户ID的令牌+签名JWT。
    5. 客户验证JWT。
    6. 客户端使用客户端凭据流连接到资源服务器。收到一个新令牌。
    7. 客户端将令牌保存在会话中。
    8. 客户请求将Google用户ID转换为应用用户ID。 (此连接是在注册期间进行的。)
    9. Resource Server返回应用程序用户ID。 (签名JWT)
    10. 客户端使用令牌+已签名的JWT用户ID从资源服务器请求数据。
    11. 资源服务器验证JWT并根据令牌范围返回数据。
    12. 这可能会奏效,但感觉非常复杂。当然必须有一种方法可以跳过这些步骤中的一些步骤?我对第8-10步特别感兴趣。据我所知,用户永远不必使用第三方登录与我的Auth服务器进行交互。问题是如何最好地将Google / Facebook / LinkedIn中成功的id_token(或其他内容)连接到我的API上的“帐户”资源。

      现在,我并不担心任何其他客户端连接到API,但它会在未来的某个时间发生。

2 个答案:

答案 0 :(得分:0)

“据我所知,用户永远不必使用第三方登录与我的Auth服务器进行交互。” 这只是部分正确。从理论上讲,您可以使用第三方登录的令牌作为您自己的令牌。因此,正常的资源请求将是:

  1. 客户请求资源 - 发送令牌(来自第三方)和登录类型(facebook / google / etc)
  2. 服务器通过使用第三方授权服务器检查令牌并返回数据来验证请求。
  3. 缺点是,每次发出请求时,您的API服务器都必须与第三方服务器通信(无论是否需要来自它们的数据)。相反,当您生成自己的令牌时,您可以获得更多控制权,并且验证请求更为简单。

    我会坚持你的工作流程。我做了类似的事情,我的步骤几乎相同。在“计算”步骤时,您还必须考虑,对于步骤2-4,您基本上不得不做任何事情,因为Google,Facebook和co已经做得很好;)

答案 1 :(得分:0)

您的问题的后期贡献。

找到此资源,解释OAuth2的使用:OAuth2 in 8 Steps