|
@@ -25,6 +25,8 @@ import org.hswebframework.web.authorization.oauth2.client.request.OAuth2Session;
|
|
|
import org.hswebframework.web.authorization.oauth2.client.response.OAuth2Response;
|
|
|
import org.springframework.util.Assert;
|
|
|
|
|
|
+import java.util.concurrent.locks.ReadWriteLock;
|
|
|
+import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
|
import java.util.function.Consumer;
|
|
|
|
|
|
import static org.hswebframework.web.authorization.oauth2.client.OAuth2Constants.*;
|
|
@@ -48,6 +50,10 @@ public class DefaultOAuth2Session implements OAuth2Session {
|
|
|
|
|
|
private Consumer<AccessTokenInfo> onTokenChange;
|
|
|
|
|
|
+ private boolean authorized = false;
|
|
|
+
|
|
|
+ private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
|
|
|
+
|
|
|
public void setRequestBuilderFactory(OAuth2RequestBuilderFactory requestBuilderFactory) {
|
|
|
this.requestBuilderFactory = requestBuilderFactory;
|
|
|
}
|
|
@@ -102,12 +108,21 @@ public class DefaultOAuth2Session implements OAuth2Session {
|
|
|
|
|
|
@Override
|
|
|
public OAuth2Session authorize() {
|
|
|
- AccessTokenInfo accessTokenInfo = accessTokenRequest
|
|
|
- .param(OAuth2Constants.scope, scope)
|
|
|
- .post().onError(OAuth2Response.throwOnError)
|
|
|
- .as(AccessTokenInfo.class);
|
|
|
- accessTokenInfo.setCreateTime(System.currentTimeMillis());
|
|
|
- setAccessTokenInfo(accessTokenInfo);
|
|
|
+ readWriteLock.writeLock().lock();
|
|
|
+ if (authorized) {
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ AccessTokenInfo accessTokenInfo = accessTokenRequest
|
|
|
+ .param(OAuth2Constants.scope, scope)
|
|
|
+ .post().onError(OAuth2Response.throwOnError)
|
|
|
+ .as(AccessTokenInfo.class);
|
|
|
+ accessTokenInfo.setCreateTime(System.currentTimeMillis());
|
|
|
+ setAccessTokenInfo(accessTokenInfo);
|
|
|
+ authorized = true;
|
|
|
+ } finally {
|
|
|
+ readWriteLock.writeLock().unlock();
|
|
|
+ }
|
|
|
return this;
|
|
|
}
|
|
|
|
|
@@ -136,17 +151,22 @@ public class DefaultOAuth2Session implements OAuth2Session {
|
|
|
if (accessTokenInfo == null) {
|
|
|
return;
|
|
|
}
|
|
|
- OAuth2Request request = createRequest(getRealUrl(serverConfig.getAccessTokenUrl()));
|
|
|
- applyBasicAuthParam(request);
|
|
|
- AccessTokenInfo tokenInfo = request
|
|
|
- .param(OAuth2Constants.scope, scope)
|
|
|
- .param(OAuth2Constants.grant_type, GrantType.refresh_token)
|
|
|
- .param(GrantType.refresh_token, accessTokenInfo.getRefreshToken())
|
|
|
- .post().onError(OAuth2Response.throwOnError)
|
|
|
- .as(AccessTokenInfo.class);
|
|
|
- tokenInfo.setCreateTime(accessTokenInfo.getCreateTime());
|
|
|
- tokenInfo.setUpdateTime(System.currentTimeMillis());
|
|
|
- setAccessTokenInfo(tokenInfo);
|
|
|
+ readWriteLock.writeLock().lock();
|
|
|
+ try {
|
|
|
+ OAuth2Request request = createRequest(getRealUrl(serverConfig.getAccessTokenUrl()));
|
|
|
+ applyBasicAuthParam(request);
|
|
|
+ AccessTokenInfo tokenInfo = request
|
|
|
+ .param(OAuth2Constants.scope, scope)
|
|
|
+ .param(OAuth2Constants.grant_type, GrantType.refresh_token)
|
|
|
+ .param(GrantType.refresh_token, accessTokenInfo.getRefreshToken())
|
|
|
+ .post().onError(OAuth2Response.throwOnError)
|
|
|
+ .as(AccessTokenInfo.class);
|
|
|
+ tokenInfo.setCreateTime(accessTokenInfo.getCreateTime());
|
|
|
+ tokenInfo.setUpdateTime(System.currentTimeMillis());
|
|
|
+ setAccessTokenInfo(tokenInfo);
|
|
|
+ } finally {
|
|
|
+ readWriteLock.writeLock().unlock();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|