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认证方案,但是:
这是解决此问题的一种方法:
当客户端使用 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-urlencodedRun Code Online (Sandbox Code Playgroud)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
Cache-Control: no-store
Pragma: no-cacheRun Code Online (Sandbox Code Playgroud){ "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 协议。