From 006baff0642ddb99514f268c8876d0cb3766e298 Mon Sep 17 00:00:00 2001
From: xieb <vip_xiaobin810@163.com>
Date: Wed, 26 Jul 2023 14:17:37 +0800
Subject: [PATCH] 增加单点登录逻辑

---
 skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/endpoint/BladeTokenEndPoint.java |   86 ++++++++++++++++++++++++++++++++++---------
 1 files changed, 68 insertions(+), 18 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 cd02a03..ebf2258 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
@@ -17,14 +17,16 @@
 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.JSONAware;
 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;
@@ -39,32 +41,28 @@
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.core.tool.utils.WebUtil;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
+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.UserDetails;
 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;
 import org.springframework.security.oauth2.provider.ClientDetailsService;
 import org.springframework.security.oauth2.provider.token.TokenStore;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
 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.*;
 
 /**
@@ -90,6 +88,9 @@
 	private final String WX_APP_ID = "wx521ae71bcde281bc";
 	private final String WX_SECRET = "c1c93b0c4545f8cdf42752121ea8458c";
 
+	@Autowired
+	private final OAuthProperties oauthProperties;
+
 	/**
 	 * 登录页面
 	 */
@@ -99,34 +100,83 @@
 		return model;
 	}
 
+	@SneakyThrows
+	@GetMapping("/oauth/tokenLoginUI")
+	public void tokenLoginUI(HttpServletResponse response, String code) {
+		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){
+	public R wxLogin(String code) {
 		String wxAccessToken = getWxAccessToken();
 		//参数
-		String url = WX_GET_PHONE_NUMBER+"?access_token="+wxAccessToken;
+		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");
+		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){
+		if (userR.getData() != null) {
 			return R.data(phoneNumber);
-		}else {
+		} else {
 			return R.fail("不存在该用户");
 		}
 	}
 
-	public String getWxAccessToken(){
+	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);
+		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");

--
Gitblit v1.9.3