我正在尝试将OAuth2用于我正在创建的API,但可以使用一些解释流程如何工作.我发现了类似的问题(例如:使用OAuth保护我的REST API,同时仍然允许通过第三方OAuth提供商进行身份验证(使用DotNetOpenAuth))但是他们并没有明确第三方登录.
我不希望使用OpenID(但是,无论如何),特别是当通过委派进行身份验证可能正常工作时.它似乎过于复杂,并没有很多支持良好的库.(我正在使用PHP + Laravel 4)
问题分为4个(ish)实体:
- 资源所有者 - 最终用户
- 客户端 - 浏览器(我的网站),移动应用程序或类似的
- 授权服务器 - 我的OAuth2服务器
- 资源服务器 - 我的API.提供用户数据.
我想我已经找到了用户在我的auth服务器上创建帐户并使用该帐户登录时的流程:
- 用户在客户端填写用户名/密码.
- 客户端使用资源所有者流连接到Auth服务器,对用户进行身份验证,并自动授权客户端.
- 用户将从AUth服务器重定向回客户端,并使用包含用户ID的令牌+签名JWT.
- 客户端将令牌保存在会话中.
- 客户端使用令牌+签名的JWT用户ID从资源服务器请求数据.
- 资源服务器验证JWT并根据令牌范围返回数据.
我还没有测试过工作流程,但这看起来似乎有效.但是,第三方登录已证明更加困难.这是我到目前为止所得到的:
- 用户点击Google/Facebook/LinkedIn登录.
- 用户从客户端重定向到Google的Auth服务器(不是我的).
- 用户使用user/pass登录并授权客户端获取某些受保护资源(userinfo.email) - 这通过委派对用户进行身份验证.
- 用户被重定向回客户端,使用包含Google用户ID的令牌+签名JWT.
- 客户验证JWT.
- 客户端使用客户端凭据流连接到资源服务器.收到一个新令牌.
- 客户端将令牌保存在会话中.
- 客户端请求将Google用户ID转换为应用程序用户ID.(此连接是在注册期间进行的.)
- Resource Server返回应用程序用户标识.(签名JWT)
- 客户端使用令牌+签名的JWT用户ID从资源服务器请求数据.
- 资源服务器验证JWT并根据令牌范围返回数据.
这可能有用,但感觉非常复杂.当然必须有一种方法可以跳过这些步骤中的一些步骤?我对第8-10步特别感兴趣.据我所知,用户永远不必使用第三方登录与我的Auth服务器进行交互.问题是如何最好地将Google/Facebook/LinkedIn中成功的id_token(或其他内容)连接到我的API上的"帐户"资源.
现在,我并不担心任何其他客户端连接到API,但它会在未来的某个时间发生.