refresh - 使用授权类型代码时silent_redirect_uri 是否已过时
问题描述
我有一个关于刷新访问令牌的问题。
我正在使用具有以下配置的 IdentityServer 4.1.2:
new Client
{
ClientId = "myid",
AllowedGrantTypes = GrantTypes.Code,
RequireClientSecret = false,
AccessTokenLifetime = 3600,
RequirePkce = true,
AllowOfflineAccess = true,
...
}
如您所见,我没有使用已弃用的隐式流程,但授权类型设置为代码
我的 SPA 客户端使用 oidc-client 版本 1.11.5,配置如下:
var config = {
...
redirect_uri: `https://myspaurl/callback`,
response_type: 'code',
scope: 'openid profile offline_access',
automaticSilentRenew: true,
silent_redirect_uri: `https://myspaurl/static/silent-renew.html`,
...
};
请注意,我要求的是offline_access范围,因此我可以获得刷新令牌。
当我运行应用程序时,访问令牌每小时都会更新一次。在 Chrome 开发人员工具的网络选项卡中,我可以看到访问令牌正在使用此请求 url https://myidentityserver/connect/token 进行更新。我的silent_redirect_uri https://myspaurl/static/silent-renew.html 从未被请求过。所以我的问题是,当使用授权类型代码而不是旧的隐式流时,silent_redirect_uri 是否已过时?
解决方案
如果 oidc 客户端可以获得刷新令牌,它将使用该令牌,而不是尝试使用静默重定向 URI。接下来考虑这些操作:
- 用户重新加载页面
- 用户打开新的浏览器选项卡/窗口
如果在重新加载期间 RT 不可用,则 oidc 客户端将回退到静默重定向 URI 行为。
多标签浏览可以使用刷新令牌的唯一方法是将 RT(长期存在的凭据)存储在本地存储中。然后,您将拥有一个可靠的应用程序。
请注意,在隐藏或框架上使用静默重定向 URI 在 Safari 浏览器中不起作用,因为它会丢弃第三方 cookie。预计其他浏览器也会效仿。因此,在 2021 年确实不推荐在隐藏的 iframe 上更新令牌。
安全
问题还没有结束:
- 绝对不建议将 RT 存储在本地存储中用于中等或高安全性应用程序 - 即使使用旋转刷新令牌
2021 年的建议是将刷新令牌存储在高度加密的 HTTP Only SameSite=strict cookie 中。这被称为前端模式的后端。
这很棘手,但值得注意——也许是未来的目标。另请注意,oidc 客户端现在是一个存档项目。
推荐阅读
- javascript - 空复选框上的 Javascript“空”验证消息
- r - 使用 if else 条件将模型拟合到分组数据
- angular - 具有多个插入的 rxjs 运算符
- android - 使用适用于 Android 的柯南配置文件构建 Poco C++ 库
- io - 如何在不分配字符串的情况下将 Rust 整数类型转换为其字符串表示形式?
- django - Django获取集合中对象多对多字段的计数
- google-cloud-platform - 无法通过 gsutil 将文件 cp 到 Google 对象存储
- java - 将第一个单词移到最后一个单词,同时将第一个单词更改为小写
- python - 通过应用 Python 使用函数
- java - 应用程序启动方法 java.lang.reflect.InvocationTargetException Javafx fxml 中的异常