【发布时间】:2013-07-25 02:50:03
【问题描述】:
我正在尝试将 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 服务器重定向回客户端,并带有包含用户 ID 的 Token + 签名 JWT。
- 客户端将令牌保存在会话中。
- 客户端使用令牌 + 签名的 JWT 用户 ID 向资源服务器请求数据。
- 资源服务器验证 JWT 并根据令牌范围返回数据。
我还没有测试过工作流程,但这似乎可以工作。然而,事实证明第三方登录更加困难。这是我到目前为止所得到的:
- 用户点击使用 Google/Facebook/LinkedIn 登录。
- 用户从客户端重定向到谷歌的身份验证服务器(不是我的)。
- 用户使用 user/pass 登录并授权客户端获取一些受保护的资源 (userinfo.email) - 这通过委托对用户进行身份验证。
- 用户被重定向回客户端,并使用包含 Google 用户 ID 的 Token + 签名 JWT。
- 客户端验证 JWT。
- 客户端使用客户端凭据流连接到资源服务器。收到新令牌。
- 客户端将令牌保存在会话中。
- 客户端请求将 Google 用户 ID 转换为应用程序用户 ID。 (此连接是在注册期间建立的。)
- 资源服务器返回应用程序用户 ID。 (已签名 JWT)
- 客户端使用令牌 + 签名的 JWT 用户 ID 向资源服务器请求数据。
- 资源服务器验证 JWT 并根据令牌范围返回数据。
这可能有效,但感觉非常复杂。当然必须有一种方法可以跳过其中的一些步骤?我对第 8-10 步特别感兴趣。据我所知,用户根本不需要使用第三方登录与我的身份验证服务器进行交互。问题是如何最好地将来自 Google/Facebook/LinkedIn 的成功 id_token(或其他东西)连接到我的 API 中的“帐户”资源。
现在,我并不担心任何其他客户端连接到 API,但这是将来某个时候会发生的事情。
【问题讨论】:
-
我认为这些 API 中的任何一个都不会提供用户的电子邮件。因此,您可能没有唯一的 ID 来对多个社交帐户登录进行分组。您可以做的是要求用户在通过 API 进行身份验证后输入他们的详细信息。对于您的 API,我建议使用 OAuth2 API 框架。他们把所有东西都内置在里面,这会让你有更多的时间去担心其他事情。 :)
标签: php api rest oauth-2.0 laravel-4