This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-fence.git
The following commit(s) were added to refs/heads/master by this push:
new 5c383c0 [SCB-1340]support expiration time & not before time
configuration
5c383c0 is described below
commit 5c383c07eb7bc00c65f4e309b7f656273dcc4683
Author: liubao <[email protected]>
AuthorDate: Mon Jul 1 19:47:17 2019 +0800
[SCB-1340]support expiration time & not before time configuration
---
...iguration.java => TokenStoreConfiguration.java} | 2 +-
.../authentication/token/JWTTokenImpl.java | 7 +-
.../authentication/token/JWTTokenStoreImpl.java | 6 +-
.../authentication/token/SessionTokenImpl.java | 20 ++---
.../servicecomb/authentication/token/Token.java | 5 +-
.../token/TokenDynamicProperties.java} | 23 +++---
.../token/TokenDynamicPropertiesManager.java} | 13 ++--
.../authentication/edge/AuthHandler.java | 2 +-
...iguration.java => AccessDynamicProperties.java} | 10 +--
...er.java => AccessDynamicPropertiesManager.java} | 8 +-
.../resource/AuthenticationAuthFilter.java | 2 +-
.../ConfigBasedAuthoriaztionAuthFilter.java | 2 +-
docs/zh_CN/developersGuide.md | 14 ++--
.../AuthenticationConfiguration.java | 7 +-
.../src/main/resources/microservice.yaml | 6 ++
.../authentication/AuthenticationTestCase.java | 3 +
.../servicecomb/authentication/TestEndpoint.java | 10 +--
...ationTestCase.java => TokenExpireTestCase.java} | 86 +++-------------------
.../src/main/resources/microservice.yaml | 14 ++--
19 files changed, 90 insertions(+), 150 deletions(-)
diff --git
a/api/common/endpoint/src/main/java/org/apache/servicecomb/authentication/token/TokenConfiguration.java
b/api/common/endpoint/src/main/java/org/apache/servicecomb/authentication/token/TokenStoreConfiguration.java
similarity index 98%
rename from
api/common/endpoint/src/main/java/org/apache/servicecomb/authentication/token/TokenConfiguration.java
rename to
api/common/endpoint/src/main/java/org/apache/servicecomb/authentication/token/TokenStoreConfiguration.java
index 8fd7375..83d4654 100644
---
a/api/common/endpoint/src/main/java/org/apache/servicecomb/authentication/token/TokenConfiguration.java
+++
b/api/common/endpoint/src/main/java/org/apache/servicecomb/authentication/token/TokenStoreConfiguration.java
@@ -27,7 +27,7 @@ import org.springframework.security.jwt.crypto.sign.Signer;
import org.springframework.security.jwt.crypto.sign.SignerVerifier;
@Configuration
-public class TokenConfiguration {
+public class TokenStoreConfiguration {
@Bean(name = {CommonConstants.BEAN_AUTH_ACCESS_TOKEN_STORE,
CommonConstants.BEAN_AUTH_REFRESH_TOKEN_STORE})
@Order(CommonConstants.BEAN_DEFAULT_ORDER)
diff --git
a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTTokenImpl.java
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTTokenImpl.java
index 0a99334..980f96e 100644
---
a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTTokenImpl.java
+++
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTTokenImpl.java
@@ -40,11 +40,6 @@ public class JWTTokenImpl implements JWTToken {
}
@Override
- public boolean isExpired() {
- return System.currentTimeMillis() - this.getIssueAt() >
this.getExpiresIn() * 1000;
- }
-
- @Override
public long getIssueAt() {
return this.claims.getIat();
}
@@ -78,7 +73,7 @@ public class JWTTokenImpl implements JWTToken {
public String username() {
return this.claims.getSub();
}
-
+
public JWTClaims getClaims() {
return this.claims;
}
diff --git
a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTTokenStoreImpl.java
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTTokenStoreImpl.java
index f7191c0..5b74496 100644
---
a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTTokenStoreImpl.java
+++
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTTokenStoreImpl.java
@@ -45,10 +45,12 @@ public class JWTTokenStoreImpl implements JWTTokenStore {
userDetails.getAuthorities().forEach(authority ->
claims.addAuthority(authority.getAuthority()));
}
- // TODO : set other parameters.
+ TokenDynamicProperties config =
TokenDynamicPropertiesManager.getTokenConfiguration(userDetails.getUsername());
claims.setJti(UUID.randomUUID().toString());
claims.setIat(System.currentTimeMillis());
- claims.setExp(5 * 60);
+ claims.setExp(config.expiresIn);
+ claims.setNbf(config.notBefore);
+ // Maybe some other properties in future
return new JWTTokenImpl(claims, signer);
}
diff --git
a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionTokenImpl.java
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionTokenImpl.java
index 53aa6d0..d31e775 100644
---
a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionTokenImpl.java
+++
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionTokenImpl.java
@@ -25,22 +25,15 @@ public class SessionTokenImpl implements SessionToken {
private long issueAt;
- // in seconds
- private long expiresIn;
-
private String username;
+ private TokenDynamicProperties config;
+
public SessionTokenImpl(String username) {
this.value = UUID.randomUUID().toString();
this.issueAt = System.currentTimeMillis();
- // TODO add a configuration
- this.expiresIn = 600;
this.username = username;
- }
-
- @Override
- public boolean isExpired() {
- return System.currentTimeMillis() - this.issueAt > this.expiresIn * 1000;
+ this.config =
TokenDynamicPropertiesManager.getTokenConfiguration(username);
}
@Override
@@ -50,13 +43,12 @@ public class SessionTokenImpl implements SessionToken {
@Override
public long getExpiresIn() {
- return this.expiresIn;
+ return this.config.expiresIn;
}
@Override
public long getNotBefore() {
- // TODO add a configuration
- return 0;
+ return this.config.notBefore;
}
@Override
@@ -66,7 +58,7 @@ public class SessionTokenImpl implements SessionToken {
@Override
public Map<String, Object> getAdditionalInformation() {
- // TODO add a configuration
+ // TODO additional information is not used now
return null;
}
diff --git
a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/Token.java
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/Token.java
index 29b26db..1f444c3 100644
---
a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/Token.java
+++
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/Token.java
@@ -22,7 +22,10 @@ import java.util.Map;
public interface Token {
String username();
- boolean isExpired();
+ default boolean isExpired() {
+ return (System.currentTimeMillis() < getNotBefore()) ||
+ (System.currentTimeMillis() - getIssueAt() > getExpiresIn() * 1000);
+ }
long getIssueAt();
diff --git
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfiguration.java
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/TokenDynamicProperties.java
similarity index 70%
copy from
api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfiguration.java
copy to
api/common/service/src/main/java/org/apache/servicecomb/authentication/token/TokenDynamicProperties.java
index 8167612..43b7473 100644
---
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfiguration.java
+++
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/TokenDynamicProperties.java
@@ -15,23 +15,22 @@
* limitations under the License.
*/
-package org.apache.servicecomb.authentication.resource;
+package org.apache.servicecomb.authentication.token;
import org.apache.servicecomb.config.inject.InjectProperties;
import org.apache.servicecomb.config.inject.InjectProperty;
-@InjectProperties(prefix = "servicecomb.authencation.access")
-public class AccessConfiguration {
+@InjectProperties(prefix = "servicecomb.authentication")
+public class TokenDynamicProperties {
@InjectProperty(keys = {
- "needAuth.${schemaId}.${operationId}",
- "needAuth.${schemaId}",
- "needAuth"},
- defaultValue = "true")
- public boolean needAuth;
+ "token.${username}.expiresIn",
+ "expiresIn"},
+ defaultValue = "600")
+ public long expiresIn;
@InjectProperty(keys = {
- "roles.${schemaId}.${operationId}",
- "roles.${schemaId}",
- "roles"})
- public String roles;
+ "token.${username}.notBefore",
+ "notBefore"},
+ defaultValue = "0")
+ public long notBefore;
}
diff --git
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfigurationManager.java
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/TokenDynamicPropertiesManager.java
similarity index 64%
copy from
api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfigurationManager.java
copy to
api/common/service/src/main/java/org/apache/servicecomb/authentication/token/TokenDynamicPropertiesManager.java
index c6ea891..b04617a 100644
---
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfigurationManager.java
+++
b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/TokenDynamicPropertiesManager.java
@@ -15,22 +15,21 @@
* limitations under the License.
*/
-package org.apache.servicecomb.authentication.resource;
+package org.apache.servicecomb.authentication.token;
import java.util.Map;
import org.apache.servicecomb.config.inject.ConfigObjectFactory;
-import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
-public class AccessConfigurationManager {
- private static final Map<String, AccessConfiguration> CONFIGURATIONS = new
ConcurrentHashMapEx<>();
+public class TokenDynamicPropertiesManager {
+ private static final Map<String, TokenDynamicProperties> CONFIGURATIONS =
new ConcurrentHashMapEx<>();
private static final ConfigObjectFactory FACTORY = new ConfigObjectFactory();
- public static AccessConfiguration getAccessConfiguration(Invocation
invocation) {
- return
CONFIGURATIONS.computeIfAbsent(invocation.getOperationMeta().getSchemaQualifiedName(),
key -> {
- return FACTORY.create(AccessConfiguration.class, "schemaId",
invocation.getSchemaId(), "operationId", invocation.getOperationName());
+ public static TokenDynamicProperties getTokenConfiguration(String username) {
+ return CONFIGURATIONS.computeIfAbsent(username, key -> {
+ return FACTORY.create(TokenDynamicProperties.class, "username",
username);
});
}
}
diff --git
a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/AuthHandler.java
b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/AuthHandler.java
index 1d1c165..a4b0849 100644
---
a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/AuthHandler.java
+++
b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/AuthHandler.java
@@ -42,7 +42,7 @@ public class AuthHandler implements Handler {
JWTTokenStore jwtTokenStore =
BeanUtils.getBean(CommonConstants.BEAN_AUTH_ID_TOKEN_STORE);
JWTToken jwtToken = jwtTokenStore.createTokenByValue(token);
if (jwtToken == null || jwtToken.isExpired()) {
- asyncResponse.consumerFail(new InvocationException(403, "forbidden",
"not authenticated"));
+ asyncResponse.consumerFail(new InvocationException(403, "forbidden",
"token expired or not valid."));
return;
}
diff --git
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfiguration.java
b/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessDynamicProperties.java
similarity index 86%
rename from
api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfiguration.java
rename to
api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessDynamicProperties.java
index 8167612..87fa951 100644
---
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfiguration.java
+++
b/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessDynamicProperties.java
@@ -21,17 +21,17 @@ import
org.apache.servicecomb.config.inject.InjectProperties;
import org.apache.servicecomb.config.inject.InjectProperty;
@InjectProperties(prefix = "servicecomb.authencation.access")
-public class AccessConfiguration {
+public class AccessDynamicProperties {
@InjectProperty(keys = {
- "needAuth.${schemaId}.${operationId}",
- "needAuth.${schemaId}",
+ "${schemaId}.${operationId}.needAuth",
+ "${schemaId}.needAuth",
"needAuth"},
defaultValue = "true")
public boolean needAuth;
@InjectProperty(keys = {
- "roles.${schemaId}.${operationId}",
- "roles.${schemaId}",
+ "${schemaId}.${operationId}.roles",
+ "${schemaId}.roles",
"roles"})
public String roles;
}
diff --git
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfigurationManager.java
b/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessDynamicPropertiesManager.java
similarity index 76%
rename from
api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfigurationManager.java
rename to
api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessDynamicPropertiesManager.java
index c6ea891..1910836 100644
---
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessConfigurationManager.java
+++
b/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AccessDynamicPropertiesManager.java
@@ -23,14 +23,14 @@ import
org.apache.servicecomb.config.inject.ConfigObjectFactory;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
-public class AccessConfigurationManager {
- private static final Map<String, AccessConfiguration> CONFIGURATIONS = new
ConcurrentHashMapEx<>();
+public class AccessDynamicPropertiesManager {
+ private static final Map<String, AccessDynamicProperties> CONFIGURATIONS =
new ConcurrentHashMapEx<>();
private static final ConfigObjectFactory FACTORY = new ConfigObjectFactory();
- public static AccessConfiguration getAccessConfiguration(Invocation
invocation) {
+ public static AccessDynamicProperties getAccessConfiguration(Invocation
invocation) {
return
CONFIGURATIONS.computeIfAbsent(invocation.getOperationMeta().getSchemaQualifiedName(),
key -> {
- return FACTORY.create(AccessConfiguration.class, "schemaId",
invocation.getSchemaId(), "operationId", invocation.getOperationName());
+ return FACTORY.create(AccessDynamicProperties.class, "schemaId",
invocation.getSchemaId(), "operationId", invocation.getOperationName());
});
}
}
diff --git
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AuthenticationAuthFilter.java
b/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AuthenticationAuthFilter.java
index 468f881..951abc3 100644
---
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AuthenticationAuthFilter.java
+++
b/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/AuthenticationAuthFilter.java
@@ -41,7 +41,7 @@ public class AuthenticationAuthFilter implements AuthFilter {
@Override
public void doFilter(Invocation invocation) throws InvocationException {
- AccessConfiguration config =
AccessConfigurationManager.getAccessConfiguration(invocation);
+ AccessDynamicProperties config =
AccessDynamicPropertiesManager.getAccessConfiguration(invocation);
// by pass authentication
if (!config.needAuth) {
diff --git
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/ConfigBasedAuthoriaztionAuthFilter.java
b/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/ConfigBasedAuthoriaztionAuthFilter.java
index e9a6086..5e2e90d 100644
---
a/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/ConfigBasedAuthoriaztionAuthFilter.java
+++
b/api/resource-server/endpoint/src/main/java/org/apache/servicecomb/authentication/resource/ConfigBasedAuthoriaztionAuthFilter.java
@@ -35,7 +35,7 @@ public class ConfigBasedAuthoriaztionAuthFilter implements
AuthFilter {
@Override
public void doFilter(Invocation invocation) throws InvocationException {
- AccessConfiguration config =
AccessConfigurationManager.getAccessConfiguration(invocation);
+ AccessDynamicProperties config =
AccessDynamicPropertiesManager.getAccessConfiguration(invocation);
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
// check roles
if (!StringUtils.isEmpty(config.roles)) {
diff --git a/docs/zh_CN/developersGuide.md b/docs/zh_CN/developersGuide.md
index 8d881ee..b06d223 100644
--- a/docs/zh_CN/developersGuide.md
+++ b/docs/zh_CN/developersGuide.md
@@ -163,12 +163,14 @@ servicecomb:
authencation:
access:
needAuth: true
- roles:
- HandlerAuthEndpoint:
- adminSayHello: ADMIN
- guestSayHello: GUEST
- guestOrAdminSayHello: ADMIN,GUEST
- # everyoneSayHello: all can
+ HandlerAuthEndpoint:
+ adminSayHello:
+ roles: ADMIN
+ guestSayHello:
+ roles: GUEST
+ guestOrAdminSayHello:
+ roles: ADMIN,GUEST
+ # everyoneSayHello: all can
```
还可以统一配置Schema
diff --git
a/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/AuthenticationConfiguration.java
b/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/AuthenticationConfiguration.java
index 169f28b..992bb33 100644
---
a/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/AuthenticationConfiguration.java
+++
b/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/AuthenticationConfiguration.java
@@ -52,21 +52,24 @@ public class AuthenticationConfiguration {
@Bean(name = CommonConstants.BEAN_AUTH_OPEN_ID_TOKEN_STORE)
public AbstractOpenIDTokenStore openIDTokenStore() {
- // TODO: Use in memory store for testing. Need to implement JDBC or Redis
SessionIDTokenStore in product.
+ // NOTICE: Use in memory store for testing. Need to implement JDBC or
Redis SessionIDTokenStore in product.
return new InMemoryOpenIDTokenStore();
}
@Bean(name = CommonConstants.BEAN_AUTH_USER_DETAILS_SERVICE)
public UserDetailsService authUserDetailsService(
@Autowired @Qualifier(CommonConstants.BEAN_AUTH_PASSWORD_ENCODER)
PasswordEncoder passwordEncoder) {
- // TODO: Use in memory UserDetails, need to implement JDBC or others in
product
+ // NOTICE: Use in memory UserDetails, need to implement JDBC or others in
product
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
UserDetails uAdmin = new User("admin",
passwordEncoder.encode("changeMyPassword"),
Arrays.asList(new SimpleGrantedAuthority("ADMIN")));
UserDetails uGuest = new User("guest",
passwordEncoder.encode("changeMyPassword"),
Arrays.asList(new SimpleGrantedAuthority("GUEST")));
+ UserDetails uGuestExpiresQuickly = new User("guestExpiresQuickly",
passwordEncoder.encode("changeMyPassword"),
+ Arrays.asList(new SimpleGrantedAuthority("GUEST")));
manager.createUser(uAdmin);
manager.createUser(uGuest);
+ manager.createUser(uGuestExpiresQuickly);
return manager;
}
}
diff --git a/samples/AuthenticationServer/src/main/resources/microservice.yaml
b/samples/AuthenticationServer/src/main/resources/microservice.yaml
index dfedc0f..35ac8bb 100644
--- a/samples/AuthenticationServer/src/main/resources/microservice.yaml
+++ b/samples/AuthenticationServer/src/main/resources/microservice.yaml
@@ -34,3 +34,9 @@ servicecomb:
rest:
address: 0.0.0.0:9091
+
+ authentication:
+ token:
+ expiresIn: 600
+ guestExpiresQuickly:
+ expiresIn: 3
diff --git
a/samples/Client/src/main/java/org/apache/servicecomb/authentication/AuthenticationTestCase.java
b/samples/Client/src/main/java/org/apache/servicecomb/authentication/AuthenticationTestCase.java
index 0b7601f..2b8fd5a 100644
---
a/samples/Client/src/main/java/org/apache/servicecomb/authentication/AuthenticationTestCase.java
+++
b/samples/Client/src/main/java/org/apache/servicecomb/authentication/AuthenticationTestCase.java
@@ -55,6 +55,7 @@ public class AuthenticationTestCase implements TestCase {
TokenResponse.class);
TestMgr.check(CommonConstants.TOKEN_TYPE_BEARER, token.getToken_type());
TestMgr.check(true, token.getId_token().length() > 10);
+ TestMgr.check(600, token.getExpires_in());
return token.getId_token();
}
@@ -118,6 +119,7 @@ public class AuthenticationTestCase implements TestCase {
name =
BootEventListener.resouceServerHandlerAuthEndpoint.postForObject("/guestSayHello?name=Hi",
new HttpEntity<>(headers),
String.class);
+ TestMgr.check("must fail", "not fail");
} catch (HttpClientErrorException e) {
TestMgr.check(403, e.getStatusCode().value());
}
@@ -150,6 +152,7 @@ public class AuthenticationTestCase implements TestCase {
name =
BootEventListener.resouceServerMethodAuthEndpoint.postForObject("/guestSayHello?name=Hi",
new HttpEntity<>(headers),
String.class);
+ TestMgr.check("must fail", "not fail");
} catch (HttpClientErrorException e) {
TestMgr.check(403, e.getStatusCode().value());
}
diff --git
a/samples/Client/src/main/java/org/apache/servicecomb/authentication/TestEndpoint.java
b/samples/Client/src/main/java/org/apache/servicecomb/authentication/TestEndpoint.java
index a89f8c2..68f727e 100644
---
a/samples/Client/src/main/java/org/apache/servicecomb/authentication/TestEndpoint.java
+++
b/samples/Client/src/main/java/org/apache/servicecomb/authentication/TestEndpoint.java
@@ -23,6 +23,7 @@ import org.apache.servicecomb.provider.rest.common.RestSchema;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.client.HttpClientErrorException;
@RestSchema(schemaId = "TestEndpoint")
@RequestMapping(path = "/v1/test")
@@ -43,16 +44,15 @@ public class TestEndpoint {
TestMgr.summary();
List<Throwable> errors = TestMgr.errors();
+ StringBuilder sb = new StringBuilder();
if (TestMgr.isSuccess()) {
- return TestMgr.successMessage();
+ sb.append(TestMgr.successMessage());
} else {
- StringBuilder sb = new StringBuilder();
sb.append("Failed count : " + errors.size());
sb.append("\n");
errors.forEach(t -> sb.append(t.getMessage() + "\n"));
-
- TestMgr.reset();
- return sb.toString();
}
+ TestMgr.reset();
+ return sb.toString();
}
}
diff --git
a/samples/Client/src/main/java/org/apache/servicecomb/authentication/AuthenticationTestCase.java
b/samples/Client/src/main/java/org/apache/servicecomb/authentication/TokenExpireTestCase.java
similarity index 53%
copy from
samples/Client/src/main/java/org/apache/servicecomb/authentication/AuthenticationTestCase.java
copy to
samples/Client/src/main/java/org/apache/servicecomb/authentication/TokenExpireTestCase.java
index 0b7601f..00a557e 100644
---
a/samples/Client/src/main/java/org/apache/servicecomb/authentication/AuthenticationTestCase.java
+++
b/samples/Client/src/main/java/org/apache/servicecomb/authentication/TokenExpireTestCase.java
@@ -28,23 +28,18 @@ import org.springframework.util.MultiValueMap;
import org.springframework.web.client.HttpClientErrorException;
@Component
-public class AuthenticationTestCase implements TestCase {
+public class TokenExpireTestCase implements TestCase {
@Override
public void run() {
String idToken = idToken();
testHanlderAuth(idToken);
- testMethodAuth(idToken);
-
- idToken = idTokenByRefreshToken();
- testHanlderAuth(idToken);
- testMethodAuth(idToken);
}
private String idToken() {
// get token
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("grant_type", "password");
- map.add("username", "admin");
+ map.add("username", "guestExpiresQuickly");
map.add("password", "changeMyPassword");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
@@ -54,43 +49,11 @@ public class AuthenticationTestCase implements TestCase {
new HttpEntity<>(map, headers),
TokenResponse.class);
TestMgr.check(CommonConstants.TOKEN_TYPE_BEARER, token.getToken_type());
+ TestMgr.check(3, token.getExpires_in());
TestMgr.check(true, token.getId_token().length() > 10);
return token.getId_token();
}
- private String idTokenByRefreshToken() {
- // get token
- MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
- map.add("grant_type", "password");
- map.add("username", "admin");
- map.add("password", "changeMyPassword");
- HttpHeaders headers = new HttpHeaders();
- headers.setContentType(MediaType.MULTIPART_FORM_DATA);
-
- TokenResponse token =
- BootEventListener.edgeServiceTokenEndpoint.postForObject("/",
- new HttpEntity<>(map, headers),
- TokenResponse.class);
- TestMgr.check(CommonConstants.TOKEN_TYPE_BEARER, token.getToken_type());
- TestMgr.check(true, token.getAccess_token().length() > 10);
-
- // refresh token
- map = new LinkedMultiValueMap<>();
- map.add("grant_type", "refresh_token");
- map.add("refresh_token", token.getRefresh_token());
-
- TokenResponse tokenNew =
- BootEventListener.edgeServiceTokenEndpoint.postForObject("/",
- new HttpEntity<>(map, headers),
- TokenResponse.class);
- TestMgr.check(token.getToken_type(), tokenNew.getToken_type());
-
TestMgr.check(token.getRefresh_token().equals(tokenNew.getRefresh_token()),
false);
- TestMgr.check(token.getAccess_token().equals(tokenNew.getAccess_token()),
false);
- TestMgr.check(token.getId_token().equals(tokenNew.getId_token()), false);
-
- return tokenNew.getId_token();
- }
-
private void testHanlderAuth(String accessToken) {
// get resources
HttpHeaders headers = new HttpHeaders();
@@ -103,56 +66,27 @@ public class AuthenticationTestCase implements TestCase {
String.class);
TestMgr.check("Hi", name);
- name =
BootEventListener.resouceServerHandlerAuthEndpoint.postForObject("/adminSayHello?name=Hi",
- new HttpEntity<>(headers),
- String.class);
- TestMgr.check("Hi", name);
-
name =
BootEventListener.resouceServerHandlerAuthEndpoint.postForObject("/guestOrAdminSayHello?name=Hi",
new HttpEntity<>(headers),
String.class);
TestMgr.check("Hi", name);
- name = null;
- try {
- name =
BootEventListener.resouceServerHandlerAuthEndpoint.postForObject("/guestSayHello?name=Hi",
- new HttpEntity<>(headers),
- String.class);
- } catch (HttpClientErrorException e) {
- TestMgr.check(403, e.getStatusCode().value());
- }
- TestMgr.check(null, name);
- }
-
- private void testMethodAuth(String accessToken) {
- // get resources
- HttpHeaders headers = new HttpHeaders();
- headers.add("Authorization", "Bearer " + accessToken);
- headers.setContentType(MediaType.APPLICATION_JSON);
- String name;
- name =
BootEventListener.resouceServerMethodAuthEndpoint.postForObject("/everyoneSayHello?name=Hi",
- new HttpEntity<>(headers),
- String.class);
- TestMgr.check("Hi", name);
-
- name =
BootEventListener.resouceServerMethodAuthEndpoint.postForObject("/adminSayHello?name=Hi",
- new HttpEntity<>(headers),
- String.class);
- TestMgr.check("Hi", name);
-
- name =
BootEventListener.resouceServerMethodAuthEndpoint.postForObject("/guestOrAdminSayHello?name=Hi",
+ name =
BootEventListener.resouceServerHandlerAuthEndpoint.postForObject("/guestSayHello?name=Hi",
new HttpEntity<>(headers),
String.class);
TestMgr.check("Hi", name);
- name = null;
+ // user guestExpiresQuickly token expires in 3 seconds
try {
- name =
BootEventListener.resouceServerMethodAuthEndpoint.postForObject("/guestSayHello?name=Hi",
+ Thread.sleep(3000);
+ name =
BootEventListener.resouceServerHandlerAuthEndpoint.postForObject("/guestSayHello?name=Hi",
new HttpEntity<>(headers),
String.class);
+ TestMgr.check("must fail", "not fail");
} catch (HttpClientErrorException e) {
TestMgr.check(403, e.getStatusCode().value());
+ } catch (Exception e2) {
+ TestMgr.failed("", e2);
}
- TestMgr.check(null, name);
}
}
diff --git a/samples/ResourceServer/src/main/resources/microservice.yaml
b/samples/ResourceServer/src/main/resources/microservice.yaml
index 69b0ffc..dc4e894 100644
--- a/samples/ResourceServer/src/main/resources/microservice.yaml
+++ b/samples/ResourceServer/src/main/resources/microservice.yaml
@@ -38,12 +38,14 @@ servicecomb:
authencation:
access:
needAuth: true
- roles:
- HandlerAuthEndpoint:
- adminSayHello: ADMIN
- guestSayHello: GUEST
- guestOrAdminSayHello: ADMIN,GUEST
- # everyoneSayHello: all can
+ HandlerAuthEndpoint:
+ adminSayHello:
+ roles: ADMIN
+ guestSayHello:
+ roles: GUEST
+ guestOrAdminSayHello:
+ roles: ADMIN,GUEST
+ # everyoneSayHello: all can
handler:
chain: