✅已解决 | 认证地址回调不返回refresh_token

我想实现单点登录,流程如下:
1,跳转到“认证地址”。(产品里的)
2,在认证地址登录成功。
3,认证地址回调到我自己的网站。
4,获取的参数里没有refresh_token。

为什么没有refresh_token ?

您好,token 接口返回 refresh_token 字段需要 scope 参数里有 offline_access;具体参考链接如下:
https://docs.authing.cn/v2/concepts/oidc-common-questions.html#scope-参数对应的用户信息

Scope 添加了offline_access,是会返回refresh_token。但是登录的时候会有“授权提示窗口”。

我就想实现单点登录,不想要授权提示窗口。

您好,如果不需要“授权提示”,可以在 console 控制台 - 应用 - 高级配置里关闭「应用授权页面」

这个地方一直是关闭的。

我再梳理一下:
1,我想要实现单点登录,结果发现没有refresh_token;
2,你们说需要在scope里加上offline_access;于是可以获取到refresh_token,但是多出来一个“授权窗口”;
3,随后说是在产品里关闭“授权页”,我看了一下一直都是关闭状态。

你们可以自己测试一下,再回复我。(也可能产品设计上就这样,只是我不能理解)

若认证时需要获取到 refresh_token 则必须每次让用户确认授权, 这是 OIDC 协议规范要求。
若认证时不需要获取到 refresh_token 则默认不提示「确认授权」,可以在控制台中手动开启或关闭。

谢谢您的回复。

那么单点登录应该用什么协议?
用OIDC 协议,如果没有refresh_token,access_token就无法刷新;如果有refresh_token 就会有授权提示窗口(但这样还得让用户多点一下才行)

还有几个问题:
1,我看了OIDC 协议规范,里面只要求传入openid 就可以返回refresh_token了,为什么你们的需要传入scope=offline_access 和 prompt=consent?
2,OAuth2.0 是授权协议,授权协议里弹出“授权窗口”完全没有毛病,但是OIDC 不是认证协议嘛,为什么还要弹出“授权窗口”?
3,OIDC 协议里似乎也没有规定要弹出“授权窗口”呀?其次获取“refresh_token” 这个难道还要用户授权?(refresh_token本身是刷新access_token的,对于用户来讲不透明,用户又怎么授权?)

如果您不想弹出「授权提示窗口」,建议您直接使用 access_token 实现 SSO,Authing access_token 默认过期时间是 14 天,14 天后 access_token 过期需要用户重新登录,当然这个过期时间您可以自行在控制台中调整。

1.OIDC 协议中是有此规范的,您可参考下图


2.OIDC 是在 OAuth2.0 基础上加了 认证 实现的,本质就是 授权+认证。

1 个赞

1,access_token 我想设置的短一些(为了提高安全性),然后通过refresh_token来刷新就很有必要了,然而获取refresh_token 会有弹窗。
2,用access_token 来实现SSO(单纯的access_token 不能表示是那个用户登录的吧)。
3,除了scope里加offline_access 来获取refresh_token,还有其它能获取refresh_token的方式吗?

您好,对于 refresh_token 获取问题,目前只能通过 scope 参数方式来获取

那实现我想要的那种单点登录的最佳实践是什么?

我们已经了解您的使用场景,并研究解决方案,目前部分工程师春节休假了,节后第一时间给您回复