在验证社交提供者的外部访问令牌之后,您需要使用由授权服务器(本地授权机构)颁发的本地访问令牌来交换此外部访问令牌。有关此实现的所有详细信息可以在此处找到:http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/ 如果有帮助,请告诉我。
这是我遵循的确切步骤,用以通过本地授权机构颁发的访问令牌更改外部访问令牌。前端是AngularJS应用程序。您可以在此处检查演示应用程序,并查看我如何使用Facebook访问令牌访问Web API:http://ngauthenticationweb.azurewebsites.net/
1- AngularJS应用程序通过指定client_id、redirect_uri和response_type向匿名端点(/ExternalLogin)发送HTTP GET请求,该端点在我们的后端API中定义。
2- 一旦端点接收到GET请求,它将检查用户是否已经通过身份验证,并且假设他尚未通过身份验证,因此它将通知负责所请求的外部提供者的中间件来处理此调用,在我们的例子中是Google。
3- 将显示Google的同意屏幕,并要求用户提供其Google凭据以进行身份验证。
4- Google将回调我们的后端API并设置一个包含来自Google的身份验证结果(包含用户的所有外部提供程序声明)的外部Cookie。
5- Google中间件将侦听名为“Authenticated”的事件,我们将有机会读取Google设置的所有外部声明。在我们的情况下,我们将有兴趣读取名为“AccessToken”的声明,该声明表示Google访问令牌,其中此声明的发行方不是本地授权机构,因此我们无法直接使用此访问令牌来授权对我们安全的后端API端点的调用。
6- 然后,我们将外部提供程序的外部访问令牌设置为自定义声明名为“ExternalAccessToken”,并且Google中间件将重定向回端点(/ExternalLogin)。
7- 现在用户使用外部cookie进行身份验证,因此我们需要检查最初请求中设置的client_id和redirect_uri是否有效,并且该客户端已配置为重定向到指定的URI。
8- 现在代码会检查外部user_id以及提供者是否已经注册为本地数据库账户(没有密码),在两种情况下,代码都将发出302重定向到redirect_uri参数中指定的URI,在该URI中,URL哈希片段将包含以下内容(“External Access Token”,“Has Local Account”,“Provider”,“External User Name”)而不是查询字符串。
9- 一旦AngularJS应用程序接收到响应,它将根据响应来决定用户是否具有本地数据库帐户,基于此,它将向一个终点之一(/RegisterExternal或/ObtainLocalAccessToken)发出请求。这两个终点都接受外部访问令牌,该令牌将用于验证,然后使用它来获取由LOCAL AUTHORITY发布的本地访问令牌。该本地访问令牌可用于访问我们的后端API安全终点。