ここでは、GeneXusJWT モジュールを使用して、一般的な対称アルゴリズムでシンプルな JWT を作成する方法について説明します。
//******HEADER******//
//{
// "alg": "HS256",
// "typ": "JWT"
//}
//******PAYLOAD******//
//{
// "jti": "0696bb20-6223-4a1c-9ebf-e15c74387b9c",
// "iss": "example.com",
// "exp" : 1909649720,
// "company": "Example",
//}
//対称暗号化アルゴリズム (HS256) を使用しているため 16 進数のキーを取得
&symmetricKey = &SymmetricKeyGenerator.DoGenerateKey(SymmetricKeyType.GENERICRANDOM, 256)
//iss クレームを追加 (登録済みクレーム)
//登録済みクレームは必須ではないため、JWTOptions SDT で追加
//ドキュメンテーション: http://wiki.genexus.jp/hwikibypageid.aspx?43983
//JWT のクレームのタイプの詳細 http://wiki.genexus.jp/hwikibypageid.aspx?43981
&JWTOptions.AddRegisteredClaim(RegisteredClaim.iss, "example.com")
//exp クレームを追加 (時刻を検証する登録済みクレーム)//AddCustomTimeValidationClaim は、"yyyy/MM/dd HH:mm:ss" 形式の時刻で使用するメソッド
&JWTOptions.AddCustomTimeValidationClaim(RegisteredClaim.exp, "2030/07/07 10:15:20", "0")
&JWTOptions.AddRegisteredClaim(RegisteredClaim.jti, "0696bb20-6223-4a1c-9ebf-e15c74387b9c")
//シグネチャに使用するキーを追加
&JWTOptions.SetSecret(&symmetricKey)
&PrivateClaims.SetClaim("company","Example")
//DoCreate をトークンの署名およびエンコーディングに使用
//ドキュメンテーション: http://wiki.genexus.jp/hwikibypageid.aspx?43989
&token = &JWTCreator.DoCreate(JWTAlgorithm.HS256, &PrivateClaims, &JWTOptions)
if &JWTCreator.HasError()
msg("Error on creation: Code: " + &JWTCreator.GetErrorCode() + " Description: " + &JWTCreator.GetErrorDescription(), status)
else
msg("Correctly generated", status)
msg("Base 64 token: " + &token, status)
//JWTCeator オブジェクトには、プレーンテキストでエンコーディングされたトークンからヘッダーおよびペイロードを取得する関数もある
&header = &JWTCreator.GetHeader(&token)
msg("Token header: " + &header, status)
&payload = &JWTCreator.GetPayload(&token)
msg("Token payload: " + &payload, status)
&verification = &JWTCreator.DoVerify(&token, JWTAlgorithm.HS256, &PrivateClaims, &JWTOptions)
//この検証メソッドでは、シグネチャだけでなく、提供されたキーおよびクレームに照らし合わせて、受信したトークンを検証
//何らかの方法でトークンが変更されていた場合は失敗
//ほかのタイプのエラーについて、上記の仕様で失敗した場合は、false を返す
if &JWTCreator.HasError()
msg("Error on creation: Code: " + &JWTCreator.GetErrorCode() + " Description: " + &JWTCreator.GetErrorDescription(), status)
else
msg("Correctly verified.結果: " + &verification.ToString(), status)
endif
endif
|