我是OAuth 2.0
和OpenID Connect
的新手,我无法理解流程的某些部分(或者我应该使用哪些最佳做法)......
对于冗长的帖子抱歉:)
OP
(OpenID提供程序),它基本上是express
服务器,使用oauth2orize-openid
和passport
对用户进行身份验证和授权。我们称之为http://authserver.com
需要根据我的Single page application
对用户进行身份验证的OP
(react + webpack),我们称之为http://my-spa.com
由于它是SPA(由webpack静态提供),我必须使用Implicit Flow
。
用户导航到http://my-spa.com
后,会加载应用程序,然后检查localStorage
是否存在id_token
。
id_token
中localStorage
:http://authserver.com/dialog/authorize
response_type=id_token
scope=openid profile
authserver
会使用URI片段中的my-spa
重定向回id_token
id_token
存储在localStorage
中,用户可以开始使用该应用。id_token
中有localStorage
用户关闭浏览器并再次打开它。 这是我无法理解该怎么做的地方。由于已经有一个令牌(从之前的登录),我需要检查它是否有效。
这样做的最佳做法是什么?这是我认为是正确的:
http://authserver.com/dialog/authorize
:
prompt=none
id_token_hint=CURRENT_TOKEN
OP
收到此请求,它应该验证JWT签名,尝试自动批准用户并使用新的JWT重定向。让我们说一个登录用户让JWT过期,什么时候应该要求新的?什么应该触发更新?
/tokeninfo
或/userinfo
是什么?据我了解,JWT存储了识别用户所需的所有数据。不过,我见过调用/tokeninfo
或/userinfo
的示例。
如果我已经拥有sub
id,这些端点是否仅用于验证令牌(假设我只需要主题的ID)?
在OP
旁边,是否my-spa
验证JWT签名(可能是公钥)?
如果我有另一个网络服务api,请将其称为http://my-service.com/api
,需要知道哪个用户从我的SPA中调用了它,这些是我认为我需要执行的步骤:
id_token
添加为Bearer
令牌到每个ajax请求my-service.com
应该验证JWT签名(使用公钥吗?)并决定是允许还是拒绝访问受保护资源我们将不胜感激任何帮助!
答案 0 :(得分:3)
您的问题很大,我将尝试以通用方式回答所有标有?
的短语(不考虑您使用的特定框架)
加载localStorage时会出现id_token。
用户关闭浏览器并再次打开它。这样做的最佳做法是什么?
您可以选择乐观并继续使用令牌,或悲观并请求新的令牌。
如果到期时间足够长,请继续使用令牌。我假设在每个请求中都验证了令牌,因此如果令牌无效,您将收到401并且您可以申请新的
请求新令牌如果到期时间很短,或者您希望在浏览器打开您的应用程序时需要新的用户身份验证。如果要检查JWT是否仍然有效,使用auth服务器的重定向对于SPA不是用户友好的。我建议执行一个AJAX调用来验证并请求一个新令牌。
令牌在一段时间后过期
这是我上面解释的第一个案例。您可以阻止它在每个请求上或在固定的时间段(即1小时)之后发布新令牌
什么是/ tokeninfo或/ userinfo?
我不知道这些服务,但可以推断出它们的含义。 JWT已签名,因此您可以信任所包含的数据(签名仍然有效)
JWT签名验证, 在OP旁边,my-spa应该验证JWT签名(可能是公钥)吗?
您必须验证每个请求的签名。如果使用对称密钥(即HMAC),JWT将使用相同的密钥进行签名和验证。使用非对称密钥(RSA),JWT使用私钥签名并使用公钥进行验证
重新使用此令牌访问第三个服务的REST API
将id_token作为承载令牌添加到每个ajax请求
正确,通常使用授权标题
my-service.com应验证JWT签名(使用公钥?)并决定是允许还是拒绝访问受保护资源
当然,任何使用JWT的服务都必须验证签名。外部服务不拥有私钥,因此在这种情况下需要使用不对称密钥。您需要发布公钥,以便外部服务可以验证令牌