Oidc 客户端 js,不要在客户端使用 Date.now
Posted
技术标签:
【中文标题】Oidc 客户端 js,不要在客户端使用 Date.now【英文标题】:Oidc client js , don't use Date.now in client 【发布时间】:2020-04-30 05:32:39 【问题描述】:我在我的客户中使用 oidc-client-js 进行我的一个 SPA 项目。 我有一个用IdentityServer4 编写的身份服务器。
如果我手动更改服务器的日期时间,oidc-client-js 无法在登录用户中验证服务器的响应,因为日期时间不一样。
如果我手动更改客户端的日期时间并使用自动日期时间选项保留服务器,服务器的响应再次无效。
我认为任何使用日期时间的 javascript 解决方案都不可靠,所有日期时间都必须在服务器中验证。
如何在服务器而不是客户端验证令牌?
我的假设是正确的吗? 如果它不正确,oidc-client-js 是否有任何解决方案使用服务器时间而不是浏览器时间?
这是我的客户端配置
const userManagerConfig =
client_id: '58bdb6b3dd264200a1186573a8abf884',
redirect_uri: `$window.location.protocol//$window.location.hostname$window.location.port ? `:$window.location.port` : ''/authentication/callback`,
response_type: 'code',
post_logout_redirect_uri: `$window.location.protocol//$window.location.hostname$window.location.port ? `:$window.location.port` : ''`,
scope: 'openid profile phone tes.api',
authority: `http://localhost:5016`,
silent_redirect_uri: `$window.location.protocol//$window.location.hostname$window.location.port ? `:$window.location.port` : ''/authentication/silent_callback`,
automaticSilentRenew: true,
filterProtocolClaims: true,
loadUserInfo: true,
triggerAuthFlow : true
;
【问题讨论】:
【参考方案1】:时间必须正确。在服务器或客户端上,没关系,但它必须是实际时间。如果你对时间进行调整,令牌上的声明(iat、nbf 等)可能代表过去或未来的某个时刻,因此它不会起作用。
为什么要将服务器或客户端的日期/时间更改为无效的?
如何在服务器而不是客户端验证令牌?
在 SPA 上,所有与 oidc 相关的事情都发生在客户端代码中,包括对令牌的验证。
这不是客户端对令牌进行的唯一验证,也不是最重要的验证,主要验证是检查是否使用授权机构公开的公钥对进行签名。
我认为任何使用日期时间的 JavaScript 解决方案都不可靠,所有日期时间都必须在服务器中验证。
为什么更信任服务器上的时钟而不是客户端计算机上的时钟,桌面应用程序呢,离线呢...
【讨论】:
问题是,如果您网站的一位用户不同步他们的时钟,它可能会漂移。您的日常用户并不关心保持时钟同步是否有充分的技术原因。他们不在乎,他们可能不知道为什么不同步 对,那么您对这个问题提出的解决方案是什么? 此外,他们会关心使用 oauth2.0 或在顶部实现的任何服务何时停止工作。 是的,当然你是对的。或者更确切地说,制造商将移除时钟或使其很难改变时钟。同时,我的产品还不够大,即使有自己的错,也不能忽视用户的抱怨以上是关于Oidc 客户端 js,不要在客户端使用 Date.now的主要内容,如果未能解决你的问题,请参考以下文章
使用 Steam OpenId 登录(oidc-client-js)
Oidc 客户端 js:静默访问令牌更新中断,因为身份服务器身份验证 cookie 滑动到期不起作用
没有用户使用身份服务器和javascript的oidc客户端登录SilentCallback
oidc-client-js 未从 Identity Server 4 正确获取声明