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 map = new HashMap<>(); map.put("token", tokenService.createToken(loginUser)); List 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 map = new HashMap<>(); map.put("token", tokenService.createOperationUserToken(loginUser)); // List 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); } }