验证您的社交提供者外部访问令牌后,您需要将此外部访问令牌与授权服务器(本地管理机构)颁发的本地访问令牌交换。这个实现的所有细节可以在这里找到:http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/ 让我知道这是否有帮助。
以下是我通过Local Authority更改外部访问令牌时出现访问令牌问题的确切步骤。前端是一个AngularJS应用程序。您可以在这里查看演示应用程序,并了解我如何使用Facebook访问令牌访问Web API http://ngauthenticationweb.azurewebsites.net/
1- AngularJS应用程序向我们的后端API中定义的匿名终端(/ ExternalLogin)发送HTTP GET请求指定client_id,redirect_uri,response_type。
2-终端接收到GET请求后,会检查用户是否已通过身份验证,并假设他未通过身份验证,因此它会通知负责请求外部提供商的中间件负责这个电话,在我们的例子中是Google。
3-将显示Google的同意屏幕,用户将提供他的Google凭据进行身份验证。
4-谷歌会回调我们的后端API,谷歌会设置一个外部cookie,其中包含来自Google的认证结果(包含来自外部提供商的所有用户声明)。
5- Google中间件将列出名为“Authenticated”的事件,我们将有机会阅读由Google设置的所有外部声明。在我们的案例中,我们有兴趣阅读代表Google Access令牌的名为“AccessToken”的声明,此声明的发行者不是LOCAL AUTHORITY,因此我们不能直接使用此访问令牌来授权对我们的安全后端API端点。
6-然后我们将外部提供商外部访问令牌设置为名为“ExternalAccessToken”的自定义声明,Google中间件将重定向回终点(/ ExternalLogin)。
7-现在,用户使用外部cookie进行身份验证,因此我们需要检查初始请求中设置的client_id和redirect_uri是否有效,并将此客户端配置为重定向指定的URI。
8-现在代码检查外部user_id是否与提供者一起已经注册为本地数据库帐户(无密码),在这两种情况下代码都会发出302重定向到redirect_uri参数中指定的URI,this URI将包含以下内容(“外部访问令牌”,“有本地帐户”,“提供者”,“外部用户名”)作为URL哈希片段而不是查询字符串。
9-一旦AngularJS应用程序收到响应,它会根据它来决定用户是否拥有本地数据库帐户,基于此将向其中一个端点发出请求(/ RegisterExternal或/ ObtainLocalAccessToken )。两个端点都接受将用于验证的外部访问令牌,然后使用它来获取由LOCAL AUTHORITY发布的本地访问令牌。这个本地访问令牌可以用来访问我们的后端API安全端点。
据我所知,您正在向Google/Facebook验证您的Android/iOS应用程序。从这些第三方服务接收到access_token后,您的服务器将再次使用Google/Facebook验证令牌。那么,第二次验证的目的是什么?它是否正在运行(服务器验证Android/Facebook访问令牌给Google/Facebook)?我从来没有尝试过,但考虑到访问令牌是如何创建的,我理解它很奇怪。 – 2014-09-08 22:00:18
@Freerider,我正在使用承载认证使用OAUTH服务器(请参阅上面的链接)。当用户登录时,我需要从oauth服务器生成一个访问令牌。 – user960567 2014-09-09 05:58:22