Sa-Token icon indicating copy to clipboard operation
Sa-Token copied to clipboard

针对oidc返回id_token字段的疑问

Open xujimu opened this issue 7 months ago • 1 comments

感谢作者门开发出这么棒的框架 但是我在使用中出现了一些疑问 还请解答

使用版本:

    <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回答的问题 还请解答 谢谢

Image

为什么我问咨询这个问题?

因为近期我正在对接一些第三方 http://idp.xxx.com/oauth2/authorize 这个网址是由第三方去请求的 第三方请求的socpe 只携带了openid这个字段 但是他又要求返回token的时候携带id_token 但是satoken貌似是根据socpe是否携带 oidc去决定返回不返回id_token的 我也没有找到哪里可以主动决定要不要返回id_token的地方 所以就衍生了这个问题

xujimu avatar May 10 '25 09:05 xujimu

这个取决于具体框架实现 在 sa-token 中,指定 openid 权限就会返回 openid 字段,指定 oidc 权限就会返回 id_token 字段 你的需求可以通过 自定义 Scope 权限及处理器 来解决: https://sa-token.cc/doc.html#/oauth2/oauth2-custom-scope

click33 avatar May 10 '25 12:05 click33