使用外部访问令牌或本地访问令牌。

8

我正在使用ASP.NET MVC 5.2.2,Web API 2.2和Katana/OWIN 3.0开发应用程序。该应用程序使用ASP.NET Identity 2.1进行本地帐户和数据库管理。

我使用OAuth授权服务器生成访问和刷新令牌。我有Android和IOS应用程序,这些应用程序使用我的本地oauth授权服务器。Android和IOS应用程序使用SDK与Facebook、Google等登录。之后,应用程序将发送(Facebook/Google等)访问令牌到服务器。服务器将使用Facebook/Google等验证访问令牌。

如果有效,则:

1)我是否应为所有未来的请求生成新的本地访问令牌(在Auth标头中)给应用程序?

2)应用程序是否应每次向我发送Facebook/Gmail等访问令牌(在Auth标头中),并且服务器每次都要验证访问令牌与Facebook/Gmail等?

3)如果本地访问令牌过期,则服务器将使用刷新令牌生成新的访问令牌。在此期间,服务器是否应更新访问令牌以及刷新令牌,或者只更新访问令牌就足够了?


据我所知,您正在对您的Android/iOS应用进行Google/Facebook身份验证。在从这些第三方服务接收到access_token之后,您的服务器将再次使用Google/Facebook验证令牌。那么,这第二次验证的目的是什么?它是否有效(服务器验证Android/Facebook访问令牌是否有效)?我从未尝试过,但考虑到访问令牌的创建方式,这对我来说相当奇怪。 - Xavier Egea
@Freerider,我正在使用带有Bearer身份验证的OAUTH服务器(请参见上面的链接)。当用户登录时,我需要从我的oauth服务器生成访问令牌。 - Imran Qadir Baksh - Baloch
1个回答

16

在验证社交提供者的外部访问令牌之后,您需要使用由授权服务器(本地授权机构)颁发的本地访问令牌来交换此外部访问令牌。有关此实现的所有详细信息可以在此处找到: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安全终点。


我同意这个观点。对于问题#3,答案有点棘手。移动设备的Oauth流程不包括刷新令牌,因此无论您使用令牌还是访问令牌都无法帮助您。您可能需要在协议中构建一些内容以适应新的令牌。 - Philip Nelson
我正在使用原生移动应用?加油! - Imran Qadir Baksh - Baloch
看起来都一样,似乎你没有正确阅读回答。使用这种方法,您将使用本地机构发布的访问令牌与从SDK获取的外部访问令牌进行交换。祝你好运。 - Taiseer Joudeh
1
移动设备负责获取Facebook访问令牌,服务器将验证并生成访问令牌。这很好,但我如何显式地获取刷新令牌?我标记它为答案,但这仍然不是一个答案。 - Imran Qadir Baksh - Baloch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接