JavaScript应用程序应如何验证由IdentityServer4发出的access_token?
问题描述:
例如,假设我想确定一个用户是否仍然“登录”...他们的令牌还没有过期。JavaScript应用程序应如何验证由IdentityServer4发出的access_token?
当我第一次发布access_token时,我在localStorage中存储了我的JWT access_token。我知道仅仅检查localStorage来查看access_token是否存在是不够的。我读了关于自省的结束点,但这似乎是API的 - 而不是JS客户端。使用客户端库进行JWT验证是最佳方法吗?我不喜欢这个,因为我有可能需要切换到引用令牌。我想打电话给服务器端。
使用JavaScript客户端验证access_token的正确方法是什么?
更新: 经进一步调查,并与来自leastprivilege意见,我将使用OIDC JavaScript client所以我并不需要担心这个。
答
客户端应用程序不应该“解码”访问令牌。确切的格式是发行者和API之间的实现细节。
当请求访问令牌时,令牌响应包含一个'expires_in'参数,告诉客户端令牌有效的秒数。
答
大多数jwt令牌都带有过期时间字段(取决于服务器)。您可以使用类似this的库来解码JWT令牌,然后将其保存到本地存储中,然后使用令牌保存到期时间,以便您可以检查本地存储和到期时间,以及当前日期是否大于到期时间,您放弃以前的令牌并获得一个新的令牌。
因此,如果我使用JavaScript构建UI,并且需要在每个视图加载之前确定是否需要新的令牌(并且因此用户需要被重定向到登录页面),我可以检查'expires_in'或如果有一种前端处理程序会在我的API返回401时将用户重定向到登录页面,会更好吗?当然,这肯定是一种常见的情况 –
使用像https://github.com/IdentityModel/oidc-client-js这样的库,它会为您进行生命周期监控并在后台处理续订。另请参阅https://vimeo.com/205451987 – leastprivilege
仅供参考 - 在我决定使用OIDC Js客户端之前,我正在关注客户端应用程序的这个示例。 https://github.com/IdentityServer/IdentityServer3.Samples/blob/master/source/Clients/JavaScriptImplicitClient%20Manual/index.html#L144 –