diff --git a/basic-properties/src/main/java/ink/wgink/properties/ApiPathProperties.java b/basic-properties/src/main/java/ink/wgink/properties/ApiPathProperties.java new file mode 100644 index 00000000..66d33445 --- /dev/null +++ b/basic-properties/src/main/java/ink/wgink/properties/ApiPathProperties.java @@ -0,0 +1,36 @@ +package ink.wgink.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @ClassName: ApiUrlProperties + * @Description: api + * @Author: WangGeng + * @Date: 2019/4/22 9:42 PM + * @Version: 1.0 + **/ +@Component +@ConfigurationProperties(prefix = "api-path") +public class ApiPathProperties { + + private String userCenter; + + public String getUserCenter() { + return userCenter == null ? "" : userCenter.trim(); + } + + public void setUserCenter(String userCenter) { + this.userCenter = userCenter; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"userCenter\":") + .append("\"").append(userCenter).append("\""); + + sb.append('}'); + return sb.toString(); + } +} diff --git a/basic-properties/src/main/java/ink/wgink/properties/oauth2/client/OAuth2ClientProperties.java b/basic-properties/src/main/java/ink/wgink/properties/oauth2/client/OAuth2ClientProperties.java index 17488a92..f9113466 100644 --- a/basic-properties/src/main/java/ink/wgink/properties/oauth2/client/OAuth2ClientProperties.java +++ b/basic-properties/src/main/java/ink/wgink/properties/oauth2/client/OAuth2ClientProperties.java @@ -44,7 +44,7 @@ public class OAuth2ClientProperties { @Component @ConfigurationProperties(prefix = "security.oauth2.client") - private static class ClientProperties { + public static class ClientProperties { private String clientId; private String clientSecret; private String userAuthorizationUri; diff --git a/module-oauth2-client/pom.xml b/module-oauth2-client/pom.xml new file mode 100644 index 00000000..432b1ce8 --- /dev/null +++ b/module-oauth2-client/pom.xml @@ -0,0 +1,23 @@ + + + + wg-basic + ink.wgink + 1.0-SNAPSHOT + + 4.0.0 + + module-oauth2-client + oauth2客户端 + + + + ink.wgink + common + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/manager/OAuth2ClientTokenManager.java b/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/manager/OAuth2ClientTokenManager.java new file mode 100644 index 00000000..eefd35c4 --- /dev/null +++ b/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/manager/OAuth2ClientTokenManager.java @@ -0,0 +1,68 @@ +package ink.wgink.module.oauth2.manager; + +import com.alibaba.fastjson.JSONObject; +import ink.wgink.module.oauth2.pojo.AccessToken; +import ink.wgink.module.oauth2.remote.IAccessTokenRemoteService; +import ink.wgink.properties.ApiPathProperties; +import ink.wgink.properties.oauth2.client.OAuth2ClientProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: ClientTokenManager + * @Description: 客户单token + * @Author: WangGeng + * @Date: 2019/10/16 12:22 上午 + * @Version: 1.0 + **/ +public class OAuth2ClientTokenManager { + + private static final Logger LOG = LoggerFactory.getLogger(OAuth2ClientTokenManager.class); + private static OAuth2ClientTokenManager oAuth2ClientTokenManager = OAuth2ClientTokenBuilder.oAuth2ClientTokenManager; + private AccessToken accessToken; + private IAccessTokenRemoteService accessTokenRemoteService; + private OAuth2ClientProperties oAuth2ClientProperties; + private ApiPathProperties apiPathProperties; + + private OAuth2ClientTokenManager() { + } + + public static OAuth2ClientTokenManager getInstance() { + return oAuth2ClientTokenManager; + } + + public AccessToken getAccessToken() { + if (accessToken == null || (System.currentTimeMillis() - accessToken.getCreateTime()) / 1000 >= accessToken.getExpiresIn()) { + LOG.debug("客户端Token失效,获取token"); + JSONObject accessTokenJsonObject = accessTokenRemoteService.getAccessToken(apiPathProperties.getUserCenter(), "client_credentials", oAuth2ClientProperties.getClient().getClientId(), oAuth2ClientProperties.getClient().getClientSecret(), "all"); + accessToken = new AccessToken(); + accessToken.setAccessToken(accessTokenJsonObject.getString("access_token")); + accessToken.setTokenType(accessTokenJsonObject.getString("token_type")); + accessToken.setExpiresIn(accessTokenJsonObject.getInteger("expires_in")); + accessToken.setScope(accessTokenJsonObject.getString("scope")); + accessToken.setJti(accessTokenJsonObject.getString("jti")); + accessToken.setCreateTime(System.currentTimeMillis()); + } + return accessToken; + } + + public void setAccessTokenRemoteService(IAccessTokenRemoteService accessTokenRemoteService) { + this.accessTokenRemoteService = accessTokenRemoteService; + } + + public void setOAuth2ClientProperties(OAuth2ClientProperties oAuth2ClientProperties) { + this.oAuth2ClientProperties = oAuth2ClientProperties; + } + + public void setApiPathProperties(ApiPathProperties apiPathProperties) { + this.apiPathProperties = apiPathProperties; + } + + private static class OAuth2ClientTokenBuilder { + public static OAuth2ClientTokenManager oAuth2ClientTokenManager = new OAuth2ClientTokenManager(); + } + +} diff --git a/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/pojo/AccessToken.java b/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/pojo/AccessToken.java new file mode 100644 index 00000000..a007e40a --- /dev/null +++ b/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/pojo/AccessToken.java @@ -0,0 +1,69 @@ +package ink.wgink.module.oauth2.pojo; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: AccessToken + * @Description: AccessToken + * @Author: WangGeng + * @Date: 2021/9/21 12:43 + * @Version: 1.0 + **/ +public class AccessToken { + + private String accessToken; + private String tokenType; + private int expiresIn; + private String scope; + private String jti; + private long createTime; + + public String getAccessToken() { + return accessToken == null ? "" : accessToken.trim(); + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getTokenType() { + return tokenType == null ? "" : tokenType.trim(); + } + + public void setTokenType(String tokenType) { + this.tokenType = tokenType; + } + + public int getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(int expiresIn) { + this.expiresIn = expiresIn; + } + + public String getScope() { + return scope == null ? "" : scope.trim(); + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getJti() { + return jti == null ? "" : jti.trim(); + } + + public void setJti(String jti) { + this.jti = jti; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } +} diff --git a/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/remote/IAccessTokenRemoteService.java b/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/remote/IAccessTokenRemoteService.java new file mode 100644 index 00000000..67966cb3 --- /dev/null +++ b/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/remote/IAccessTokenRemoteService.java @@ -0,0 +1,29 @@ +package ink.wgink.module.oauth2.remote; + +import com.alibaba.fastjson.JSONObject; +import ink.wgink.annotation.rpc.rest.RemoteService; +import ink.wgink.annotation.rpc.rest.method.RemotePostMethod; +import ink.wgink.annotation.rpc.rest.params.RemoteQueryParams; +import ink.wgink.annotation.rpc.rest.params.RemoteServerParams; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: IAccessTokenRemoteService + * @Description: accessToken + * @Author: WangGeng + * @Date: 2021/9/21 12:44 + * @Version: 1.0 + **/ +@RemoteService +public interface IAccessTokenRemoteService { + + @RemotePostMethod("/oauth_client/token") + JSONObject getAccessToken(@RemoteServerParams String server, + @RemoteQueryParams("grant_type") String grantType, + @RemoteQueryParams("client_id") String clientId, + @RemoteQueryParams("client_secret") String clientSecret, + @RemoteQueryParams("scope") String scope); + +} diff --git a/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/startup/OAuth2ClientStartUp.java b/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/startup/OAuth2ClientStartUp.java new file mode 100644 index 00000000..187ba82f --- /dev/null +++ b/module-oauth2-client/src/main/java/ink/wgink/module/oauth2/startup/OAuth2ClientStartUp.java @@ -0,0 +1,46 @@ +package ink.wgink.module.oauth2.startup; + +import ink.wgink.module.oauth2.manager.OAuth2ClientTokenManager; +import ink.wgink.module.oauth2.remote.IAccessTokenRemoteService; +import ink.wgink.properties.ApiPathProperties; +import ink.wgink.properties.oauth2.client.OAuth2ClientProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: OAuth2ClientStartUp + * @Description: OAuth2Client启动 + * @Author: WangGeng + * @Date: 2021/9/21 14:07 + * @Version: 1.0 + **/ +@Component +public class OAuth2ClientStartUp implements ApplicationRunner { + + @Autowired + private IAccessTokenRemoteService accessTokenRemoteService; + @Autowired + private OAuth2ClientProperties oAuth2ClientProperties; + @Autowired + private ApiPathProperties apiPathProperties; + + @Override + public void run(ApplicationArguments args) throws Exception { + OAuth2ClientTokenManager oAuth2ClientTokenManager = OAuth2ClientTokenManager.getInstance(); + oAuth2ClientTokenManager.setAccessTokenRemoteService(accessTokenRemoteService); + oAuth2ClientTokenManager.setOAuth2ClientProperties(oAuth2ClientProperties); + oAuth2ClientTokenManager.setApiPathProperties(apiPathProperties); + refreshAccessToken(); + } + + @Scheduled(cron = "0 0/15 * * * ?") + public void refreshAccessToken() { + OAuth2ClientTokenManager.getInstance().getAccessToken(); + } +} diff --git a/pom.xml b/pom.xml index f869229b..2084aff8 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ module-activiti module-instant-message login-oauth2-client + module-oauth2-client pom