客户端应用程序和令牌身份验证/验证 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的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置
OAuth2RestOperations 使用从请求标头获取的令牌,而不是请求身份验证服务器