一、该问题的重现步骤是什么?
1. 我目前在做一个“一体化”平台,实现用户登录这个平台后,根据自己的权限可以看到已入驻的其它子系统,用户点击其中一个子系统可以直接单点登录进入。
2. 我实现的方式是改造了一个“静默授权”的接口(下面我会粘贴代码),用户在一体化平台时,默认入驻的子系统用户数据要和一体化平台数据一致,校验一波客户以及客户端端信息,直接用一体化平台的用户token生成一个授权码,拼接好跳转地址给前端,前端用这个地址调用三方子系统,三方子系统拿授权码换取token,进而拿到用户信息封装自己的granter,生成自己平台的token。
3.现在的问题是我部署了一套bladex 4.5到服务器上,我本地改造了一个
GovLawAuthorizationCodeGranter extends AuthorizationCodeGranter
目的是脱离咱们bladex默认调用自己认证服务的方式,这样相当于和SSO服务分离开,本来想自定义第三方登录,感觉改造JustAuth太复杂了,就继承了
AuthorizationCodeGranter 想重新在这里调用服务器上的获取token 获取用户,封装自己的用户,生成token
二、你期待的结果是什么?实际看到的又是什么?
现在可以获取token,但是获取用户是-1,大佬帮忙看看是什么问题?下面我粘贴我改造的代码:
org.springblade.auth.granter;
cn.hutool.http.HttpRequest;
cn.hutool.http.HttpResponse;
com.alibaba.fastjson.JSON;
com.alibaba.fastjson.JSONObject;
io.jsonwebtoken.Claims;
lombok.extern.slf4j.;
org.springblade.auth.utils.TokenUtil;
org.springblade.core.jwt.JwtUtil;
org.springblade.core.oauth2.exception.OAuth2ErrorCode;
org.springblade.core.oauth2.granter.AuthorizationCodeGranter;
org.springblade.core.oauth2.handler.PasswordHandler;
org.springblade.core.oauth2.provider.OAuth2Request;
org.springblade.core.oauth2.service.OAuth2ClientService;
org.springblade.core.oauth2.service.OAuth2User;
org.springblade.core.oauth2.service.OAuth2UserService;
org.springblade.core.oauth2.utils.OAuth2ExceptionUtil;
org.springblade.core.redis.cache.BladeRedis;
org.springblade.core.tool.api.R;
org.springblade.core.tool.utils.StringUtil;
org.springblade.system.feign.IUserClient;
org.springblade.system.pojo.entity.UserInfo;
org.springframework.stereotype.;
java.util.HashMap;
java.util.Map;
GovLawAuthorizationCodeGranter AuthorizationCodeGranter {
IUserClient ;
String = ;
String = ;
(OAuth2ClientService clientService,
OAuth2UserService userService,
PasswordHandler passwordHandler,
BladeRedis bladeRedis,
IUserClient userClient) {
(clientService, userService, passwordHandler,bladeRedis);
.= userClient;
}
String () {
;
}
OAuth2User (OAuth2Request request) {
String code = request.getCode();
String state = request.getState();
(StringUtil.(code)) {
OAuth2ExceptionUtil.(OAuth2ErrorCode.);
}
{
Map<String, Object> tokenParam = HashMap<>();
tokenParam.put(, );
tokenParam.put(, );
tokenParam.put(, code);tokenParam.put(, );
HttpResponse ssoResponse = HttpRequest.()
.header(, )
.header(, )
.form(tokenParam)
.execute();
JSONObject ssoJson = JSON.(ssoResponse.body());
String accessToken = ssoJson.getString();
//这里的accessToken 可以获取到,看起来很正常
(StringUtil.(accessToken)) {
.warn(, ssoJson);
OAuth2ExceptionUtil.(OAuth2ErrorCode.);
}
HttpResponse userInfoResponse = HttpRequest.()
.header(, + accessToken)
.header(, )
.execute();
JSONObject userJson = JSON.(userInfoResponse.body());
String userId = userJson.getString();
(StringUtil.(userId)) {
.warn(, userJson);
OAuth2ExceptionUtil.(OAuth2ErrorCode.);
}
R<UserInfo> userInfoR = .userInfo(Long.(userId));
(!userInfoR.isSuccess() || userInfoR.getData() == ) {
OAuth2ExceptionUtil.(OAuth2ErrorCode.);
}
OAuth2User user = TokenUtil.(userInfoR.getData(), request);
user.setClient(client(request));
user;
} (Exception e) {
.error(, e);
OAuth2ExceptionUtil.(OAuth2ErrorCode.);
;
}
}
}org.springblade.auth.endpoint;
io.jsonwebtoken.Claims;
jakarta.servlet.http.HttpServletRequest;
lombok.;
lombok.extern.slf4j.;
org.springblade.core.jwt.JwtCrypto;
org.springblade.core.jwt.JwtUtil;
org.springblade.core.launch.constant.TokenConstant;
org.springblade.core.launch.props.BladeProperties;
org.springblade.core.oauth2.provider.OAuth2Request;
org.springblade.core.oauth2.service.OAuth2Client;
org.springblade.core.oauth2.service.OAuth2ClientService;
org.springblade.core.oauth2.service.OAuth2User;
org.springblade.core.oauth2.service.OAuth2UserService;
org.springblade.core.oauth2.utils.OAuth2CodeUtil;
org.springblade.core.redis.cache.BladeRedis;
org.springblade.core.tool.api.R;
org.springblade.core.tool.utils.StringUtil;
org.springframework.web.bind.annotation.*;
org.springframework.web.servlet.view.RedirectView;
java.time.Duration;
org.springblade.core.jwt.JwtCrypto.;
()
SilentAuthorizeEndpoint {
OAuth2UserService ;
OAuth2ClientService ;
BladeRedis ;
BladeProperties ;
()
Object (String client_id,
String redirect_uri,
String state,
HttpServletRequest request) {
String currentSysUsrToken = request.getHeader(TokenConstant.);
(StringUtil.(currentSysUsrToken)) {
R.();
}
Claims claims = (request, );
(claims == ) {
R.();
}
String userId = String.(claims.get(TokenConstant.));
(StringUtil.(userId)) {
R.();
}
OAuth2Request oauthRequest = OAuth2Request.().buildHeaderArgs();
oauthRequest.setUserId(userId);
OAuth2Client client = .loadByClientId(client_id);
(client == || !.validateRedirectUri(client, redirect_uri)) {
R.();
}
OAuth2User user = .loadByUserId(userId, oauthRequest);
(user == || !.validateUser(user)) {
R.();
}
String code = generateUniqueCode();
.setEx(OAuth2CodeUtil.(code), user, Duration.());
+ redirect_uri + + code + + state;
}
String () {
String code = StringUtil.();
(.exists(OAuth2CodeUtil.(code))) {
generateUniqueCode();
}
code;
}
Claims (HttpServletRequest request, BladeProperties bladeProperties) {
String auth = request.getHeader(TokenConstant.);
(StringUtil.(auth)) {
;
}
String token = JwtUtil.(auth);
(JwtUtil.(auth)) {
String cryptoKey = bladeProperties.getEnvironment().getProperty();
token = JwtCrypto.(token, cryptoKey);
}
JwtUtil.(token);
}
}apifox请求截图:

{
"tenant_id": "000000",
"user_id": "1123598821738675201",
"dept_id": "1123598813738675201",
"post_id": "1123598817738675201",
"role_id": "1123598816738675201",
"oauth_id": "",
"account": "admin",
"user_name": "admin",
"nick_name": "管理员",
"real_name": "管理员",
"role_name": "administrator",
"avatar": "https://bladex.cn/images/logo-small.png",
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJibGFkZXguY24iLCJhdWQiOlsiYmxhZGV4Il0sInRva2VuX3R5cGUiOiJhY2Nlc3NfdG9rZW4iLCJjbGllbnRfaWQiOiJzYWJlcjMiLCJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJ1c2VyX2lkIjoiMTEyMzU5ODgyMTczODY3NTIwMSIsImRlcHRfaWQiOiIxMTIzNTk4ODEzNzM4Njc1MjAxIiwicG9zdF9pZCI6IjExMjM1OTg4MTc3Mzg2NzUyMDEiLCJyb2xlX2lkIjoiMTEyMzU5ODgxNjczODY3NTIwMSIsIm9hdXRoX2lkIjoiIiwiYWNjb3VudCI6ImFkbWluIiwidXNlcl9uYW1lIjoiYWRtaW4iLCJuaWNrX25hbWUiOiLnrqHnkIblkZgiLCJyZWFsX25hbWUiOiLnrqHnkIblkZgiLCJyb2xlX25hbWUiOiJhZG1pbmlzdHJhdG9yIiwiZGV0YWlsIjp7InR5cGUiOiJ3ZWIifSwiZXhwIjoxNzUxMzU3NzQ3LCJuYmYiOjE3NTEzNTQxNDd9.jK1-1oD5JowjJYZRnvBR2noyPUxxyWWg00GfOFeWaA0",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJibGFkZXguY24iLCJhdWQiOlsiYmxhZGV4Il0sInRva2VuX3R5cGUiOiJyZWZyZXNoX3Rva2VuIiwidXNlcl9pZCI6IjExMjM1OTg4MjE3Mzg2NzUyMDEiLCJkZXB0X2lkIjoiMTEyMzU5ODgxMzczODY3NTIwMSIsInJvbGVfaWQiOiIxMTIzNTk4ODE2NzM4Njc1MjAxIiwiZXhwIjoxNzUxOTU4OTQ3LCJuYmYiOjE3NTEzNTQxNDd9.gHCwn_KYWHakeuFmePzNfiXR-U49-2Vre1u9jdDImgQ",
"token_type": "bearer",
"expires_in": 3600,
"detail": {
"type": "web"
},
"license": "powered by bladex"
}
获取用户信息 -1

三、你正在使用的是什么产品,什么版本?在什么操作系统上?
bladex 4.5
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
如果是bladex4.6之前的版本,按照这个commit处理下:https://center.javablade.com/blade/BladeX-Tool/commit/0996818b600eb8c5e802040da8bfeab3a6dcdf55
如果还不行,按照这两步做一下:
1. 获取到accessToken后,到这里解码看看内容是什么 https://www.bejson.com/jwt/
2. 到这里打断点看看获取到的是什么,错误是什么,就这样一层一层调试下去



大佬,不太对劲呢感觉:


按照我上面说的步骤操作,然后给我你看到的结果。
如果觉得不需要,这个接口你可以无视。
扫一扫访问 Blade技术社区 移动端