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

时间:2014-04-22 16:00:52

标签: authentication oauth oauth-2.0 facebook-login restful-authentication

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

当客户使用他们的SDK在移动设备上进行身份验证时,或者使用authorize方法在网络上进行身份验证时,它将获得一个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 /令牌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 }}
  

HTTP / 1.1 200 OK
   Content-Type:application / json; charset = UTF-8
   缓存控制:无存储
   Pragma:no-cache

{
  "access_token":"API_ACCESS_TOKEN",
  "username":"theuser",
  "expires_in":3600,
  "refresh_token":"API_REFRESH_TOKEN",
}
  • 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协议。

答案 1 :(得分:-4)

您必须同时登录用户,然后使用电子邮件

连接它们