package com.xiaopeng.account.controller;
|
|
|
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpResponse;
|
import cn.hutool.http.HttpUtil;
|
import com.alibaba.fastjson2.JSON;
|
import com.xiaopeng.account.service.impl.SysLoginService;
|
import com.xiaopeng.account.vo.OIDCUserInfoVo;
|
import com.xiaopeng.account.vo.SSOToken;
|
import com.xiaopeng.api.model.account.SysRole;
|
import com.xiaopeng.api.vo.account.LoginOperationUser;
|
import com.xiaopeng.api.vo.account.LoginUser;
|
import com.xiaopeng.common.core.domain.R;
|
import com.xiaopeng.common.core.exception.ServiceException;
|
import com.xiaopeng.common.security.service.TokenService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.HashMap;
|
import java.util.List;
|
|
@Slf4j
|
@RestController
|
@RequestMapping("/ssoAuthSdk")
|
public class XtigerSSOController {
|
|
@Value("${xiaopeng.xtiger.sso.issuer}")
|
private String issuer;
|
|
@Value("${xiaopeng.xtiger.sso.appId}")
|
private String appId;
|
|
@Autowired
|
private TokenService tokenService;
|
|
@Autowired
|
private SysLoginService sysLoginService;
|
|
/**
|
* 翼虎web登录重定向接口
|
* 通过code换取token
|
*
|
* @param code
|
* @param state
|
*/
|
@GetMapping("/callback")
|
public R<?> callback(String code, String state, HttpServletRequest request) {
|
log.info("翼虎登录重定向接口, code: {}, state: {}", code, state);
|
HttpRequest post = HttpUtil.createPost(issuer + "/oidc/token/v2");
|
post.form("client_id", appId);
|
post.form("code", code);
|
post.form("grant_type", "authorization_code");
|
HttpResponse execute = post.execute();
|
if (!execute.isOk()) {
|
throw new ServiceException("登录失败,请稍后重试。");
|
}
|
String body = execute.body();
|
log.info("翼虎登录重定向接口, 返回结果: {}", body);
|
SSOToken ssoToken = JSON.parseObject(body, SSOToken.class);
|
String accessToken = ssoToken.getAccessToken();
|
OIDCUserInfoVo userInfo = getUserInfo(accessToken);
|
return login(userInfo, request);
|
}
|
|
|
/**
|
* 翼虎app登录换取本系统token
|
*
|
* @param request
|
* @return
|
*/
|
@GetMapping("/appLogin")
|
public R<?> appLogin(Integer deviceType, HttpServletRequest request) {
|
String accessTokenHeader = request.getHeader("Authorization");
|
String accessToken = StringUtils.isEmpty(accessTokenHeader) ? null : accessTokenHeader.replace("Bearer ", "");
|
if (StringUtils.isEmpty(accessToken)) {
|
throw new ServiceException("登录失败,请稍后重试。");
|
}
|
OIDCUserInfoVo userInfo = getUserInfo(accessToken);
|
return appLogin(userInfo, deviceType, request);
|
}
|
|
|
public OIDCUserInfoVo getUserInfo(String accessToken) {
|
log.info("翼虎登录使用token获取用户信息");
|
HttpRequest post = HttpUtil.createGet(issuer + "/oidc/userinfo");
|
post.header("Authorization", "Bearer " + accessToken);
|
HttpResponse execute = post.execute();
|
if (!execute.isOk()) {
|
throw new ServiceException("登录失败,请稍后重试。");
|
}
|
String body = execute.body();
|
log.info("翼虎登录使用token获取用户信息, 返回结果: {}", body);
|
OIDCUserInfoVo ssoToken = JSON.parseObject(body, OIDCUserInfoVo.class);
|
return ssoToken;
|
}
|
|
|
public R<?> login(OIDCUserInfoVo userInfo, HttpServletRequest request) {
|
// 用户登录
|
LoginUser loginUser = sysLoginService.login(userInfo.getPhone_number(), request);
|
HashMap<String, Object> map = new HashMap<>();
|
map.put("token", tokenService.createToken(loginUser));
|
List<SysRole> roles = loginUser.getSysUser().getRoles();
|
// if (CollectionUtils.isEmpty(roles)) {
|
// throw new ServiceException("请关联角色!", I18nKeyConstant.LOGIN_ROLE_NOT_BIND);
|
// }
|
// map.put("roleName",roles.get(0).getRoleName());
|
map.put("info", userInfo);
|
// 修改用户最后登录时间
|
return R.ok(map);
|
}
|
|
|
public R<?> appLogin(OIDCUserInfoVo userInfo, Integer deviceType, HttpServletRequest request) {
|
LoginOperationUser loginUser = sysLoginService.verificationCodeLogin(userInfo.getPhone_number(), deviceType, request);
|
HashMap<String, Object> map = new HashMap<>();
|
map.put("token", tokenService.createOperationUserToken(loginUser));
|
// List<SysRole> roles = userInfo.getXpOperationsUser().getRoles();
|
// if (CollectionUtils.isEmpty(roles)) {
|
// return R.fail("请关联角色!");
|
// }
|
// map.put("roleName", roles.get(0).getRoleName());
|
map.put("info", loginUser);
|
return R.ok(map);
|
}
|
}
|