This is an automated email from the ASF dual-hosted git repository.

mabin pushed a commit to branch houserush-sample
in repository https://gitbox.apache.org/repos/asf/servicecomb-samples.git

commit 3a458c2f13a88491b29f1f2794d495f84965a283
Author: liubao <[email protected]>
AuthorDate: Wed May 8 17:49:16 2019 +0800

    authentication: add tokens logic
---
 authentication/AuthenticationServer/pom.xml        |  9 +++
 .../AuthenticationConfiguration.java               | 28 ++++++++
 .../service/AuthenticationServiceImpl.java         | 45 ++++++++----
 .../servicecomb/authentication/user/Role.java      |  5 ++
 .../servicecomb/authentication/user/User.java      | 11 +++
 .../servicecomb/authentication/user/UserStore.java |  5 ++
 .../servicecomb/authentication/api/Token.java      | 76 +++++++++++++++++---
 .../servicecomb/authentication/jwt/JWTClaims.java  | 45 ++++++++++++
 .../authentication/jwt/JWTClaimsCommon.java        | 83 ++++++++++++++++++++++
 .../servicecomb/authentication/jwt/JWTHeader.java  | 25 +++++++
 .../servicecomb/authentication/jwt/JsonParser.java | 23 ++++++
 11 files changed, 330 insertions(+), 25 deletions(-)

diff --git a/authentication/AuthenticationServer/pom.xml 
b/authentication/AuthenticationServer/pom.xml
index 0c7a295..baaac03 100644
--- a/authentication/AuthenticationServer/pom.xml
+++ b/authentication/AuthenticationServer/pom.xml
@@ -47,6 +47,11 @@
         <version>0.0.1-SNAPSHOT</version>
       </dependency>
       <dependency>
+        <groupId>org.apache.servicecomb.authentication</groupId>
+        <artifactId>authentication-common-api-endpoint</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+      </dependency>
+      <dependency>
         <groupId>org.apache.servicecomb</groupId>
         <artifactId>java-chassis-dependencies</artifactId>
         <version>1.2.0</version>
@@ -77,6 +82,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.authentication</groupId>
+      <artifactId>authentication-common-api-endpoint</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb.authentication</groupId>
       <artifactId>authentication-server-api-endpoint</artifactId>
     </dependency>
     <dependency>
diff --git 
a/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/AuthenticationConfiguration.java
 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/AuthenticationConfiguration.java
new file mode 100644
index 0000000..77a6342
--- /dev/null
+++ 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/AuthenticationConfiguration.java
@@ -0,0 +1,28 @@
+package org.apache.servicecomb.authentication;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@Configuration
+public class AuthenticationConfiguration {
+  @Bean(name = "authPasswordEncoder")
+  private PasswordEncoder authPasswordEncoder() {
+    return new PasswordEncoder() {
+
+      @Override
+      public String encode(CharSequence rawPassword) {
+        // TODO Auto-generated method stub
+        return null;
+      }
+
+      @Override
+      public boolean matches(CharSequence rawPassword, String encodedPassword) 
{
+        // TODO Auto-generated method stub
+        return false;
+      }
+      
+    };
+  }
+  
+}
diff --git 
a/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/service/AuthenticationServiceImpl.java
 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/service/AuthenticationServiceImpl.java
index be46f5c..a6e856a 100644
--- 
a/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/service/AuthenticationServiceImpl.java
+++ 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/service/AuthenticationServiceImpl.java
@@ -19,34 +19,49 @@ package org.apache.servicecomb.authentication.service;
 
 import org.apache.servicecomb.authentication.api.AuthenticationService;
 import org.apache.servicecomb.authentication.api.Token;
+import org.apache.servicecomb.authentication.jwt.JWTClaims;
+import org.apache.servicecomb.authentication.jwt.JsonParser;
+import org.apache.servicecomb.authentication.user.User;
+import org.apache.servicecomb.authentication.user.UserStore;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.jwt.Jwt;
+import org.springframework.security.jwt.JwtHelper;
+import org.springframework.security.jwt.crypto.sign.Signer;
 import org.springframework.stereotype.Service;
 
 @Service
 public class AuthenticationServiceImpl implements AuthenticationService {
   @Autowired
-  @Qualifier("userDetailsService")
-  private UserDetailsService userDetailsService;
-  
+  @Qualifier("authUserStore")
+  private UserStore userStore;
+
   @Autowired
-  @Qualifier("passwordEncoder")
+  @Qualifier("authPasswordEncoder")
   private PasswordEncoder passwordEncoder;
 
+  @Autowired
+  @Qualifier("authSigner")
+  private Signer signer;
+
   @Override
   public Token login(String userName, String password) {
-    UserDetails userDetails;
-    try {
-      userDetails = userDetailsService.loadUserByUsername(userName);
-    } catch (UsernameNotFoundException e) {
-      return null;
-    }
-    if(passwordEncoder.matches(password, userDetails.getPassword())) {
-      return null;
+    User user = userStore.loadUserByUsername(userName);
+    if (passwordEncoder.matches(password, user.getPassword())) {
+      JWTClaims claims = new JWTClaims();
+      if (user.getRoles() != null) {
+        user.getRoles().forEach(role -> claims.addRole(role.getRoleName()));
+      }
+      claims.setScope("read");
+      String content = JsonParser.unparse(claims);
+      Jwt accessToken = JwtHelper.encode(content, signer);
+
+      Token token = new Token();
+      token.setExpires_in(10 * 60);
+      token.setToken_type("bearer");
+      token.setAccess_token(accessToken.getEncoded());
+      return token;
     } else {
       return null;
     }
diff --git 
a/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/Role.java
 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/Role.java
new file mode 100644
index 0000000..393cd3e
--- /dev/null
+++ 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/Role.java
@@ -0,0 +1,5 @@
+package org.apache.servicecomb.authentication.user;
+
+public interface Role {
+  String getRoleName();
+}
diff --git 
a/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/User.java
 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/User.java
new file mode 100644
index 0000000..b0ba017
--- /dev/null
+++ 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/User.java
@@ -0,0 +1,11 @@
+package org.apache.servicecomb.authentication.user;
+
+import java.util.Collection;
+
+public interface User {
+  Collection<Role> getRoles();
+
+  String getPassword();
+
+  String getUsername();
+}
diff --git 
a/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/UserStore.java
 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/UserStore.java
new file mode 100644
index 0000000..5bd8459
--- /dev/null
+++ 
b/authentication/AuthenticationServer/src/main/java/org/apache/servicecomb/authentication/user/UserStore.java
@@ -0,0 +1,5 @@
+package org.apache.servicecomb.authentication.user;
+
+public interface UserStore {
+  User loadUserByUsername(String userName);
+}
diff --git 
a/authentication/api/AuthenticationServer/service/src/main/java/org/apache/servicecomb/authentication/api/Token.java
 
b/authentication/api/AuthenticationServer/service/src/main/java/org/apache/servicecomb/authentication/api/Token.java
index 732fe22..94ce237 100644
--- 
a/authentication/api/AuthenticationServer/service/src/main/java/org/apache/servicecomb/authentication/api/Token.java
+++ 
b/authentication/api/AuthenticationServer/service/src/main/java/org/apache/servicecomb/authentication/api/Token.java
@@ -17,24 +17,80 @@
 
 package org.apache.servicecomb.authentication.api;
 
+import java.util.Map;
+import java.util.Set;
+
 public class Token {
-  private String accessToken;
+  // Naming conventions 
https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-00#section-3.1
+  private String token_type;
+
+  private String access_token;
+
+  private String refresh_token;
+
+  private int expires_in;
+
+  private Set<String> scope;
+
+  // JWT id
+  private String jti;
+
+  private Map<String, Object> additionalInformation;
 
-  private String refreshToken;
+  public String getToken_type() {
+    return token_type;
+  }
+
+  public void setToken_type(String token_type) {
+    this.token_type = token_type;
+  }
+
+  public String getAccess_token() {
+    return access_token;
+  }
+
+  public void setAccess_token(String access_token) {
+    this.access_token = access_token;
+  }
 
-  public String getAccessToken() {
-    return accessToken;
+  public String getRefresh_token() {
+    return refresh_token;
   }
 
-  public void setAccessToken(String accessToken) {
-    this.accessToken = accessToken;
+  public void setRefresh_token(String refresh_token) {
+    this.refresh_token = refresh_token;
   }
 
-  public String getRefreshToken() {
-    return refreshToken;
+  public int getExpires_in() {
+    return expires_in;
   }
 
-  public void setRefreshToken(String refreshToken) {
-    this.refreshToken = refreshToken;
+  public void setExpires_in(int expires_in) {
+    this.expires_in = expires_in;
   }
+
+  public Set<String> getScope() {
+    return scope;
+  }
+
+  public void setScope(Set<String> scope) {
+    this.scope = scope;
+  }
+
+  public String getJti() {
+    return jti;
+  }
+
+  public void setJti(String jti) {
+    this.jti = jti;
+  }
+
+  public Map<String, Object> getAdditionalInformation() {
+    return additionalInformation;
+  }
+
+  public void setAdditionalInformation(Map<String, Object> 
additionalInformation) {
+    this.additionalInformation = additionalInformation;
+  }
+
 }
diff --git 
a/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JWTClaims.java
 
b/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JWTClaims.java
new file mode 100644
index 0000000..569b4da
--- /dev/null
+++ 
b/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JWTClaims.java
@@ -0,0 +1,45 @@
+package org.apache.servicecomb.authentication.jwt;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+public class JWTClaims extends JWTClaimsCommon {
+  protected Set<String> roles = Collections.emptySet();
+
+  protected Map<String, Object> additionalInformation = Collections.emptyMap();
+
+  /**
+   * The scope of the access token as described by <a
+   * 
href="http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.3";>Section 
3.3</a>
+   */
+  protected String scope;
+
+  public Set<String> getRoles() {
+    return roles;
+  }
+
+  public void setRoles(Set<String> roles) {
+    this.roles = roles;
+  }
+
+  public Map<String, Object> getAdditionalInformation() {
+    return additionalInformation;
+  }
+
+  public void setAdditionalInformation(Map<String, Object> 
additionalInformation) {
+    this.additionalInformation = additionalInformation;
+  }
+
+  public String getScope() {
+    return scope;
+  }
+
+  public void setScope(String scope) {
+    this.scope = scope;
+  }
+
+  public void addRole(String role) {
+    this.roles.add(role);
+  }
+}
diff --git 
a/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JWTClaimsCommon.java
 
b/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JWTClaimsCommon.java
new file mode 100644
index 0000000..3b71a5c
--- /dev/null
+++ 
b/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JWTClaimsCommon.java
@@ -0,0 +1,83 @@
+package org.apache.servicecomb.authentication.jwt;
+
+public class JWTClaimsCommon {
+  // see: https://tools.ietf.org/html/rfc7519
+  // (Issuer) Claim
+  protected String iss;
+
+  // (Subject) Claim
+  protected String sub;
+
+  // (Audience) Claim
+  protected String aud;
+
+  // (Expiration Time) Claim
+  protected long exp;
+
+  // (Not Before) Claim
+  protected long nbf;
+
+  // (Issued At) Claim
+  protected long iat;
+
+  // (JWT ID) Claim
+  protected String jti;
+
+  public String getIss() {
+    return iss;
+  }
+
+  public void setIss(String iss) {
+    this.iss = iss;
+  }
+
+  public String getSub() {
+    return sub;
+  }
+
+  public void setSub(String sub) {
+    this.sub = sub;
+  }
+
+  public String getAud() {
+    return aud;
+  }
+
+  public void setAud(String aud) {
+    this.aud = aud;
+  }
+
+  public long getExp() {
+    return exp;
+  }
+
+  public void setExp(long exp) {
+    this.exp = exp;
+  }
+
+  public long getNbf() {
+    return nbf;
+  }
+
+  public void setNbf(long nbf) {
+    this.nbf = nbf;
+  }
+
+  public long getIat() {
+    return iat;
+  }
+
+  public void setIat(long iat) {
+    this.iat = iat;
+  }
+
+  public String getJti() {
+    return jti;
+  }
+
+  public void setJti(String jti) {
+    this.jti = jti;
+  }
+
+
+}
diff --git 
a/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JWTHeader.java
 
b/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JWTHeader.java
new file mode 100644
index 0000000..b4b1ae7
--- /dev/null
+++ 
b/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JWTHeader.java
@@ -0,0 +1,25 @@
+package org.apache.servicecomb.authentication.jwt;
+
+public class JWTHeader {
+  private String typ;
+
+  private String alg;
+
+  public String getTyp() {
+    return typ;
+  }
+
+  public void setTyp(String typ) {
+    this.typ = typ;
+  }
+
+  public String getAlg() {
+    return alg;
+  }
+
+  public void setAlg(String alg) {
+    this.alg = alg;
+  }
+
+
+}
diff --git 
a/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JsonParser.java
 
b/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JsonParser.java
new file mode 100644
index 0000000..37e54d7
--- /dev/null
+++ 
b/authentication/api/common/service/src/main/java/org/apache/servicecomb/authentication/jwt/JsonParser.java
@@ -0,0 +1,23 @@
+package org.apache.servicecomb.authentication.jwt;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class JsonParser {
+  private static final ObjectMapper MAPPER = new ObjectMapper();
+
+  public static <T> T parse(String json, Class<T> clazz) {
+    try {
+      return MAPPER.readValue(json, clazz);
+    } catch (Exception e) {
+      throw new IllegalArgumentException("Cannot parse json", e);
+    }
+  }
+
+  public static <T> String unparse(T obj) {
+    try {
+      return MAPPER.writeValueAsString(obj);
+    } catch (Exception e) {
+      throw new IllegalArgumentException("Cannot unparse json", e);
+    }
+  }
+}

Reply via email to