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