https://a.storyblok.com/f/270183/1368x665/d60d9f5a60/jwt-token_network-apis.png

ネットワークAPI認証用のJSON Webトークン(JWT)を生成する方法

最終更新日 November 26, 2024

所要時間:1 分

JSONウェブトークン(JWT)とは何ですか?

A JWT(JSON Web Token)はオープンスタンダード(RFC 7519)であり、当事者間で情報をJSONオブジェクトとして安全に伝送するためのオープンスタンダードである。このオブジェクトは暗号化され、秘密鍵/公開鍵で署名される可能性があり、ウェブアプリケーションにおける認証と認可に一般的に使用される。

JWTは、ウェブアプリケーションで使用されるデジタルIDカードのようなもので、そのアプリケーションとやりとりするたびに、ログインせずにあなたが誰であるかを確認するためのものだと考えることができる。

JWTトークンの生成方法を知っておくことは重要です。 ネットワークAPIが認証に使用するため、JWT トークンの生成方法を知っておくことが重要です。Vonage APIを使用する際に新しいJWTトークンを生成するにはいくつかの方法があります:

  • JWTオンラインジェネレータ JWTオンライン・ジェネレーター.アプリケーションIDと、ダッシュボードのアプリケーションによって生成された秘密鍵が必要です。ネットワークAPIでは、余分なACLプロパティは必要ありません。

  • 使用方法 Vonage CLIツールの使用.オンラインジェネレータと同様に、秘密鍵とアプリケーションIDを提供する必要があります: vonage jwt --key_file=path/to/private.key --app_id= 以下のようにします。<アプリケーションID

  • 弊社の SDKを使用している場合、すべてのSDKがJWTトークンの生成をサポートしているため、JWTについて心配する必要はありません。

外部のツールやライブラリに依存せずにJWTトークンを生成したい場合はどうすればいいでしょうか?その場合は、このまま読み進めてください!

JWTの構造

JWTを実装する前に、その構造を理解することが重要である。

JWTは ヘッダ, ペイロードそして 署名.これらの部分は Base64urlエンコーディングアルゴリズムで別々にエンコードされ、ピリオドを使って連結されます:

jwt = base64url(header) + '.' + base64url(payload) + '.' + base64url(signature)

さあ、飛び込もう!

ヘッダー

どのアルゴリズムを使用して署名を生成するかを指定する。Vonage APIの場合、ヘッダーは以下のようになる:

{ 
  alg: "RS256",
  typ: "JWT"
};

ペイロード

これには、アプリケーション ID、発行時刻、有効期限など、ユーザとその請求に関する情報が含まれます。以下のリストには、Vonage APIを使用する際に必要なキーが含まれています:

  • アプリケーションID.を持つアプリケーションのIDに対応する。 ネットワークレジストリ機能アプリケーションのIDに対応します。 ユーザーのダッシュボード.

  • アイアット.トークンが発行された時刻。

  • エヌビーエフ.トークンが有効になる時間。

  • .エキスパード.トークンの有効期限。

  • アクリル.このトークンが持つ権限のリスト。ネットワークAPIでは、余計なパーミッションは必要ないので、空の値を使います。

  • jti.JWTの一意な識別子。

署名

トークンを検証するためのスタンプとして機能します。これは、Base64urlエンコーディングアルゴリズムを使用してヘッダーとペイロードをエンコードすることによって計算され、秘密鍵を使って署名されます。 トークンの署名にはアプリケーションの秘密鍵が使用されます。対応する公開鍵は、それを検証するために使用されます。 鍵は、アプリケーションの設定にある ユーザのダッシュボード.

JavaScriptでJWTを生成する方法

最初のステップはヘッダーを作ることだ:

const header = {
  alg: "RS256",
  typ: "JWT",
};

次に、ペイロードを作成します。この例では、有効期限を1時間に設定しています:

const currentTime = Math.floor(Date.now() / 1000);

const payload = {
  application_id: "123-456-789",
  iat: currentTime,
  nbf: currentTime,
  exp: currentTime + (60 * 60),
  acl: {},                 
  jti: crypto.randomUUID()
};

JavaScriptにはBase64URLアルゴリズムの実装が含まれていないので、独自のバージョンを実装しなければならない:

function base64url(str) {
  let encodedSource = Buffer.from(str).toString('base64');

  // remove padding and replace characters
  return encodedSource
       .replace(/\+/g, '-')
       .replace(/\//g, '_')
       .replace(/=+$/, '');
}

次に、署名を作成しよう:

const crypto = require("crypto");
const fs = require("fs");

// Load your private key generated for the Vonage Application
const privateKey = fs.readFileSync("path/to/private.key", "utf8");

const encodedHeader = base64url(JSON.stringify(header));
const encodedPayload = base64url(JSON.stringify(payload));

const signingInput = `${encodedHeader}.${encodedPayload}`;

// Create RS256 signature (RSA-SHA256)
const signature = crypto.sign("RSA-SHA256", Buffer.from(signingInput), {
  key: privateKey,
});

const encodedSignature = base64url(signature);

最後に、JWTを使用する準備が整いました:

const jwt = `${encodedHeader}.${encodedPayload}.${encodedSignature}`;
console.log(jwt);

PythonでJWTを生成する方法

JWTを実装するコードは、JavaScriptバージョンと非常によく似ている。Base64URLアルゴリズムの実装から始めよう:

import base64
import json
import time
import uuid

from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding

def base64url(data: bytes) -> str:
    return base64.urlsafe_b64encode(data).rstrip(b"=").decode("utf-8")

次に、ヘッダーとペイロードを定義する:

current_time = int(time.time())

header = {"alg": "RS256", "typ": "JWT"}

payload = {
    "application_id": "123-456-789",
    "iat": current_time,
    "nbf": current_time,
    "exp": current_time + 3600,
    "acl": {},
    "jti": str(uuid.uuid4()),
}

次のステップは、ヘッダーとペイロードの両方をエンコードすることだ:

encoded_header = base64url(json.dumps(header, separators=(",", ":")).encode("utf-8"))
encoded_payload = base64url(json.dumps(payload, separators=(",", ":")).encode("utf-8"))

サインを作成する準備が整いました:

app_id = "1234-4567-8901-abcd"
private_key = "/path/to/your/private/key"

with open(private_key, "rb") as f:
    private_key = serialization.load_pem_private_key(f.read(), password=None)

signature = private_key.sign(
    signing_input,
    padding.PKCS1v15(),
    hashes.SHA256(),
)

encoded_signature = base64url(signature)

私たちのJWTは使用する準備ができている:

jwt_token = f"{encoded_header}.{encoded_payload}.{encoded_signature}"
print(jwt_token)

ネットワークAPIでJWTを使用する方法

ネットワークAPIは、APIコールを行う前の認証ステップでJWTを使用する。トークンが認証情報であることを考えると、セキュリティ上の問題を防ぐために、いくつかのセキュリティ対策を考慮する必要がある:

  • JWTの生成はバックエンド側で行うべきである。

  • トークンの有効期限を必要以上に長くしないでください。

トークンが生成されると、ユーザーはそのトークンを使って保護されたエンドポイントにアクセスできるようになります。これは通常、Bearerスキーマを使用したAuthorizationヘッダーを使用して行われます:

Authorization: Bearer <token>

Network API の認可に関する文書には、JWT トークンをフロントエンドの フロントエンドバックエンド シナリオで JWT トークンを使用する方法の詳細な説明が含まれています。

お問い合わせ

あなたの好きな言語でJWTを実装しましたか?あなたのコードを見てみたい!ぜひ Vonage 開発者コミュニティ Slackまたは Xにメッセージください。

読んでくれてありがとう!

シェア:

https://a.storyblok.com/f/270183/405x400/2b811a162d/alvaro-navarro.jpg
Alvaro Navarroシニア・デベロッパー・アドボケイト

AlvaroはVonageの開発者支持者であり、ネットワークAPIに焦点を当てています。デベロッパーエクスペリエンス、API、オープンソースに情熱を注ぐ。仕事以外では、コミックショップを探検したり、SFやホラーフェスティバルに参加したり、有名な小さなプラスチックブロックで何かを作ったりしているところをよく見かける。