针对oidc返回id_token字段的疑问
感谢作者门开发出这么棒的框架 但是我在使用中出现了一些疑问 还请解答
使用版本:
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.42.0</version>
</dependency>
<!-- Sa-Token OAuth2.0 模块 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-oauth2</artifactId>
<version>1.42.0</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jwt</artifactId>
<version>1.42.0</version>
</dependency>
涉及的功能模块:
oauth2.0+oidc
测试步骤:
- 我经过以下步骤测试: 我已按照要求添加oidc权限
@Component
public class SaOAuth2DataLoaderImpl implements SaOAuth2DataLoader {
@Override
public SaClientModel getClientModel(String clientId) {
// 此为模拟数据,真实环境需要从数据库查询
if("abm".equals(clientId)) {
SaClientModel saClientModel = new SaClientModel()
// ....
.addContractScopes("openid", "profile", "ssf.manage", "offline_access","email","oidc")
.addAllowGrantTypes("authorization_code","implicit","refresh_token","password","client_credentials")
.addAllowRedirectUris("https://*").
setClientId("abm").
setClientSecret("abm");
return saClientModel// 此处添加上签约权限:oidc
;
}
return null;
}
// 其它代码 ...
}
正常来说我访问
http://idp.xxx.com/oauth2/authorize?response_type=code&client_id=abm&redirect_uri=https://sa-token.cc&scope=openid
拿到code再访问
http://idp.xxx.com/oauth2/token?grant_type=authorization_code&client_id=abm&client_secret=abm&code=DHuFTL4UJU5qhisa6CtSviTSZZFWF4zW7kAPsucG1V2MXwNc6cHbSFWaOCeD
得出以下结果:
{
"code": 200,
"msg": "ok",
"data": null,
"token_type": "bearer",
"access_token": "BxgHVoJ52L39lz9ol3J4zjQ9YNCtoobbgsfT3N61OcYHM2YEy7rOohqd9N0B",
"refresh_token": "wZ61YQZ0nE4Nr5gWjWC7YABrMIi0w1iruAuBLmAbBSSXk32hxP2xpJwIjTd8",
"expires_in": 7200,
"refresh_expires_in": 2592000,
"client_id": "abm",
"scope": "openid",
"openid": "140e47a3f27193e835db9e8422dc4a6a"
}
此上没有id_token字段
如果我携带oidc字段
http://idp.xxx.com/oauth2/authorize?response_type=code&client_id=abm&redirect_uri=https://sa-token.cc&scope=openid,oidc
最终结果就会返回id_token
{
"code": 200,
"msg": "ok",
"data": null,
"token_type": "bearer",
"access_token": "IH0KsjGup3lTFqFpm7YnHPeuXMnQ0hKs0GZt7vWMWQGUkakPLR75DZ5iOCJC",
"refresh_token": "tzWKAVLt5eBdQMSxCkKh5lFFFQRdkmPJTvK1dFZDEfSXsMJ0t8mCeVF0k9F7",
"expires_in": 7199,
"refresh_expires_in": 2592000,
"client_id": "abm",
"scope": "openid,oidc",
"openid": "140e47a3f27193e835db9e8422dc4a6a",
"id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vaWRwLnBwZ2p4LmNvbSIsInN1YiI6IjEwMDAxIiwiYXVkIjoiYWJtIiwiZXhwIjoxNzQ2ODY4MjQxLCJpYXQiOjE3NDY4Njc2NDEsImF1dGhfdGltZSI6MTc0Njg2Njk0Nywibm9uY2UiOiJ0VXFiRzA4ek5NQWIwNXJhaXNLTVhIOWYzMWdUejJ5cSIsImF6cCI6ImFibSJ9.0pgb4OWXaz6p7cV6DSuaZMjoqIJnN7dcUGVxr9U5kvk"
}
在我询问gpt和查询文档后:
发现一个问题 gpt的回答是 需不需要使用oidc 取决于 socpe有没有携带openid 这个权限 如果携带了 就表示启用了oidc 最终拿code换token的json应该返回 openid和id_token两个字段 但事实上satoken表现的是 只有socpe写携带oidc这个权限 id_token才会返回 我不清楚是我的理解有问题 还是gpt回答的问题 还请解答 谢谢
为什么我问咨询这个问题?
因为近期我正在对接一些第三方 http://idp.xxx.com/oauth2/authorize 这个网址是由第三方去请求的 第三方请求的socpe 只携带了openid这个字段 但是他又要求返回token的时候携带id_token 但是satoken貌似是根据socpe是否携带 oidc去决定返回不返回id_token的 我也没有找到哪里可以主动决定要不要返回id_token的地方 所以就衍生了这个问题
这个取决于具体框架实现 在 sa-token 中,指定 openid 权限就会返回 openid 字段,指定 oidc 权限就会返回 id_token 字段 你的需求可以通过 自定义 Scope 权限及处理器 来解决: https://sa-token.cc/doc.html#/oauth2/oauth2-custom-scope