jawa-jwtを用いたJWTによるアクセストークン取得ができない【Service Account認証】
## やりたいこと
Service Account認証のために必要なJWTを、https://developers.worksmobile.com/jp/reference/authorization-sa?lang=ja内で提示していただいたライブラリの1つであるjava-jwtを用いて生成しようと考えています。
Service Account認証(JWT) - Using APIs -LINhttps://developers.worksmobile.com/jp/reference/authorization-sa?lang=ja
## 問題のコード
以下、jawa-jwtを参考に作成したコードです。
```Java
//秘密鍵の設定
String privateKey = {"-----BEGIN PRIVATE KEY-----" と改行、"-----END PRIVATE KEY-----" を除去した秘密鍵};
//ヘッダーの設定
Map<String, Object> headerClaims = new HashMap();
//ヘッダーのalg と typ は自動で付与されるため何も書かない
//ペイロードの設定
Map<String, Object> payloadClaims = new HashMap<>();
payloadClaims.put("iss", "Client ID");
payloadClaims.put("sub", "Service Account");
payloadClaims.put("iat", "JWT生成日時");
payloadClaims.put("exp", "JWT満了日時");
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] keyContentAsBytes = Base64.getDecoder().decode(privateKey);
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(keyContentAsBytes)
//RSA256を用いた電子署名
try {
RSAPrivateKey privKey = (RSAPrivateKey)keyFactory.generatePrivate(privSpec);
Algorithm algorithm = Algorithm.RSA256(null, privKey);
String token = JWT.create()
.withHeader(headerClaims)
.withPayload(payloadClaims)
.sign(algorithm);
System.out.println("JWT = " + token );
} catch (JWTCreationException exception){
//Invalid Signing configuration / Couldn't convert Claims.
}```
これを実行すると、正常に動作してJWTが生成されるのですが、Postmanを用いてアクセストークン発行URLの実行を試みると「500 Internal Server Error」が発生してしまいます。おそらくLINEWORKS用のJWTが正常に生成されていないのだと思われます。
どこが間違っているのか、確認をお願いできないでしょうか。
一応、ヘッダーとペイロード情報はJWT.create()で正常にBASE64エンコードできたことは確認済みです。
投稿に新しいコメントが追加されましたら通知を送信します。
コメント1
업데이트 된 답글입니다.
im 投稿者
原因は一番初めの 「privateKey に指定していた秘密鍵が最新のものではない」ことが原因でした。
privateKey を最新の状態にして生成したJWTを用いれば正常にアクセストークンの取得ができることを確認しました(添付画像追加)。
上のコードを貼り付ければJava上でJWTが取得できるので情報共有として残します。
2022.05.19
まだ、解決できませんか?
今すぐ実際に使用しているLINE WORKSユーザーに質問してみましょう。