我的REST API(api.example.com)目前是OAuth2提供商,并且一直是移动应用程序的支持。
最近我们创建了一个新的网站(www.example.com),它将被视为与任何其他客户端一样。网络可以使用 密码grant_type 在API中进行身份验证,其中用户输入其凭据。从那里,客户端(浏览器)获取访问令牌,并且可以使用API。
问题在于我们想要使用Facebook在网页上验证客户端。
基本上,网络最终应该能够通过Facebook登录获取用户访问令牌来访问API。
我环顾四周,看过两条腿和三条腿的OAuth2认证方案,但是:
答案 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", }
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)
您必须同时登录用户,然后使用电子邮件
连接它们