2017-03-08 146 views
1

我想從WSO2 IS獲取JWT訪問令牌。我遵循msf4j Oauth2 Security Sample的指示,並設法通過resource owner password授權類型獲得JWT訪問令牌。 但我有問題外部驗證標記。WSO2IS JWT訪問令牌

似乎該標記沒有被默認的「wso2carbon.jks」簽名。

也,在「服務提供商」我的要求配置不是在JWT內容

所以我的問題體現在:如何配置在WSO2IS智威湯遜簽名證書?

還有: 如何操作JWT中的聲明?

我不想轉向「反思」端點了性能問題,而我的策略是隻相信,只有確保(本地)的JWT令牌

真實性,請建議

感謝

+0

我想你可以給看看此主題:http://stackoverflow.com/questions/42626010/mandatory-服務供應商索賠,總是問,和未返回功能於OpenID的PROFIL – Giovanni

回答

0

好吧,這似乎是我自己的錯。

我一直在使用jose4j JWT包,並不斷收到驗證失敗的消息。

經過進一步檢查進msf4j實現,我切換到nimbus-jose-jwt JWT包,得到它完成,

下面

是我的實現。

我個人認爲msf4j傢伙可能想看看。因爲他們在他們的實施中依賴於一個特定的別名(證書),但是你永遠不可能有任何想法(通過任何方式)你應該使用哪個證書來代替即將使用的證書,尤其是在聯合環境中......

說,我還需要弄清楚如何操縱在JWT令牌索賠...

import com.nimbusds.jose.JWSVerifier; 
import com.nimbusds.jose.crypto.RSASSAVerifier; 
import com.nimbusds.jwt.JWTClaimsSet; 
import com.nimbusds.jwt.SignedJWT; 
public class JwtParser { 

    private static final String KEYSTORE = System.getProperty("javax.net.ssl.trustStore"); 
    private static final String KEYSTORE_PASSWORD = System.getProperty("javax.net.ssl.trustStorePassword"); 

    private static Map<String, JWSVerifier> verifiers = getVerifiers(); 

    public static JWTClaimsSet verify(String jwt) throws Exception { 

       SignedJWT signedJWT = SignedJWT.parse(jwt); 
       if (!new Date().before(signedJWT.getJWTClaimsSet().getExpirationTime())) { 
        new Exception("token has expired"); 
       } 

       boolean notYet = true; 
       for(Iterator<JWSVerifier> it = verifiers.values().iterator(); notYet && it.hasNext();){ 
        JWSVerifier verifier = it.next(); 
        notYet = !signedJWT.verify(verifier); 
       } 

       if(notYet){ 
        throw new Exception("token verification failed"); 
       } 
       JWTClaimsSet claims = signedJWT.getJWTClaimsSet(); 
       if (claims == null) { 
        // Do something with claims 
        throw new Exception("non valid payload in token, failed"); 
       } 

       return claims; 
    } 

    private static Map<String, JWSVerifier> getVerifiers(){ 

     Map<String, JWSVerifier> verifiers = new HashMap<>(); 

     try (InputStream inputStream = new FileInputStream(KEYSTORE)) { 
      KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
      keystore.load(inputStream, KEYSTORE_PASSWORD.toCharArray()); 
      Enumeration<String> aliases = keystore.aliases(); 

      while(aliases.hasMoreElements()){ 
       String alias = aliases.nextElement(); 

       if(!keystore.isCertificateEntry(alias)){ 
        continue; 
       } 
       Certificate cert = keystore.getCertificate(alias); 
       if(cert == null){ 
        continue; 
       } 
       PublicKey key = cert.getPublicKey(); 
       verifiers.put(alias, new RSASSAVerifier((RSAPublicKey)key));   
      } 


     }catch(KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException e){ 
      //TODO: report the exception 
     } 
     return verifiers; 
    } 

}