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:

Reply via email to