2016-06-14 15 views
1

最近Json Web Token(JWT)について知りました。私はそれがどのように動作するのが好きだったので、私は自分のプロジェクトでそれを実装し始めました。私のプロジェクトでは、通信するための2つのアプリケーションが必要です。 1つはアンドロイドアプリ、もう1つはLaravelウェブアプリケーションです。AndroidでJWTから署名、ヘッダー、本文を収集する方法

モバイルアプリは、ユーザーの認証情報がサーバー側から認証された後にログインします。

モバイルアプリからサーバーにユーザー名とパスワードを送信しました。文字列形式のJWTがあります。しかし、この時点以降、私はJWTのコンテンツを収集する方法を見つけることができませんでした。

私はほとんどすべての可能な結果(グーグルの結果)を見てきましたが、内容、署名、ヘッダーを取得できませんでした。

try { 
    Claims claims = Jwts.parser().parseClaimsJwt(jwtHeaderAndClaim).getBody(); 
    System.out.println("ID of the claims: " + claims.getId().toString()); 
    }catch (Exception e){ 
    Log.e("Exception: ", e.toString()); 
} 

上記のコードは、次のエラーを生成します。私は少しさらに、次のコードを使用していたと持っている方法の

一つ

は、私はsetSigningKey()を削除した気付きます
Exception: io.jsonwebtoken.PrematureJwtException: JWT must not be accepted before 2016-06-14T10:20:09+0300. Current time: 2016-06-14T10:19:37+0300´ 

jwtHeaderAndClaimは署名部分のみを削除した後のJWT文字列です(例: "xxxxxx.yyyyyyyy")。私が代わりにjwtHeaderAndClaimのjwtString(xxxxxxx.yyyyyyyy.ccccccc)を入れた場合、次のエラーが発生します。

Exception: io.jsonwebtoken.UnsupportedJwtException: Signed JWSs are not supported 

stormpath exampleに示したように、私はsetSigningKeyを置く場合:

Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret())).parseClaimsJwt(jwtString).getBody();. 

を上記のコードはしません2つの理由で動作します: 1.私はライブラリを持っていません import javax.xml.bind.DatatypeConverter; 2.鍵を取得する方法がわかりません。

しかし、今回は私がログインしてユーザー名(姓、名字、電話番号など)と署名(トークン)を収集しようとしているので、キーが必要ないことを知っています。サーバー側に格納するデータを送信するバックエンドにアクセスするためのトークンがあります。

誰でもお手伝いできますか?

答えて

0

多くの質問があります。私はそれらのいくつかに答えようとします

io.jsonwebtoken.PrematureJwtException: JWT must not be accepted before 2016-06-14T10:20:09+0300. Current time: 2016-06-14T10:19:37+0300´

あなたはJWTでnbf(以前はない)属性を使用しています。それを使用する(これはオプションです)またはデバイスのクロックがRFC 7519から

JWS

Exception: io.jsonwebtoken.UnsupportedJwtException: Signed JWSs are not supported

ドゥ署名

The "nbf" (not before) claim identifies the time before which the JWT MUST NOT be accepted for processing. The processing of the "nbf" claim requires that the current date/time MUST be after or equal to the not-before date/time listed in the "nbf" claim. Implementers MAY provide for some small leeway, usually no more than a few minutes, to account for clock skew. Its value MUST be a number containing a NumericDate value. Use of this claim is OPTIONAL.

を同期されませんことを考えると妥当性の範囲を設定しないでください。クライアント側またはサーバー側で署名鍵を検証する必要がありますか? ユーザー&のパスワードを置き換える認証にJWTを使用し、各要求でトークンを送信する場合は、サーバー側で署名を検証できます。

アプリのキーを検証する場合は、間違った手に落ちた場合に大きな脆弱性がある可能性があるため、対称キーは使用しないでください。 See。非対称鍵ペアを使用できます。サーバーのJWTに秘密鍵で署名し、公開鍵でデバイスで検証します。

  1. I don't have the library import javax.xml.bind.DatatypeConverter
String base64 = Base64.encodeToString(data, Base64.DEFAULT); 
byte[] data = Base64.decode(base64, Base64.DEFAULT); 
  1. I don't know how to get the key.

あなたの鍵は、おそらくこのように、サーバ側で

Key key = MacProvider.generateKey(SignatureAlgorithm.HS256); 
byte data[] = key.getEncoded(); 

を発生させたお好みの方法でクライアントへの鍵data[]利用可能にします。非対称キーを使用すると、公開キーを使用できるようにするだけです。

KeyPair keyPair = RsaProvider.generateKeyPair(); 
byte data[] = keyPair.getPublic().getEncoded(); 
関連する問題