diff --git a/sa-token-demo/sa-token-demo-oauth2/sa-token-demo-oauth2-client/src/main/java/com/pj/oauth2/SaOAuthClientController.java b/sa-token-demo/sa-token-demo-oauth2/sa-token-demo-oauth2-client/src/main/java/com/pj/oauth2/SaOAuthClientController.java index cd7337e6..77240d0a 100644 --- a/sa-token-demo/sa-token-demo-oauth2/sa-token-demo-oauth2-client/src/main/java/com/pj/oauth2/SaOAuthClientController.java +++ b/sa-token-demo/sa-token-demo-oauth2/sa-token-demo-oauth2-client/src/main/java/com/pj/oauth2/SaOAuthClientController.java @@ -3,6 +3,8 @@ package com.pj.oauth2; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.util.SaResult; import com.ejlchina.okhttps.OkHttps; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.pj.utils.SoMap; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,7 +34,7 @@ public class SaOAuthClientController { // 根据Code码进行登录,获取 Access-Token 和 openid @RequestMapping("/codeLogin") - public SaResult codeLogin(String code) { + public SaResult codeLogin(String code) throws JsonProcessingException { // 调用Server端接口,获取 Access-Token 以及其他信息 String str = OkHttps.sync(serverUrl + "/oauth2/token") .addBodyPara("grant_type", "authorization_code") @@ -43,7 +45,7 @@ public class SaOAuthClientController { .getBody() .toString(); SoMap so = SoMap.getSoMap().setJsonString(str); - System.out.println("返回结果: " + so); + System.out.println("返回结果: " + new ObjectMapper().writeValueAsString(so)); // code不等于200 代表请求失败 if(so.getInt("code") != 200) { @@ -61,7 +63,7 @@ public class SaOAuthClientController { // 根据 Refresh-Token 去刷新 Access-Token @RequestMapping("/refresh") - public SaResult refresh(String refreshToken) { + public SaResult refresh(String refreshToken) throws JsonProcessingException { // 调用Server端接口,通过 Refresh-Token 刷新出一个新的 Access-Token String str = OkHttps.sync(serverUrl + "/oauth2/refresh") .addBodyPara("grant_type", "refresh_token") @@ -72,7 +74,7 @@ public class SaOAuthClientController { .getBody() .toString(); SoMap so = SoMap.getSoMap().setJsonString(str); - System.out.println("返回结果: " + so); + System.out.println("返回结果: " + new ObjectMapper().writeValueAsString(so)); // code不等于200 代表请求失败 if(so.getInt("code") != 200) { @@ -85,7 +87,7 @@ public class SaOAuthClientController { // 模式三:密码式-授权登录 @RequestMapping("/passwordLogin") - public SaResult passwordLogin(String username, String password) { + public SaResult passwordLogin(String username, String password) throws JsonProcessingException { // 模式三:密码式-授权登录 String str = OkHttps.sync(serverUrl + "/oauth2/token") .addBodyPara("grant_type", "password") @@ -97,7 +99,7 @@ public class SaOAuthClientController { .getBody() .toString(); SoMap so = SoMap.getSoMap().setJsonString(str); - System.out.println("返回结果: " + so); + System.out.println("返回结果: " + new ObjectMapper().writeValueAsString(so)); // code不等于200 代表请求失败 if(so.getInt("code") != 200) { @@ -115,7 +117,7 @@ public class SaOAuthClientController { // 模式四:获取应用的 Client-Token @RequestMapping("/clientToken") - public SaResult clientToken() { + public SaResult clientToken() throws JsonProcessingException { // 调用Server端接口 String str = OkHttps.sync(serverUrl + "/oauth2/client_token") .addBodyPara("grant_type", "client_credentials") @@ -125,7 +127,7 @@ public class SaOAuthClientController { .getBody() .toString(); SoMap so = SoMap.getSoMap().setJsonString(str); - System.out.println("返回结果: " + so); + System.out.println("返回结果: " + new ObjectMapper().writeValueAsString(so)); // code不等于200 代表请求失败 if(so.getInt("code") != 200) { @@ -145,7 +147,7 @@ public class SaOAuthClientController { // 根据 Access-Token 置换相关的资源: 获取账号昵称、头像、性别等信息 @RequestMapping("/getUserinfo") - public SaResult getUserinfo(String accessToken) { + public SaResult getUserinfo(String accessToken) throws JsonProcessingException { // 调用Server端接口,查询开放的资源 String str = OkHttps.sync(serverUrl + "/oauth2/userinfo") .addBodyPara("access_token", accessToken) @@ -153,7 +155,7 @@ public class SaOAuthClientController { .getBody() .toString(); SoMap so = SoMap.getSoMap().setJsonString(str); - System.out.println("返回结果: " + so); + System.out.println("返回结果: " + new ObjectMapper().writeValueAsString(so)); // code不等于200 代表请求失败 if(so.getInt("code") != 200) { diff --git a/sa-token-demo/sa-token-demo-oauth2/sa-token-demo-oauth2-server/src/main/java/com/pj/oauth2/SaOAuth2DataLoaderImpl.java b/sa-token-demo/sa-token-demo-oauth2/sa-token-demo-oauth2-server/src/main/java/com/pj/oauth2/SaOAuth2DataLoaderImpl.java index 468d9bcd..61eba47b 100644 --- a/sa-token-demo/sa-token-demo-oauth2/sa-token-demo-oauth2-server/src/main/java/com/pj/oauth2/SaOAuth2DataLoaderImpl.java +++ b/sa-token-demo/sa-token-demo-oauth2/sa-token-demo-oauth2-server/src/main/java/com/pj/oauth2/SaOAuth2DataLoaderImpl.java @@ -24,7 +24,7 @@ public class SaOAuth2DataLoaderImpl implements SaOAuth2DataLoader { .setClientId("1001") .setClientSecret("aaaa-bbbb-cccc-dddd-eeee") .setAllowUrl("*") - .setContractScopes(Arrays.asList("userinfo")) + .setContractScopes(Arrays.asList("userinfo", "openid")) .setIsAutoMode(true); } return null; diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/convert/SaOAuth2DataConverterDefaultImpl.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/convert/SaOAuth2DataConverterDefaultImpl.java index 74570f11..e886b125 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/convert/SaOAuth2DataConverterDefaultImpl.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/convert/SaOAuth2DataConverterDefaultImpl.java @@ -73,14 +73,11 @@ public class SaOAuth2DataConverterDefaultImpl implements SaOAuth2DataConverter { public AccessTokenModel convertCodeToAccessToken(CodeModel cm) { AccessTokenModel at = new AccessTokenModel(); at.accessToken = SaOAuth2Manager.getDataLoader().randomAccessToken(cm.clientId, cm.loginId, cm.scopes); - // at.refreshToken = randomRefreshToken(cm.clientId, cm.loginId, cm.scope); at.clientId = cm.clientId; at.loginId = cm.loginId; at.scopes = cm.scopes; - at.openid = SaOAuth2Manager.getDataLoader().getOpenid(cm.clientId, cm.loginId); SaClientModel clientModel = SaOAuth2Manager.getDataLoader().getClientModelNotNull(cm.clientId); at.expiresTime = System.currentTimeMillis() + (clientModel.getAccessTokenTimeout() * 1000); - // at.refreshExpiresTime = System.currentTimeMillis() + (checkClientModel(cm.clientId).getRefreshTokenTimeout() * 1000); return at; } diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/generate/SaOAuth2DataGenerateDefaultImpl.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/generate/SaOAuth2DataGenerateDefaultImpl.java index b4a114a3..51c53c6c 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/generate/SaOAuth2DataGenerateDefaultImpl.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/generate/SaOAuth2DataGenerateDefaultImpl.java @@ -18,9 +18,11 @@ package cn.dev33.satoken.oauth2.data.generate; import cn.dev33.satoken.oauth2.SaOAuth2Manager; import cn.dev33.satoken.oauth2.consts.SaOAuth2Consts; import cn.dev33.satoken.oauth2.dao.SaOAuth2Dao; +import cn.dev33.satoken.oauth2.data.convert.SaOAuth2DataConverter; import cn.dev33.satoken.oauth2.data.model.*; import cn.dev33.satoken.oauth2.error.SaOAuth2ErrorCode; import cn.dev33.satoken.oauth2.exception.SaOAuth2Exception; +import cn.dev33.satoken.oauth2.strategy.SaOAuth2Strategy; import cn.dev33.satoken.util.SaFoxUtil; import java.util.List; @@ -68,6 +70,7 @@ public class SaOAuth2DataGenerateDefaultImpl implements SaOAuth2DataGenerate { public AccessTokenModel generateAccessToken(String code) { SaOAuth2Dao dao = SaOAuth2Manager.getDao(); + SaOAuth2DataConverter dataConverter = SaOAuth2Manager.getDataConverter(); // 1、先校验 CodeModel cm = dao.getCode(code); @@ -78,8 +81,9 @@ public class SaOAuth2DataGenerateDefaultImpl implements SaOAuth2DataGenerate { dao.deleteRefreshToken(dao.getRefreshTokenValue(cm.clientId, cm.loginId)); // 3、生成token - AccessTokenModel at = SaOAuth2Manager.getDataConverter().convertCodeToAccessToken(cm); - RefreshTokenModel rt = SaOAuth2Manager.getDataConverter().convertAccessTokenToRefreshToken(at); + AccessTokenModel at = dataConverter.convertCodeToAccessToken(cm); + SaOAuth2Strategy.instance.workAccessTokenByScope.accept(at); + RefreshTokenModel rt = dataConverter.convertAccessTokenToRefreshToken(at); at.refreshToken = rt.refreshToken; at.refreshExpiresTime = rt.expiresTime; diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/AccessTokenModel.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/AccessTokenModel.java index d16974f6..ff54085e 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/AccessTokenModel.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/data/model/AccessTokenModel.java @@ -16,6 +16,7 @@ package cn.dev33.satoken.oauth2.data.model; import java.io.Serializable; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/function/strategy/SaScopeWorkFunction.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/function/strategy/SaScopeWorkFunction.java new file mode 100644 index 00000000..8068f266 --- /dev/null +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/function/strategy/SaScopeWorkFunction.java @@ -0,0 +1,34 @@ +/* + * Copyright 2020-2099 sa-token.cc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.dev33.satoken.oauth2.function.strategy; + +import cn.dev33.satoken.oauth2.data.model.AccessTokenModel; + +import java.util.function.Consumer; + +/** + * 函数式接口:AccessTokenModel 加工 + * + *
参数:AccessTokenModel
+ *返回:无
+ * + * @author click33 + * @since 1.35.0 + */ +@FunctionalInterface +public interface SaScopeWorkFunction extends Consumer