2016-01-25 22 views
3

我有一個已簽名的JWT字符串,我從服務器獲得。我不知道密鑰,或者我不想將密鑰放在客戶端/設備上。Android JWT在簽名時分析有效負載/聲明

當我的令牌使用此網站時:https://jwt.io/我得到了所需的結果,它告訴我Header和有效負載信息。

我無法找到一個Android的圖書​​館,做這個網站做什麼,我已經嘗試了所有我能找到的。最公認的一個使用是:https://github.com/jwtk/jjwt

但這給了我一個例外,我不能解析簽名的令牌,如上面的其他網站證明是錯誤的。我使用的另一個資源是:https://bitbucket.org/b_c/jose4j/wiki/Home

這一個至少給了我最遠的頭信息,我已經能夠得到。

爲了給出上下文爲什麼它是這樣的,有效載荷包含到期時間,並且在令牌即將到期時在設備上,我應該提示用戶重新輸入他們的憑證以獲得新的令牌。現在這可能看起來像一個安全威脅,因爲黑客可以操縱設備上的令牌,但服務器檢查令牌以確保它是可信的,這就是爲什麼我不需要設備上的密鑰,因爲這可以通過黑客,並使整個應用程序易受攻擊。

回答

1

那麼答案很簡單,但我認爲應該在框架中。但是一個簡單的非簽名JWT仍然有2個必需的時間段,但是最後一個沒有任何內容,所以我將JWT分成不同的時間段,並將第一個和第二個時間段合併爲一段時間,並在最後加上一段時間。

String[] splitToken = result.Value.Content.AuthorizationJWTToken.split("\\."); 
Jwt parsedToken = Jwts.parser().parse(splitToken[0] + "." + splitToken[1] + "."); 

這是使用在https://github.com/jwtk/jjwt庫。

1

您可以使用jose4j's JWT consumer僅進行解析而不檢查聲明或簽名。類似以下內容將解析令牌並將到期時間與當前時間進行比較,以查看它是否到期。

String jwt = "eyJhbGciOiJIUzI1NiJ9" + 
     ".eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNDUzODE0NjA0LCJuYW1lIjoiSm9obiBEb2UifQ" + 
     ".IXcDDLXEpGN9Po5C-Mz88jUCNYrHxu6TVJLavf0NgT8"; 

JwtConsumer consumer = new JwtConsumerBuilder() 
     .setSkipAllValidators() 
     .setDisableRequireSignature() 
     .setSkipSignatureVerification() 
     .build(); 
JwtClaims claims = consumer.processToClaims(jwt); 
NumericDate expirationTime = claims.getExpirationTime(); 

if (NumericDate.now().isAfter(expirationTime)) 
{ 
    System.out.println("Token expired at " + expirationTime); 
} 
else 
{ 
    System.out.println("Token is still good until " + expirationTime); 
} 
1

如果你想解析signatured文本不使用簽名:

1-添加以下的依賴:

//JWT 
compile 'io.jsonwebtoken:jjwt:0.7.0' 

2 - 添加以下的進口:

import io.jsonwebtoken.Claims; 
import io.jsonwebtoken.Header; 
import io.jsonwebtoken.Jwt; 
import io.jsonwebtoken.Jwts; 

使用3-下面的代碼塊:

//ref : https://github.com/jwtk/jjwt/issues/135 
//you can put your signatured text instead of jws variable. 
String jws = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"; 
int i = jws.lastIndexOf('.') 
String withoutSignature = jws.substring(0, i+1); 
Jwt<Header,Claims> untrusted = Jwts.parser().parseClaimsJwt(withoutSignature); 
/*untrusted.getBody().getSubject(); 
    untrusted.getBody().getExpiration(); 
    etc. 
*/