【问题标题】:Use External Access Token or Local Access Token使用外部访问令牌或本地访问令牌
【发布时间】:2014-10-29 04:59:54
【问题描述】:

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

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

如果有效则

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

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

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

【问题讨论】:

  • 据我了解,您正在向 Google/Facebook 验证您的 Android/iOS 应用程序。从这些第三方服务接收到 access_token 后,您的服务器将再次使用 Google/Facebook 验证令牌。那么,第二次验证的目的是什么?它是否工作(服务器验证 Android/Facebook 访问令牌到 Google/Facebook)?我从未尝试过,但考虑到访问令牌是如何创建的,我理解起来很奇怪。
  • @Freerider,我正在使用带有承载身份验证的 OAUTH 服务器(参见上面的链接)。当用户登录时,我需要从我的 oauth 服务器生成访问令牌。

标签: asp.net-mvc asp.net-web-api oauth asp.net-identity owin


【解决方案1】:

验证您的社交提供者外部访问令牌后,您需要将此外部访问令牌与您的授权服务器(本地机构)颁发的本地访问令牌交换。这个实现的所有细节可以在这里找到:http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/ 让我知道这是否有帮助。

以下是我通过地方当局更改带有访问令牌问题的外部访问令牌所遵循的确切步骤。前端是一个 AngularJS 应用程序。您可以在此处查看演示应用程序,了解我如何使用 Facebook 访问令牌 http://ngauthenticationweb.azurewebsites.net/ 访问 Web api

1- AngularJS 应用程序通过指定 client_id、redirect_uri、response_type 向后端 API 中定义的匿名端点 (/ExternalLogin) 发送 HTTP GET 请求。

2-端点收到GET请求后,会检查用户是否被认证,假设他没有被认证,所以它会通知负责被请求的外部提供者的中间件负责调用,在我们的例子中是 Google。

3- 将显示 Google 同意屏幕,用户将提供其 Google 凭据进行身份验证。

4- Google 将回调我们的后端 API,Google 将设置一个外部 cookie,其中包含来自 Google 的身份验证结果(包含来自外部提供商的所有用户声明)。

5- Google 中间件将列出名为“已验证”的事件,我们将有机会读取 Google 设置的所有外部声明。在我们的例子中,我们将有兴趣阅读名为“AccessToken”的声明,它代表一个 Google 访问令牌,其中该声明的颁发者不是本地授权,因此我们不能直接使用此访问令牌来授权调用我们的安全后端 API 端点。

6- 然后我们将外部提供商外部访问令牌设置为名为“ExternalAccessToken”的自定义声明,Google 中间件将重定向回端点 (/ExternalLogin)。

7- 现在用户已使用外部 cookie 进行身份验证,因此我们需要检查初始请求中设置的 client_id 和 redirect_uri 是否有效,并且此客户端已配置为针对指定 URI 进行重定向。

8- 现在代码检查外部 user_id 和提供者是否已经注册为本地数据库帐户(没有密码),在这两种情况下,代码都会发出 302 重定向到 redirect_uri 参数中指定的 URI,这个 URI将包含以下(“外部访问令牌”、“具有本地帐户”、“提供者”、“外部用户名”)作为 URL 哈希片段而不是查询字符串。

9- 一旦 AngularJS 应用程序收到响应,它将根据它决定用户是否有本地数据库帐户,基于此它会向端点之一发出请求(/RegisterExternal 或 /ObtainLocalAccessToken) .两个端点都接受将用于验证的外部访问令牌,然后使用它来获取由 LOCAL AUTHORITY 颁发的本地访问令牌。此本地访问令牌可用于访问我们的后端 API 安全端点。

【讨论】:

  • 我同意这一点。对于#3,答案有点棘手。用于移动设备的 Oauth 流程不包括刷新令牌,因此无论您使用承载令牌还是访问令牌都对您没有帮助。您可能必须在您的协议中构建一些东西才能在新的不记名令牌中工作。
  • 我使用的是原生手机?来吧
  • 是一样的,看来你没有正确阅读答案。通过这种方法,您将从 SDK 获得的外部访问令牌与本地机构颁发的访问令牌进行交换。祝你好运。
  • 手机负责获取 Facebook 访问令牌,服务器将验证并生成访问令牌。这很好,但是我是否会明确获得刷新令牌。我将此标记为答案,但这仍然不是答案。
猜你喜欢
  • 2023-02-02
  • 2011-12-31
  • 2012-04-12
  • 2017-10-11
  • 2019-11-11
  • 2019-12-08
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
相关资源
最近更新 更多