[SCB-1365]add database implementations for OpenIDStore
diff --git a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/GithubTokenGranter.java b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/GithubTokenGranter.java
index 2840840..d8ed4ac 100644
--- a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/GithubTokenGranter.java
+++ b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/GithubTokenGranter.java
@@ -73,7 +73,7 @@
   }
 
   @Override
-  public TokenResponse grant(String code, String state, String login) {
+  public OpenIDToken grant(String code, String state, String login) {
     GithubAccessTokenResponse response = null;
     try {
       HttpHeaders headers = new HttpHeaders();
@@ -107,7 +107,7 @@
           response);
 
       openIDTokenStore.saveToken(openIDToken);
-      return TokenResponse.fromOpenIDToken(openIDToken);
+      return openIDToken;
     } catch (UsernameNotFoundException e) {
       return null;
     }
diff --git a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/PasswordTokenGranter.java b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/PasswordTokenGranter.java
index bb32d48..5740bc0 100644
--- a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/PasswordTokenGranter.java
+++ b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/PasswordTokenGranter.java
@@ -48,7 +48,7 @@
   private AbstractOpenIDTokenStore openIDTokenStore;
 
   @Override
-  public TokenResponse grant(Map<String, String> parameters) {
+  public OpenIDToken grant(Map<String, String> parameters) {
     String username = parameters.get(AuthenticationServerConstants.PARAM_USERNAME);
     String password = parameters.get(AuthenticationServerConstants.PARAM_PASSWORD);
 
@@ -61,7 +61,7 @@
       if (passwordEncoder.matches(password, userDetails.getPassword())) {
         OpenIDToken openIDToken = openIDTokenStore.createToken(userDetails);
         openIDTokenStore.saveToken(openIDToken);
-        return TokenResponse.fromOpenIDToken(openIDToken);
+        return openIDToken;
       } else {
         return null;
       }
diff --git a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/RefreshTokenTokenGranter.java b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/RefreshTokenTokenGranter.java
index a18bd2d..9204dc3 100644
--- a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/RefreshTokenTokenGranter.java
+++ b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/RefreshTokenTokenGranter.java
@@ -55,7 +55,7 @@
   }
 
   @Override
-  public TokenResponse grant(Map<String, String> parameters) {
+  public OpenIDToken grant(Map<String, String> parameters) {
     String refreshTokenValue = parameters.get(AuthenticationServerConstants.PARAM_REFRESH_TOKEN);
 
     if (StringUtils.isEmpty(refreshTokenValue)) {
@@ -65,10 +65,10 @@
     Token refreshToken = openIDTokenStore.readTokenByRefreshTokenValue(refreshTokenValue);
 
     if (refreshToken != null && !refreshToken.isExpired()) {
-      UserDetails userDetails = userDetailsService.loadUserByUsername(refreshToken.username());
+      UserDetails userDetails = userDetailsService.loadUserByUsername(refreshToken.getUsername());
       OpenIDToken openIDToken = openIDTokenStore.createToken(userDetails);
       openIDTokenStore.saveToken(openIDToken);
-      return TokenResponse.fromOpenIDToken(openIDToken);
+      return openIDToken;
     }
     return null;
   }
diff --git a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/ThirdPartyTokenGranter.java b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/ThirdPartyTokenGranter.java
index 1ef4fc8..788d31b 100644
--- a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/ThirdPartyTokenGranter.java
+++ b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/ThirdPartyTokenGranter.java
@@ -20,6 +20,7 @@
 import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.authentication.token.OpenIDToken;
 
 public interface ThirdPartyTokenGranter extends TokenGranter {
 
@@ -29,7 +30,7 @@
   }
 
   @Override
-  default TokenResponse grant(Map<String, String> parameters) {
+  default OpenIDToken grant(Map<String, String> parameters) {
     String provider = parameters.get(AuthenticationServerConstants.PARAM_PROVIDER);
     String code = parameters.get(AuthenticationServerConstants.PARAM_CODE);
     String state = parameters.get(AuthenticationServerConstants.PARAM_STATE);
@@ -49,7 +50,7 @@
 
   String name();
 
-  TokenResponse grant(String code, String state, String login);
+  OpenIDToken grant(String code, String state, String login);
   
   /**
    * In authorization code mode, need to get authentication provider information first.
diff --git a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/TokenEndpoint.java b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/TokenEndpoint.java
index fb849c1..bd7f8d8 100644
--- a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/TokenEndpoint.java
+++ b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/TokenEndpoint.java
@@ -22,6 +22,7 @@
 
 import javax.ws.rs.core.MediaType;
 
+import org.apache.servicecomb.authentication.token.OpenIDToken;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -36,12 +37,12 @@
 
   @Override
   @PostMapping(path = "/", consumes = MediaType.APPLICATION_FORM_URLENCODED)
-  public TokenResponse getToken(@RequestBody Map<String, String> parameters) {
+  public OpenIDToken getToken(@RequestBody Map<String, String> parameters) {
     String grantType = parameters.get(AuthenticationServerConstants.PARAM_GRANT_TYPE);
 
     for (TokenGranter granter : granters) {
       if (granter.enabled()) {
-        TokenResponse token = granter.grant(grantType, parameters);
+        OpenIDToken token = granter.grant(grantType, parameters);
         if (token != null) {
           return token;
         }
diff --git a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/TokenGranter.java b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/TokenGranter.java
index e5f600b..701958c 100644
--- a/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/TokenGranter.java
+++ b/api/authentication-server/endpoint/src/main/java/org/apache/servicecomb/authentication/server/TokenGranter.java
@@ -19,6 +19,8 @@
 
 import java.util.Map;
 
+import org.apache.servicecomb.authentication.token.OpenIDToken;
+
 /**
  * Token granter is used to grant access tokens. 
  * @author Administrator
@@ -29,12 +31,12 @@
 
   String grantType();
 
-  default TokenResponse grant(String grantType, Map<String, String> parameters) {
+  default OpenIDToken grant(String grantType, Map<String, String> parameters) {
     if (grantType().equals(grantType)) {
       return grant(parameters);
     }
     return null;
   }
 
-  TokenResponse grant(Map<String, String> parameters);
+  OpenIDToken grant(Map<String, String> parameters);
 }
diff --git a/api/authentication-server/service/src/main/java/org/apache/servicecomb/authentication/server/TokenService.java b/api/authentication-server/service/src/main/java/org/apache/servicecomb/authentication/server/TokenService.java
index 8dbd197..140ef61 100644
--- a/api/authentication-server/service/src/main/java/org/apache/servicecomb/authentication/server/TokenService.java
+++ b/api/authentication-server/service/src/main/java/org/apache/servicecomb/authentication/server/TokenService.java
@@ -19,6 +19,8 @@
 
 import java.util.Map;
 
+import org.apache.servicecomb.authentication.token.OpenIDToken;
+
 public interface TokenService {
-  TokenResponse getToken(Map<String, String> parameters);
+  OpenIDToken getToken(Map<String, String> parameters);
 }
diff --git a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/InMemoryOpenIDTokenStore.java b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/InMemoryOpenIDTokenStore.java
index 1a09f58..341f8fd 100644
--- a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/InMemoryOpenIDTokenStore.java
+++ b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/InMemoryOpenIDTokenStore.java
@@ -41,11 +41,6 @@
   }
 
   @Override
-  public OpenIDToken readTokenByIDTokenValue(String idTokenValue) {
-    return TOKENS_BY_ID_TOKEN_VALUE.get(idTokenValue);
-  }
-
-  @Override
   public void saveToken(OpenIDToken token) {
     TOKENS.put(token.getValue(), token);
     TOKENS_BY_REFRESH_TOKEN_VALUE.put(token.getRefreshToken().getValue(), token);
diff --git a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTToken.java b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTToken.java
index a4c6750..2ab1183 100644
--- a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTToken.java
+++ b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTToken.java
@@ -17,8 +17,78 @@
 
 package org.apache.servicecomb.authentication.token;
 
-import org.apache.servicecomb.authentication.jwt.JWTClaims;
+import java.util.Map;
 
-public interface JWTToken extends Token {
-  public JWTClaims getClaims();
+import org.apache.servicecomb.authentication.jwt.JWTClaims;
+import org.apache.servicecomb.authentication.jwt.JsonParser;
+import org.springframework.security.jwt.Jwt;
+import org.springframework.security.jwt.JwtHelper;
+import org.springframework.security.jwt.crypto.sign.Signer;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+
+public class JWTToken implements Token {
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 8234764050908891544L;
+
+  private JWTClaims claims;
+
+  private String value;
+
+  public JWTToken() {
+
+  }
+
+  public JWTToken(JWTClaims claims, Signer signer) {
+    this.claims = claims;
+    String content = JsonParser.unparse(claims);
+    Jwt jwtToken = JwtHelper.encode(content, signer);
+    this.value = jwtToken.getEncoded();
+  }
+
+  @Override
+  @JsonIgnore
+  public long getIssueAt() {
+    return this.claims.getIat();
+  }
+
+  @Override
+  @JsonIgnore
+  public long getExpiresIn() {
+    return this.claims.getExp();
+  }
+
+  @Override
+  @JsonIgnore
+  public long getNotBefore() {
+    return this.claims.getNbf();
+  }
+
+  @Override
+  public String getValue() {
+    return this.value;
+  }
+
+  @Override
+  public Map<String, Object> getAdditionalInformation() {
+    return this.claims.getAdditionalInformation();
+  }
+
+  @Override
+  @JsonIgnore
+  public String getUsername() {
+    return this.claims.getSub();
+  }
+
+  public JWTClaims getClaims() {
+    return this.claims;
+  }
+
+  @Override
+  public void addAdditionalInformation(String key, Object value) {
+    this.claims.addAdditionalInformation(key, value);
+  }
 }
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
deleted file mode 100644
index 1c8c133..0000000
--- a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/JWTTokenImpl.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.authentication.token;
-
-import java.util.Map;
-
-import org.apache.servicecomb.authentication.jwt.JWTClaims;
-import org.apache.servicecomb.authentication.jwt.JsonParser;
-import org.springframework.security.jwt.Jwt;
-import org.springframework.security.jwt.JwtHelper;
-import org.springframework.security.jwt.crypto.sign.Signer;
-
-public class JWTTokenImpl implements JWTToken {
-  private JWTClaims claims;
-
-  private boolean valueCalculated = false;
-
-  private String value;
-
-  private Signer signer;
-
-  public JWTTokenImpl(JWTClaims claims, Signer signer) {
-    this.claims = claims;
-    this.signer = signer;
-  }
-
-  @Override
-  public long getIssueAt() {
-    return this.claims.getIat();
-  }
-
-  @Override
-  public long getExpiresIn() {
-    return this.claims.getExp();
-  }
-
-  @Override
-  public long getNotBefore() {
-    return this.claims.getNbf();
-  }
-
-  @Override
-  public String getValue() {
-    if (!this.valueCalculated) {
-      String content = JsonParser.unparse(claims);
-      Jwt jwtToken = JwtHelper.encode(content, signer);
-      this.value = jwtToken.getEncoded();
-    }
-    return this.value;
-  }
-
-  @Override
-  public Map<String, Object> getAdditionalInformation() {
-    return this.claims.getAdditionalInformation();
-  }
-
-  @Override
-  public String username() {
-    return this.claims.getSub();
-  }
-
-  public JWTClaims getClaims() {
-    return this.claims;
-  }
-
-  @Override
-  public void addAdditionalInformation(String key, Object value) {
-    this.claims.addAdditionalInformation(key, value);
-  }
-}
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 5b74496..59dd6c7 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
@@ -52,7 +52,7 @@
     claims.setNbf(config.notBefore);
     // Maybe some other properties in future
 
-    return new JWTTokenImpl(claims, signer);
+    return new JWTToken(claims, signer);
   }
 
   public JWTToken createTokenByValue(String value) {
@@ -64,6 +64,6 @@
     } catch (Exception e) {
       return null;
     }
-    return new JWTTokenImpl(claims, signer);
+    return new JWTToken(claims, signer);
   }
 }
diff --git a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/OpenIDToken.java b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/OpenIDToken.java
index d82b663..c6fc36f 100644
--- a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/OpenIDToken.java
+++ b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/OpenIDToken.java
@@ -20,7 +20,14 @@
 import java.util.Map;
 import java.util.Set;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 public class OpenIDToken implements Token {
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 6252768307298115467L;
+
   private String tokenType;
 
   private SessionToken accessToken;
@@ -72,41 +79,49 @@
   }
 
   @Override
-  public String username() {
-    return accessToken.username();
+  @JsonIgnore
+  public String getUsername() {
+    return accessToken.getUsername();
   }
 
   @Override
+  @JsonIgnore
   public boolean isExpired() {
     return accessToken.isExpired();
   }
 
   @Override
+  @JsonIgnore
   public long getIssueAt() {
     return accessToken.getIssueAt();
   }
 
   @Override
+  @JsonIgnore
   public long getExpiresIn() {
     return accessToken.getExpiresIn();
   }
 
   @Override
+  @JsonIgnore
   public long getNotBefore() {
     return accessToken.getNotBefore();
   }
 
   @Override
+  @JsonIgnore
   public String getValue() {
     return accessToken.getValue();
   }
 
   @Override
+  @JsonIgnore
   public Map<String, Object> getAdditionalInformation() {
     return accessToken.getAdditionalInformation();
   }
 
   @Override
+  @JsonIgnore
   public void addAdditionalInformation(String key, Object value) {
     accessToken.addAdditionalInformation(key, value);
   }
diff --git a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/OpenIDTokenStore.java b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/OpenIDTokenStore.java
index cd65ead..4fdf6a2 100644
--- a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/OpenIDTokenStore.java
+++ b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/OpenIDTokenStore.java
@@ -23,8 +23,6 @@
 
   OpenIDToken readTokenByRefreshTokenValue(String refreshTokenValue);
 
-  OpenIDToken readTokenByIDTokenValue(String idTokenValue);
-  
   JWTToken createIDTokenByValue(String jwtTokenValue);
 
   void saveToken(OpenIDToken token);
diff --git a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionToken.java b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionToken.java
index c39cec4..7050843 100644
--- a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionToken.java
+++ b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionToken.java
@@ -17,5 +17,73 @@
 
 package org.apache.servicecomb.authentication.token;
 
-public interface SessionToken extends Token {
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class SessionToken implements Token {
+  private static final long serialVersionUID = -7783398248936167939L;
+
+  private String value;
+
+  private long issueAt;
+  
+  private long expiresIn;
+  
+  private long notBefore;
+
+  private String username;
+
+  private Map<String, Object> additionalInformation;
+
+  public SessionToken() {
+    
+  }
+  
+  public SessionToken(String username) {
+    this.value = UUID.randomUUID().toString();
+    this.issueAt = System.currentTimeMillis();
+    this.username = username;
+    TokenDynamicProperties config = TokenDynamicPropertiesManager.getTokenConfiguration(username);
+    this.expiresIn = config.expiresIn;
+    this.notBefore = config.notBefore;
+  }
+
+  @Override
+  public long getIssueAt() {
+    return this.issueAt;
+  }
+
+  @Override
+  public long getExpiresIn() {
+    return this.expiresIn;
+  }
+
+  @Override
+  public long getNotBefore() {
+    return this.notBefore;
+  }
+
+  @Override
+  public String getValue() {
+    return this.value;
+  }
+
+  @Override
+  public Map<String, Object> getAdditionalInformation() {
+    return additionalInformation;
+  }
+
+  @Override
+  public String getUsername() {
+    return this.username;
+  }
+
+  @Override
+  public void addAdditionalInformation(String key, Object value) {
+    if (additionalInformation == null) {
+      additionalInformation = new HashMap<>();
+    }
+    additionalInformation.put(key, value);
+  }
 }
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
deleted file mode 100644
index d409ee9..0000000
--- a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionTokenImpl.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.authentication.token;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-public class SessionTokenImpl implements SessionToken {
-  private String value;
-
-  private long issueAt;
-
-  private String username;
-
-  private TokenDynamicProperties config;
-
-  private Map<String, Object> additionalInformation;
-
-  public SessionTokenImpl(String username) {
-    this.value = UUID.randomUUID().toString();
-    this.issueAt = System.currentTimeMillis();
-    this.username = username;
-    this.config = TokenDynamicPropertiesManager.getTokenConfiguration(username);
-  }
-
-  @Override
-  public long getIssueAt() {
-    return this.issueAt;
-  }
-
-  @Override
-  public long getExpiresIn() {
-    return this.config.expiresIn;
-  }
-
-  @Override
-  public long getNotBefore() {
-    return this.config.notBefore;
-  }
-
-  @Override
-  public String getValue() {
-    return this.value;
-  }
-
-  @Override
-  public Map<String, Object> getAdditionalInformation() {
-    return additionalInformation;
-  }
-
-  @Override
-  public String username() {
-    return this.username;
-  }
-
-  @Override
-  public void addAdditionalInformation(String key, Object value) {
-    if (additionalInformation == null) {
-      additionalInformation = new HashMap<>();
-    }
-    additionalInformation.put(key, value);
-  }
-}
diff --git a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionTokenStore.java b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionTokenStore.java
index 59b23aa..631f3d7 100644
--- a/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionTokenStore.java
+++ b/api/common/service/src/main/java/org/apache/servicecomb/authentication/token/SessionTokenStore.java
@@ -23,7 +23,7 @@
 
   @Override
   public SessionToken createToken(UserDetails userDetails) {
-    return new SessionTokenImpl(userDetails.getUsername());
+    return new SessionToken(userDetails.getUsername());
   }
 
 }
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 ca51f89..55b1423 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
@@ -17,11 +17,15 @@
 
 package org.apache.servicecomb.authentication.token;
 
+import java.io.Serializable;
 import java.util.Map;
 
-public interface Token {
-  String username();
+import com.fasterxml.jackson.annotation.JsonIgnore;
 
+public interface Token extends Serializable {
+  String getUsername();
+
+  @JsonIgnore
   default boolean isExpired() {
     return (System.currentTimeMillis() < getNotBefore()) ||
         (System.currentTimeMillis() - getIssueAt() > getExpiresIn() * 1000);
@@ -36,6 +40,6 @@
   String getValue();
 
   Map<String, Object> getAdditionalInformation();
-  
+
   void addAdditionalInformation(String key, Object value);
 }
diff --git a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/AuthenticationServerTokenEndpoint.java b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/AuthenticationServerTokenEndpoint.java
index 50c29d3..18ad3af 100644
--- a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/AuthenticationServerTokenEndpoint.java
+++ b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/AuthenticationServerTokenEndpoint.java
@@ -20,12 +20,12 @@
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 
-import org.apache.servicecomb.authentication.server.TokenResponse;
+import org.apache.servicecomb.authentication.token.OpenIDToken;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
 public interface AuthenticationServerTokenEndpoint {
   @PostMapping(path = "/", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
-  public CompletableFuture<TokenResponse> getToken(@RequestBody Map<String, String> parameters);
+  public CompletableFuture<OpenIDToken> getToken(@RequestBody Map<String, String> parameters);
 }
diff --git a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/DumyEdgeTokenResponseProcessor.java b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/DumyEdgeTokenResponseProcessor.java
deleted file mode 100644
index 97dd3c4..0000000
--- a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/DumyEdgeTokenResponseProcessor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.authentication.edge;
-
-import org.apache.servicecomb.authentication.server.TokenResponse;
-
-public class DumyEdgeTokenResponseProcessor implements EdgeTokenResponseProcessor {
-  public DumyEdgeTokenResponseProcessor() {
-  }
-
-  @Override
-  public void process(TokenResponse tokenResponse) {
-  }
-
-}
diff --git a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/EdgeConfiguration.java b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/EdgeConfiguration.java
index 4142c4f..bcb48a8 100644
--- a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/EdgeConfiguration.java
+++ b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/EdgeConfiguration.java
@@ -17,16 +17,9 @@
 
 package org.apache.servicecomb.authentication.edge;
 
-import org.apache.servicecomb.authentication.util.CommonConstants;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.core.annotation.Order;
 
 @Configuration
 public class EdgeConfiguration {
-  @Bean(name = {CommonConstants.BEAN_AUTH_EDGE_TOKEN_RESPONSE_PROCESSOR})
-  @Order(CommonConstants.BEAN_DEFAULT_ORDER)
-  public EdgeTokenResponseProcessor edgeTokenResponseProcessor() {
-    return new DumyEdgeTokenResponseProcessor();
-  }
+
 }
diff --git a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/EdgeTokenResponseProcessor.java b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/EdgeTokenResponseProcessor.java
deleted file mode 100644
index 09ea7b3..0000000
--- a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/EdgeTokenResponseProcessor.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.authentication.edge;
-
-import org.apache.servicecomb.authentication.server.TokenResponse;
-
-public interface EdgeTokenResponseProcessor {
-  void process(TokenResponse tokenResponse);
-}
diff --git a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/TokenEndpoint.java b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/TokenEndpoint.java
index 578f71a..ffafe1a 100644
--- a/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/TokenEndpoint.java
+++ b/api/edge-service/endpoint/src/main/java/org/apache/servicecomb/authentication/edge/TokenEndpoint.java
@@ -20,12 +20,9 @@
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 
-import org.apache.servicecomb.authentication.server.TokenResponse;
-import org.apache.servicecomb.authentication.util.CommonConstants;
+import org.apache.servicecomb.authentication.token.OpenIDToken;
 import org.apache.servicecomb.provider.pojo.RpcReference;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -37,21 +34,16 @@
   @RpcReference(microserviceName = "authentication-server", schemaId = "TokenEndpoint")
   private AuthenticationServerTokenEndpoint authenticationSererTokenEndpoint;
 
-  @Autowired
-  @Qualifier(CommonConstants.BEAN_AUTH_EDGE_TOKEN_RESPONSE_PROCESSOR)
-  private EdgeTokenResponseProcessor edgeTokenResponseProcessor;
-
   @Override
   @PostMapping(path = "/", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
   public CompletableFuture<TokenResponse> getToken(@RequestBody Map<String, String> parameters) {
     CompletableFuture<TokenResponse> result = new CompletableFuture<>();
 
-    CompletableFuture<TokenResponse> response =
+    CompletableFuture<OpenIDToken> response =
         authenticationSererTokenEndpoint.getToken(parameters);
     response.whenComplete((tokenResonse, ex) -> {
       if (!response.isCompletedExceptionally()) {
-        result.complete(tokenResonse);
-        edgeTokenResponseProcessor.process(tokenResonse);
+        result.complete(TokenResponse.fromOpenIDToken(tokenResonse));
       } else {
         result.completeExceptionally(ex);
       }
diff --git a/api/authentication-server/service/src/main/java/org/apache/servicecomb/authentication/server/TokenResponse.java b/api/edge-service/service/src/main/java/org/apache/servicecomb/authentication/edge/TokenResponse.java
similarity index 97%
rename from api/authentication-server/service/src/main/java/org/apache/servicecomb/authentication/server/TokenResponse.java
rename to api/edge-service/service/src/main/java/org/apache/servicecomb/authentication/edge/TokenResponse.java
index 32e7fb5..9fc7b67 100644
--- a/api/authentication-server/service/src/main/java/org/apache/servicecomb/authentication/server/TokenResponse.java
+++ b/api/edge-service/service/src/main/java/org/apache/servicecomb/authentication/edge/TokenResponse.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.authentication.server;
+package org.apache.servicecomb.authentication.edge;
 
 import java.util.Map;
 import java.util.Set;
diff --git a/api/edge-service/service/src/main/java/org/apache/servicecomb/authentication/edge/TokenService.java b/api/edge-service/service/src/main/java/org/apache/servicecomb/authentication/edge/TokenService.java
index 5e12a45..e279986 100644
--- a/api/edge-service/service/src/main/java/org/apache/servicecomb/authentication/edge/TokenService.java
+++ b/api/edge-service/service/src/main/java/org/apache/servicecomb/authentication/edge/TokenService.java
@@ -20,8 +20,6 @@
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 
-import org.apache.servicecomb.authentication.server.TokenResponse;
-
 
 public interface TokenService {
   CompletableFuture<TokenResponse> getToken(Map<String, String> parameters);
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 0e4b462..854c940 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
@@ -17,8 +17,6 @@
 
 package org.apache.servicecomb.authentication;
 
-import org.apache.servicecomb.authentication.token.AbstractOpenIDTokenStore;
-import org.apache.servicecomb.authentication.token.InMemoryOpenIDTokenStore;
 import org.apache.servicecomb.authentication.util.CommonConstants;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -40,10 +38,4 @@
     // If using MacSigner, need to protect the shared key by properly encryption.
     return new MacSigner("Please change this key.");
   }
-
-  @Bean(name = CommonConstants.BEAN_AUTH_OPEN_ID_TOKEN_STORE)
-  public AbstractOpenIDTokenStore openIDTokenStore() {
-    // NOTICE: Use in memory store for testing. Need to implement JDBC or Redis SessionIDTokenStore in product. 
-    return new InMemoryOpenIDTokenStore();
-  }
 }
diff --git a/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/JDBCOpenIDTokenStore.java b/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/JDBCOpenIDTokenStore.java
new file mode 100644
index 0000000..0163612
--- /dev/null
+++ b/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/JDBCOpenIDTokenStore.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.authentication;
+
+import org.apache.servicecomb.authentication.jwt.JsonParser;
+import org.apache.servicecomb.authentication.token.AbstractOpenIDTokenStore;
+import org.apache.servicecomb.authentication.token.OpenIDToken;
+import org.apache.servicecomb.authentication.user.TokenMapper;
+import org.apache.servicecomb.authentication.util.CommonConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component(CommonConstants.BEAN_AUTH_OPEN_ID_TOKEN_STORE)
+public class JDBCOpenIDTokenStore extends AbstractOpenIDTokenStore {
+  @Autowired
+  private TokenMapper tokenMapper;
+
+  @Override
+  public OpenIDToken readTokenByValue(String value) {
+    String tokenInfo = tokenMapper.getTokenInfoByAccessTokenId(value);
+    if (tokenInfo != null) {
+      return JsonParser.parse(tokenInfo, OpenIDToken.class);
+    }
+    return null;
+  }
+
+  @Override
+  public OpenIDToken readTokenByRefreshTokenValue(String refreshTokenValue) {
+    String tokenInfo = tokenMapper.getTokenInfoByRefreshTokenId(refreshTokenValue);
+    if (tokenInfo != null) {
+      return JsonParser.parse(tokenInfo, OpenIDToken.class);
+    }
+    return null;
+  }
+
+  @Override
+  public void saveToken(OpenIDToken token) {
+    tokenMapper.insertNewToken(token.getValue(),
+        token.getRefreshToken().getValue(),
+        JsonParser.unparse(token));
+  }
+
+}
diff --git a/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/TokenMapper.java b/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/TokenMapper.java
new file mode 100644
index 0000000..7ef3f22
--- /dev/null
+++ b/samples/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/TokenMapper.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.authentication.user;
+
+import org.apache.ibatis.annotations.Param;
+
+public interface TokenMapper {
+  public void insertNewToken(@Param("accessTokenId") String accessTokenId,
+      @Param("refreshTokenId") String refreshTokenId,
+      @Param("tokenInfo") String tokenInfo);
+
+  public String getTokenInfoByAccessTokenId(@Param("accessTokenId") String accessTokenId);
+
+  public String getTokenInfoByRefreshTokenId(@Param("refreshTokenId") String refreshTokenId);
+
+  public String getTokenInfoByIdTokenId(@Param("idTokenId") String idTokenId);
+}
diff --git a/samples/AuthenticationServer/src/main/resources/META-INF/spring/authentication.server.bean.xml b/samples/AuthenticationServer/src/main/resources/META-INF/spring/authentication.server.bean.xml
index dac1cdf..08ebeb0 100644
--- a/samples/AuthenticationServer/src/main/resources/META-INF/spring/authentication.server.bean.xml
+++ b/samples/AuthenticationServer/src/main/resources/META-INF/spring/authentication.server.bean.xml
@@ -38,5 +38,9 @@
       value="org.apache.servicecomb.authentication.user.UserMapper" />
     <property name="sqlSessionFactory" ref="sqlSessionFactory" />
   </bean>
-
+  <bean id="tokenMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
+    <property name="mapperInterface"
+      value="org.apache.servicecomb.authentication.user.TokenMapper" />
+    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
+  </bean>
 </beans>
\ No newline at end of file
diff --git a/samples/AuthenticationServer/src/main/resources/config/TokenMapper.xml b/samples/AuthenticationServer/src/main/resources/config/TokenMapper.xml
new file mode 100644
index 0000000..8d702f9
--- /dev/null
+++ b/samples/AuthenticationServer/src/main/resources/config/TokenMapper.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ~ Licensed to the Apache Software Foundation (ASF) under one or more 
+  ~ contributor license agreements. See the NOTICE file distributed with ~ 
+  this work for additional information regarding copyright ownership. ~ The 
+  ASF licenses this file to You under the Apache License, Version 2.0 ~ (the 
+  "License"); you may not use this file except in compliance with ~ the License. 
+  You may obtain a copy of the License at ~ ~ http://www.apache.org/licenses/LICENSE-2.0 
+  ~ ~ Unless required by applicable law or agreed to in writing, software ~ 
+  distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT 
+  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the 
+  License for the specific language governing permissions and ~ limitations 
+  under the License. -->
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.servicecomb.authentication.user.TokenMapper">
+  <insert id="insertNewToken">
+    insert into
+    T_TOKENS(ACCESS_TOKEN_VALUE,REFRESH_TOKEN_VALUE,TOKEN)
+    values(#{accessTokenId},#{refreshTokenId},#{tokenInfo})
+  </insert>
+
+  <select id="getTokenInfoByAccessTokenId" parameterType="java.lang.String"
+    resultType="java.lang.String">
+    select TOKEN
+    from T_TOKENS where ACCESS_TOKEN_VALUE =
+    #{accessTokenId}
+  </select>
+
+  <select id="getTokenInfoByRefreshTokenId" parameterType="java.lang.String"
+    resultType="java.lang.String">
+    select TOKEN
+    from T_TOKENS where REFRESH_TOKEN_VALUE =
+    #{refreshTokenId}
+  </select>
+</mapper>
\ No newline at end of file
diff --git a/samples/AuthenticationServer/src/main/resources/config/mybatis-config.xml b/samples/AuthenticationServer/src/main/resources/config/mybatis-config.xml
index 2bd7b68..9290b3f 100644
--- a/samples/AuthenticationServer/src/main/resources/config/mybatis-config.xml
+++ b/samples/AuthenticationServer/src/main/resources/config/mybatis-config.xml
@@ -15,7 +15,8 @@
   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
-    <mappers>
-        <mapper resource="config/UserMapper.xml"/>
-    </mappers>
+  <mappers>
+    <mapper resource="config/UserMapper.xml" />
+    <mapper resource="config/TokenMapper.xml" />
+  </mappers>
 </configuration>
\ No newline at end of file
diff --git a/samples/AuthenticationServer/src/main/resources/sql/user.sql b/samples/AuthenticationServer/src/main/resources/sql/user.sql
index 223826d..b5dbfc7 100644
--- a/samples/AuthenticationServer/src/main/resources/sql/user.sql
+++ b/samples/AuthenticationServer/src/main/resources/sql/user.sql
@@ -73,7 +73,6 @@
   `ID` INTEGER(8) NOT NULL AUTO_INCREMENT,
   `ACCESS_TOKEN_VALUE` VARCHAR(256) NOT NULL,
   `REFRESH_TOKEN_VALUE` VARCHAR(256) NOT NULL,
-  `ID_TOKEN_VALUE` VARCHAR(256) NOT NULL,
   `TOKEN` TEXT NOT NULL,
   PRIMARY KEY (`ID`)
 );
diff --git a/samples/Client/pom.xml b/samples/Client/pom.xml
index 5bbe9d8..b6b3220 100644
--- a/samples/Client/pom.xml
+++ b/samples/Client/pom.xml
@@ -33,7 +33,7 @@
     <dependencies>
       <dependency>
         <groupId>org.apache.servicecomb.authentication</groupId>
-        <artifactId>authentication-server-api-service</artifactId>
+        <artifactId>authentication-edge-api-service</artifactId>
         <version>0.0.1-SNAPSHOT</version>
       </dependency>
       <dependency>
@@ -64,7 +64,7 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.servicecomb.authentication</groupId>
-      <artifactId>authentication-server-api-service</artifactId>
+      <artifactId>authentication-edge-api-service</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
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 2b8fd5a..7acb34d 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
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.authentication;
 
-import org.apache.servicecomb.authentication.server.TokenResponse;
+import org.apache.servicecomb.authentication.edge.TokenResponse;
 import org.apache.servicecomb.authentication.util.CommonConstants;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
diff --git a/samples/Client/src/main/java/org/apache/servicecomb/authentication/TokenExpireTestCase.java b/samples/Client/src/main/java/org/apache/servicecomb/authentication/TokenExpireTestCase.java
index 00a557e..766aba0 100644
--- a/samples/Client/src/main/java/org/apache/servicecomb/authentication/TokenExpireTestCase.java
+++ b/samples/Client/src/main/java/org/apache/servicecomb/authentication/TokenExpireTestCase.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.authentication;
 
-import org.apache.servicecomb.authentication.server.TokenResponse;
+import org.apache.servicecomb.authentication.edge.TokenResponse;
 import org.apache.servicecomb.authentication.util.CommonConstants;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;