客户端应用程序和令牌身份验证/验证 OAuth

Posted

技术标签:

【中文标题】客户端应用程序和令牌身份验证/验证 OAuth【英文标题】:Client application and token authentication/validation OAuth 【发布时间】:2015-11-03 14:15:37 【问题描述】:

我正在尝试使用我的 javascript 客户端应用程序实现 OAuth。 我已经启动并运行了服务器。

我的工作流程如下:

打开应用 检查令牌是否存在 验证令牌 如果不存在或无效,请转到 oauth 服务器获取令牌 回到应用程序并重复 2 和 3 我一切正常,显示我的应用程序

我不确定如何实施第 2 点。我知道我需要为此再次调用服务器,但验证端点在哪里? 我只有 /authorize、/user 和 /logout

另外应该如何形成请求?我是否将令牌作为 GET 参数附加,仅此而已? 如果有人拦截了有效的令牌怎么办?

【问题讨论】:

第一个问题。 Oauth 是一个很大的痛苦。检查Oauth bible 和Oauth for dummies,因为他们帮助了我。 【参考方案1】:

取决于您的应用程序,但由于您有一个 javascript Web 应用程序,很可能无法对其凭据保密,因此您需要按照 OAuth 2.0 规范中的说明实现 Implicit Grant。但是,如果您的应用程序可以对其凭据保密,您应该实现 Client Credentials Grant(服务器端应用程序),因为它更安全。

我不确定如何实施第 2 点

您应该将访问令牌存储在 Web 应用程序的某个位置,例如 localStorage

用户第一次访问您的 Web 应用程序时,该用户将没有访问令牌,也没有与您的授权服务器的会话。您的 Web 应用程序可以通过执行以下操作来查看您是否有访问令牌:

if (!localStorage.getItem('accessToken') 
  window.location.replace('https://your-authorization-server/authorize?response_type=token&client_id=<CLIENT_ID>&redirect_uri=<CALLBACK_URL>&scope=<SCOPE>');

如果没有访问令牌,您需要重定向到您的授权服务器,以便用户可以使用授权服务器登录。用户登录后,授权服务器将使用有效的访问令牌将用户重定向回您的 Web 应用程序(在用户授予您的 Web 应用程序喜欢代表该用户访问的任何资源的权限后)。此访问令牌必须公开为名为 access_token 的哈希片段,即:

https://web-app.com#access_token=123456789X

现在您的 Web 应用程序可以提取访问令牌并将其存储在某处。

我知道我需要为此再次调用服务器 但是验证端点在哪里?我只有 /authorize, /user 和/注销

您的授权服务器需要一个令牌验证端点。您的 Web 应用程序将使用此端点来验证所述令牌(您存储在某处的令牌,例如 localStorage)。当使用访问令牌调用此端点并且证明令牌有效时,用户可以继续,否则用户将被重定向到授权服务器。如果用户已经与授权服务器进行了会话,则用户将立即使用新的访问令牌重定向回来,否则用户需要先进行身份验证(登录)。

另外应该如何形成请求?我是否将令牌附加为 GET 参数仅此而已?

有些发送带有访问令牌作为 url 查询参数的 GET 请求,有些发送带有访问令牌作为请求正文负载的 POST 请求。

如果有人拦截了有效令牌怎么办?

始终使用https,并且您的访问令牌应该在有限的时间内有效。

需要记住的是,由于您的应用程序无法对其凭据保密,因此您需要实现Implicit Grant,这意味着当授权服务器根据客户端 ID 授权 Web 应用程序时,您会立即收到访问令牌和域。与Client Credentials Grant 不同,您首先会收到需要交换访问令牌的Authorization Code。使用Implicit Grant 时,不能使用Refresh Tokens。这意味着用户需要通过授权服务器的整个流程来获取新的访问令牌。但这并不是什么大问题,因为用户已经使用授权服务器登录,从而导致立即重定向,因此在 Web 应用程序中正确实施时,用户不会注意到。

这只是粗略的介绍,它确实帮助我(我建议你)阅读OAuth 2.0 spec。希望这对您有所帮助,OAuth 是一个复杂的主题!

【讨论】:

谢谢,事实证明我确实有一个验证端点。默认情况下无法访问:对于那些有类似问题的人,我在这里找到了答案:***.com/questions/26750999/…

以上是关于客户端应用程序和令牌身份验证/验证 OAuth的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OAuth 资源服务器中验证访问令牌

让 Apigee 为客户端做身份验证(oauth)

Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置

OAuth2RestOperations 使用从请求标头获取的令牌,而不是请求身份验证服务器

处理 OAuth 2.0 身份验证 - 在 ASP.NET MVC 应用程序中获取令牌重定向令牌响应

Node Express - 身份验证令牌的存储和检索