如何在WSO2 Identity Server 6.0.0的Access Token中添加自定义字段?
在WSO2 Identity Server 6.0.0中为OAuth2 Access Token添加自定义字段
WSO2 Identity Server 6.0.0支持通过配置或自定义扩展两种方式,为/oauth2/token返回的JWT格式Access Token添加额外字段,以下是具体实现指引:
方式一:通过配置直接添加用户属性(无需编码)
如果要添加的是用户已存的属性(如邮箱、手机号、自定义用户字段),可直接修改配置文件实现:
- 打开IS安装目录下的
repository/conf/deployment.toml文件 - 添加以下配置,指定需要注入到Access Token的用户属性URI:
[oauth.extensions] claim_dialect = "http://wso2.org/claims" access_token_claims = ["http://wso2.org/claims/emailaddress", "http://wso2.org/claims/mobile", "http://wso2.org/claims/custom_field"]
注:属性URI可在IS管理控制台的Claims > List页面中查看对应属性的完整URI。
- 重启WSO2 Identity Server,后续获取的Access Token将自动包含指定的用户属性字段。
方式二:通过自定义扩展添加动态字段(复杂场景适用)
如果需要添加的字段需要自定义逻辑处理(如拼接字段、从第三方数据源取值),可通过实现Token发行器接口扩展:
- 创建Java类,实现
org.wso2.carbon.identity.oauth2.token.OAuth2TokenIssuer接口,重点重写createAccessToken方法处理JWT Token的字段注入:
import org.wso2.carbon.identity.oauth2.token.OAuth2TokenReqMessageContext; import org.wso2.carbon.identity.oauth2.token.OAuth2TokenIssuer; import org.wso2.carbon.identity.oauth2.token.DefaultOAuth2TokenIssuer; import org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception; import org.wso2.carbon.user.api.User; import java.util.Map; public class CustomTokenIssuer implements OAuth2TokenIssuer { @Override public String createIDToken(OAuth2TokenReqMessageContext tokReqMsgCtx) throws IdentityOAuth2Exception { // 如需修改ID Token可在此处理,否则调用默认实现 return new DefaultOAuth2TokenIssuer().createIDToken(tokReqMsgCtx); } @Override public String createAccessToken(OAuth2TokenReqMessageContext tokReqMsgCtx) throws IdentityOAuth2Exception { DefaultOAuth2TokenIssuer defaultIssuer = new DefaultOAuth2TokenIssuer(); // 先获取默认生成的Token String accessToken = defaultIssuer.createAccessToken(tokReqMsgCtx); // 判断当前生成的是JWT格式的Bearer Token if ("bearer".equals(tokReqMsgCtx.getOauth2AccessTokenReqDTO().getTokenType()) && "JWT".equals(tokReqMsgCtx.getAccessTokenIssuerProperties().get("token_type"))) { // 获取当前授权用户信息及现有Claims User authorizedUser = tokReqMsgCtx.getAuthorizedUser(); Map<String, Object> claims = tokReqMsgCtx.getClaims(); // 添加自定义字段 claims.put("user_fullname", authorizedUser.getFirstName() + " " + authorizedUser.getLastName()); claims.put("custom_role", "internal_admin"); // 重新生成包含自定义字段的JWT Token accessToken = defaultIssuer.generateJWTToken(tokReqMsgCtx, claims); } return accessToken; } @Override public void init() { new DefaultOAuth2TokenIssuer().init(); } @Override public String getTokenType() { return new DefaultOAuth2TokenIssuer().getTokenType(); } }
- 将编译后的jar包放入IS安装目录的
repository/components/dropins文件夹 - 修改
deployment.toml配置,指定使用自定义Token发行器:
[oauth.token_issuer] impl = "com.yourcompany.CustomTokenIssuer"
- 重启WSO2 Identity Server,后续生成的Access Token将包含自定义字段。
注意事项
- 若当前使用的是引用令牌(Reference Token),需先在服务提供者配置中(Service Providers > 目标服务提供者 > OAuth/OpenID Connect Configuration)将
Token Issuer设置为JWT格式,否则无法直接在Token中添加字段。 - 添加的字段需符合JWT规范,避免使用特殊字符或冲突字段名。
内容的提问来源于stack exchange,提问作者mohamed hamada
相关产品推荐
相关产品推荐

