我正在尝试将 OAuth2 用于我正在创建的 API,但可以对流程的工作方式进行一些解释。我发现了类似的问题(例如:使用 OAuth 保护我的 REST API,同时仍然允许通过第三方 OAuth 提供程序(使用 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 用户 ID 从资源服务器请求数据。
- 资源服务器验证 JWT 并根据令牌范围返回数据。
这可能有效,但感觉非常复杂。当然必须有一种方法可以跳过其中的一些步骤?我对第 8-10 步特别感兴趣。据我所知,用户根本不需要使用第三方登录与我的身份验证服务器进行交互。问题是如何最好地将来自 Google/Facebook/LinkedIn 的成功 id_token(或其他东西)连接到我的 API 中的“帐户”资源。
现在,我并不担心任何其他客户端连接到 API,但这是将来某个时候会发生的事情。