From a5c00a1316fe9922ff87bf07a5e42c238a07d070 Mon Sep 17 00:00:00 2001
From: xieb <vip_xiaobin810@163.com>
Date: Thu, 10 Aug 2023 16:18:13 +0800
Subject: [PATCH] 单点登出
---
skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/endpoint/BladeTokenEndPoint.java | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 115 insertions(+), 0 deletions(-)
diff --git a/skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/endpoint/BladeTokenEndPoint.java b/skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/endpoint/BladeTokenEndPoint.java
index 54fddb2..3478399 100644
--- a/skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/endpoint/BladeTokenEndPoint.java
+++ b/skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/endpoint/BladeTokenEndPoint.java
@@ -16,8 +16,17 @@
*/
package cn.gistack.auth.endpoint;
+
+import cn.gistack.auth.props.LoginUser;
+import cn.gistack.auth.props.OAuthProperties;
+import cn.gistack.common.utils.HttpClientUtils;
+import cn.gistack.system.user.entity.User;
+import cn.gistack.system.user.feign.IUserClient;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
import com.wf.captcha.SpecCaptcha;
import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import cn.gistack.common.cache.CacheNames;
import org.springblade.core.cache.utils.CacheUtil;
@@ -32,8 +41,10 @@
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.core.tool.utils.WebUtil;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
import org.springframework.security.oauth2.provider.AuthorizationRequest;
@@ -41,11 +52,17 @@
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ModelAndView;
+import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.time.Duration;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import static cn.gistack.common.cache.CacheNames.OAUTH_KEY;
import static org.springblade.core.cache.constant.CacheConstant.*;
/**
@@ -63,6 +80,16 @@
private final JwtProperties jwtProperties;
private final ClientDetailsService clientDetailsService;
private final TokenStore tokenStore;
+ private final IUserClient userClient;
+ private final UserDetailsService userDetailsService;
+ //获取wxAccessToken
+ private final String WX_GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token";
+ private final String WX_GET_PHONE_NUMBER = "https://api.weixin.qq.com/wxa/business/getuserphonenumber";
+ private final String WX_APP_ID = "wx521ae71bcde281bc";
+ private final String WX_SECRET = "c1c93b0c4545f8cdf42752121ea8458c";
+
+ @Autowired
+ private final OAuthProperties oauthProperties;
/**
* 登录页面
@@ -73,6 +100,94 @@
return model;
}
+ @SneakyThrows
+ @GetMapping("/oauth/tokenLoginUI")
+ public void tokenLoginUI(HttpServletResponse response, String code) {
+ if (StringUtil.isBlank(code)) {
+ response.sendRedirect(oauthProperties.getRedirectExitUri());
+ } else {
+ response.sendRedirect(oauthProperties.getRedirectWebUri() + "?code=" + code);
+ }
+ }
+
+ @GetMapping("/oauth/tokenLogin")
+ public R tokenLogin(String code) {
+ // 统一登录获取accessToken
+ String accessToken = getAccessToken(code);
+ System.out.println("accessToken:" + accessToken);
+ LoginUser loginUser = getUsernameByToken(accessToken);
+ loginUser.setCode(code);
+ bladeRedis.setEx(OAUTH_KEY + code,code,5*60L);
+ return R.data(loginUser);
+ }
+
+ private String getAccessToken(String code) {
+ // 统一登录获取accessToken
+ String url = oauthProperties.getTokenUrl();
+ Map<String, String> param = new HashMap<>();
+ param.put("grant_type", "authorization_code");
+ param.put("redirect_uri", oauthProperties.getRedirectUri());
+ param.put("client_id", oauthProperties.getClientId());
+ param.put("client_secret", oauthProperties.getClientSecret());
+ param.put("AppKey", oauthProperties.getAppKey());
+ param.put("AppSecret", oauthProperties.getAppSecret());
+ param.put("code", code);
+ String accessToken = HttpClientUtils.doGet(url, param);
+ Map<String, String> maps = (Map<String, String>) JSON.parse(accessToken);
+ if (maps.containsKey("access_token")) {
+ return maps.get("access_token");
+ }
+ return "";
+ }
+
+ private LoginUser getUsernameByToken(String accessToken) {
+ String url = oauthProperties.getProfileUrl();
+ Map<String, String> param = new HashMap<>();
+ param.put("AppKey", oauthProperties.getAppKey());
+ param.put("AppSecret", oauthProperties.getAppSecret());
+ param.put("accessToken", accessToken);
+ String resp = HttpClientUtils.doGet(url, param);
+ System.out.println("接收数据:" + resp);
+ LoginUser loginUser = JSON.parseObject(resp, LoginUser.class);
+
+ return loginUser;
+ }
+
+ @GetMapping("/oauth/wxLogin")
+ public R wxLogin(String code) {
+ String wxAccessToken = getWxAccessToken();
+ //参数
+ String url = WX_GET_PHONE_NUMBER + "?access_token=" + wxAccessToken;
+ //向微信接口发起请求获取手机号
+
+ RestTemplate template = new RestTemplate();
+ Map<String, Object> params = new LinkedHashMap<>();
+ params.put("code", code);
+ String result = template.postForObject(url, params, String.class);
+ JSONObject resultObj = (JSONObject) JSONObject.parse(result);
+ JSONObject phoneInfo = (JSONObject) resultObj.get("phone_info");
+ String phoneNumber = phoneInfo.get("phoneNumber").toString();
+ R<User> userR = userClient.userByAccount("000000", phoneNumber);
+ if (userR.getData() != null) {
+ return R.data(phoneNumber);
+ } else {
+ return R.fail("不存在该用户");
+ }
+ }
+
+ public String getWxAccessToken() {
+ //参数
+ Map<String, String> params = new HashMap<>();
+ params.put("grant_type", "client_credential");
+ params.put("appid", WX_APP_ID);
+ params.put("secret", WX_SECRET);
+ String result = HttpClientUtils.doGet(WX_GET_ACCESS_TOKEN, params);
+ JSONObject jsonObject = JSON.parseObject(result);
+ String accessToken = jsonObject.getString("access_token");
+ return accessToken;
+ }
+
+
/**
* 授权页面
*/
--
Gitblit v1.9.3