如何在多个OAuth2提供程序上验证客户端?

and*_*fsp 8 authentication restful-authentication oauth oauth-2.0 facebook-login

我的REST API(api.example.com)目前是OAuth2提供商,并且一直是移动应用程序的支持.

最近我们创建了一个新的网站(www.example.com),它将像任何其他客户一样对待.Web可以使用密码grant_type在API上进行身份验证,其中用户键入其凭据.从那里,客户端(浏览器)获取访问令牌,并且可以使用API​​.

问题在于我们想要使用Facebook在网页上验证客户端.

所以基本上,网络最终应该能够通过Facebook登录获得用户访问令牌来访问API.

我环顾四周,看过两条腿和三条腿的OAuth2认证方案,但是:

  • 这对我刚刚描述的场景有何影响?
  • 这样做的正确方法是什么?
  • 我应该考虑哪些安全问题?

and*_*fsp 5

这是解决此问题的一种方法:

当客户端使用 facebook 进行身份验证时,在移动设备上使用他们的 SDK 或例如在 web 上使用授权方法,它将获得一个 facebook 访问令牌。

如果您的 API 也是 OAuth2 提供者,并且您想使用刚刚获得的 facebook 令牌登录客户端(发出访问令牌),则可以使用扩展授权(https://tools.ietf.org/html/ rfc6749#section-4.5)。

在这里,与 OAuth2 具有 password_grant 类型的方式相同,您可以创建一个名为 facebook_access_token_grant 的扩展授权,并将该 facebook 令牌发送到 API。如果令牌有效,则 API 会发出一个应用程序访问令牌,客户端可以在后续请求中使用该令牌。

步骤是:

  • 1 - 客户端从 facebook 获取访问令牌。在移动设备上将使用 Facebook SDK,在网络应用程序上可以使用 javascript 登录或使用授权方法将浏览器重定向到 Facebook 等等。

  • 2 - 获取 facebook 访问令牌后,客户端通过发布从 API 请求访问令牌:

POST /token HTTP/1.1
主机:server.example.com
内容类型:application/x-www-form-urlencoded

    client_id={{ client_id }}&client_secret={{ client_secret }}&grant_type=facebook_access_token&facebook_access_token={{ TOKEN }}
Run Code Online (Sandbox Code Playgroud)

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"API_ACCESS_TOKEN",
  "username":"theuser",
  "expires_in":3600,
  "refresh_token":"API_REFRESH_TOKEN",
}
Run Code Online (Sandbox Code Playgroud)
  • 4 - 客户端在对 API 的后续调用中使用该令牌。

GET /some_endpoint HTTP/1.1
主机:server.example.com
授权:承载 API_ACCESS_TOKEN

确保通过安全连接 (TLS) 执行所有这些操作,以免违反https://tools.ietf.org/html/rfc6749#section-1.6,并且所有这些都应符合 OAuth2 协议。