我正在尝试使用我的javascript客户端应用程序实现OAuth。 我已经启动并运行了服务器。
我的工作流程如下:
我不确定如何实现第2点。我明白我需要再次调用服务器,但验证端点在哪里? 我只有/ authorize,/ user和/ logout
此外,请求应如何形成?我是否将令牌作为GET参数附加,那就是全部? 如果有人截获有效的令牌怎么办?
答案 0 :(得分:2)
取决于您的应用程序,但由于您有一个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应用程序可以提取访问令牌并将其存储在某个位置。
我知道我需要再次调用服务器 但验证端点在哪里?我只有/授权/用户 和/ logout
您的授权服务器需要令牌验证端点。 Web应用程序将使用此端点来验证所述令牌(您存储在某处的令牌,例如localStorage
)。当使用访问令牌调用此端点并且证明令牌有效时,用户可以继续,否则用户将被重定向到授权服务器。如果用户已经与授权服务器建立了会话,则将立即使用新的访问令牌重定向用户,否则用户需要首先进行身份验证(登录)。
此外,请求应如何形成?我是否将令牌作为GET附加 参数和那就是全部?
有些人使用访问令牌发送GET请求作为url查询参数,其他人发送带有访问令牌的POST请求作为请求正文的有效负载。
如果有人拦截有效令牌怎么办?
始终使用https
,您的访问令牌应在有限的时间内有效。
要记住的一点是,因为您的应用程序无法保密凭证,您需要实施Implicit Grant
,这意味着当授权服务器授权Web应用程序时,您立即收到访问令牌客户端ID和域。与Client Credentials Grant
相反,您首先收到需要交换访问令牌的Authorization Code
。使用Implicit Grant
时,您无法使用Refresh Tokens
。这意味着用户需要通过授权服务器完成整个流程以获取新的访问令牌。但这并不是什么大问题,因为用户已经使用授权服务器登录,导致立即重定向,因此在Web应用程序中正确实现时,用户将不会注意到。
这只是大致覆盖它,它确实帮助我(我建议你)阅读OAuth 2.0 spec。希望这能帮到你一点点,OAuth是一个复杂的主题!