編集:私は答えを見つけました。この質問の一番下までスクロールします。
NodeJS認証サーバーで作業しており、Google署名を使用してJSON Web Token(JWT)に署名したいと思います。
Google Cloud Key Management Service(KMS)を使用しており、キーリングと非対称署名キーを作成しました。
これは、署名を取得するための私のコードです。
signatureObject = await client.asymmetricSign({ name, digest })
signature = signatureObject["0"].signature
私のGoogle署名オブジェクトは次のようになります。
私の質問:Googleの署名を使用してJWTに署名するにはどうすればよいですか?
つまり、Googleの署名をJWTの(header.payload)に連結するにはどうすればよいですか?
JWTは次のようになります。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. (GoogleSignature)
私が使用しているコード:
署名:
async function sign(message, name) {
hashedMessage = crypto.createHash('sha256').update(message).digest('base64');
digest = { 'sha256': hashedMessage }
signatureObject = await client.asymmetricSign({ name, digest }).catch((err) => console.log(err))
signature = signatureObject["0"].signature
signJWT(signature)
}
JWTの作成:
function signJWT(signature) {
header = {
alg: "RS256",
typ: "JWT"
}
payload = {
sub: "1234567890",
name: "John Doe",
iat: 1516239022
}
JWT = base64url(JSON.stringify(header)) + "." +
base64url(JSON.stringify(payload)) + "." +
???signature??? ; // what goes here?
}
検証:
async function validateSignature(message, signature) {
// Get public key
publicKeyObject = await client.getPublicKey({ name }).catch((err) => console.log(err))
publicKey = publicKeyObject["0"].pem
//Verify signature
var verifier = crypto.createVerify('sha256');
verifier.update(message)
var ver = verifier.verify(publicKey, signature, 'base64')
// Returns either true for a valid signature, or false for not valid.
return ver
}
答え:
toString()メソッドは次のように使用できます。
signatureString = signature.toString('base64');
そして、を使用して元の署名オクテットストリームを取得できます
var buffer = Buffer.from(theString, 'base64');
質問にコードを投稿しなかったため、署名用のJWTをどのように構築しているかわかりません。
[質問にコードを追加した後、2019年1月18日編集]
あなたのコードは署名を逆方向に行っています。署名を作成し、それをJWTヘッダー+ペイロードに添付しようとしています。代わりに、JWTヘッダー+ペイロードを取得してそのデータに署名してから、署名をJWTに添付して、Signed-JWTを作成します。
ソースコードを使用した擬似コード:
body_b64 = base64url(JSON.stringify(header)) + "." + base64url(JSON.stringify(payload))
signature = sign(body_b64, name);
jwt = body_b64 + '.' + base64url(signature)
注:署名が返されるデータ形式がわかりませんsignatureObject["0"].signature
。base64に変換する前に、これを変換する必要がある場合があります。
[編集終了]
データ例:
JWTヘッダー:
{
alg: RS256
kid: 0123456789abcdef62afcbbf01234567890abcdef
typ: JWT
}
JWTペイロード:
{
"azp": "123456789012-gooddogsgotoheaven.apps.googleusercontent.com",
"aud": "123456789012-gooddogsgotoheaven.apps.googleusercontent.com",
"sub": "123456789012345678901",
"scope": "https://www.googleapis.com/auth/cloud-platform",
"exp": "1547806224",
"expires_in": "3596",
"email": "[email protected]",
"email_verified": "true",
"access_type": "offline"
}
アルゴリズム:
SHA256withRSA
署名付きJWT(JWS)を作成するには:
ステップ1:JWTヘッダーを取得し、Base-64に変換します。これをhdr_b64と呼びましょう。
ステップ2:JWTペイロードを取得し、Base-64に変換します。これをpayload_b64と呼びましょう。
ステップ3:エンコードされたヘッダーとペイロードをドット.
で連結しhdr_b64
ます:+ '。' + payload_b64`。これをbody_b64と呼びましょう。
ステップ4:通常、JWSは、秘密鍵を使用して「RS256」と呼ばれることが多いSHA256withRSAで署名されます。
signature = sign(body_b64, RS256, private_key)
次に、署名をBase-64に変換します。このsignature_b64を呼び出しましょう。
最終的なJWSを作成するには:
jws = body_b64 + '。' + signature_b64。
推奨事項:
KMSを使用して署名付きJWTを作成しますか?私はこれをお勧めしません。KMSに保存されているキーにアクセスするにはコストがかかります。署名済み-JWTは秘密鍵で署名され、公開鍵で検証されます。公開鍵をどのように公開しますか?秘密鍵と公開鍵にアクセスするには、どのようなパフォーマンスレベルが必要ですか(署名と検証の頻度)。
Google Cloud Platformでサービスアカウントを作成すると、キーペアが作成されます。このキーペアには、インターネットで利用可能な公開キーのIDがあり、秘密キーはサービスアカウントのJson資格情報ファイルに存在します。KMSのキーペアの代わりに、サービスアカウントを使用してSigned-JWTを作成します。
作成して署名するPythonのサンプルコード:
def create_signed_jwt(pkey, pkey_id, email, scope):
'''
Create a Signed JWT from a service account Json credentials file
This Signed JWT will later be exchanged for an Access Token
'''
import jwt
# Google Endpoint for creating OAuth 2.0 Access Tokens from Signed-JWT
auth_url = "https://www.googleapis.com/oauth2/v4/token"
issued = int(time.time())
expires = issued + expires_in # expires_in is in seconds
# Note: this token expires and cannot be refreshed. The token must be recreated
# JWT Headers
headers = {
"kid": pkey_id, # This is the service account private key ID
"alg": "RS256",
"typ": "JWT" # Google uses SHA256withRSA
}
# JWT Payload
payload = {
"iss": email, # Issuer claim
"sub": email, # Issuer claim
"aud": auth_url, # Audience claim
"iat": issued, # Issued At claim
"exp": expires, # Expire time
"scope": scope # Permissions
}
# Encode the headers and payload and sign creating a Signed JWT (JWS)
sig = jwt.encode(payload, pkey, algorithm="RS256", headers=headers)
return sig
Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。
メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.
ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。
ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.
Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
写真:ゲッティイメージズ。「最近の米国の選挙に関するロシアの活動と意図の評価」に関するFBI、CIA、およびNSAからの機密解除された文書は、「ロシアのウラジーミル・プーチン大統領が米国大統領選挙に影響を与えるキャンペーンを命じた」と主張している。
ペニーは、2006年7月6日、イリノイ州グレンビューのグレンビューコイン&コレクティブルズに展示されています。合計5,000ドル以上で、News-Starは報告します。
19世紀のフランスの版画サラ・バートマンのラベル・ホッテントットウィキメディア・コモンズ黒人女性の体の所有権の認識は、最も醜い歴史の断片に深く織り込まれている問題です。この有毒な考えは、地球の一部に隔離されていません。
写真:APマライアキャリーは、土曜日の夜にタイムズスクエアでディッククラークスの新年のロッキンイブウィズライアンシークレスト(このショーのタイトルはサウンドチェックを取得できますか?)のパフォーマンス中に、かなり深刻なオーディオの誤動作に苦しんでいました。最悪の問題は、キャリーの「エモーション」のパフォーマンス中に発生しました。トラックがキャリーのボーカルを断続的にしか再生せず、リップシンクをオフにしました。
ロシアのフィギュアスケーター、カミラ・バリエバが関与したドーピング事件が整理されているため、チームは2022年北京冬季オリンピックで獲得したメダルを待っています。
何千人ものAmazonの買い物客がMulberry Silk Pillowcaseを推奨しており、現在販売中. シルクの枕カバーにはいくつかの色があり、髪を柔らかく肌を透明に保ちます。Amazonで最大46%オフになっている間にシルクの枕カバーを購入してください
ラファイエット警察署は、「不審な男性が女性に近づいた」という複数の苦情を受けて、12 月にパデュー大学の教授の捜査を開始しました。
私たちの周りの世界と同じように、言語は常に変化しています。以前の時代では、言語の変化は数年または数十年にわたって発生していましたが、現在では数日または数時間で変化する可能性があります。
認知症を患っている 91 歳のアジア人女性が最近、47 番街のアウター サンセット地区でロメオ ロレンゾ パーハムに襲われました。伝えられるところによると、被害者はサンフランシスコの通りを歩いていたところ、容疑者に近づき、攻撃を受け、暴行を受けました。
“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.
人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。