JWTや公開鍵を生成する

JWTを生成する方法と、JWTキー(秘密鍵 / 公開鍵)を生成する方法について

JWTを生成する前に

ウィザードを埋め込むサイトのオリジン(URL)をAnyflow CSチームにご連絡ください。

e.g.

  • http://localhost:8000

  • http://dev.example.com:8080

  • https://stg.example.jp

※開発環境や検証環境など、SDKを使用し得る環境のオリジンを一通りご連絡ください。 後から追加/変更することも可能です。

オリジンを共有いただく理由

Anyflow SDKを使用してソリューションなどのデータを取得する場合、ベンダープロダクトから直接 Anyflow Embed の API へリクエストを送信することになります。ブラウザはあるオリジンから異なるオリジンにリクエストを送る場合、オリジンをまたいで通信を行っても良いかどうかを自動的に検証します。 その検証を通過させるためにはAnyflowのサーバーにてお客様のオリジンを許可リストに含める必要があるため、オリジンを予めご提供いただいております。

JWTを生成する

Anyflow Embedでは、JWTを使用してベンダープロダクトとデータのやりとりを行います。 Anyflow SDKの利用にはベンダープロダクトのサーバーサイドで生成したJWTが必要です。

なお、JWTは RS256 アルゴリズムで生成する必要があります。

ヘッダーの仕様

Key
Value

alg

RS256

typ

JWT

ヘッダーサンプル

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

ペイロードの仕様

Claim
必須
値の作成元
説明

iss

String

Anyflow

Anyflowがベンダーを識別するための値です。 Anyflow Embedの管理画面から取得した値を使用してください。

exp

Integer

ベンダー

有効期限(UNIXタイムスタンプ)を指定します。 セキュリティの側面から1時間など短い時間を推奨しております。

jti

String

ベンダー

JWTのユニーク性を担保するための識別子を指定します。 JWTを発行するごとに別の値が設定されるように、UUIDなどを指定します。

anyflow_team_id

String

ベンダー

一意なエンドユーザーチームの識別子を指定します。 プロダクト側で生成した自由な値を使用してください。

anyflow_team_email

String

ベンダー

通知などに利用されるエンドユーザーチームの代表メールアドレスを指定します。

anyflow_team_name

String

ベンダー

通知などに利用されるエンドユーザーチームの名前を指定します。

anyflow_user_id

String

ベンダー

一意なエンドユーザーの識別子を指定します。 チームインテグレーションをする際はnullを指定します。

anyflow_user_email

String

ベンダー

通知などに利用されるエンドユーザーのメールアドレスを指定します。 anyflow_user_idと同様に、チームインテグレーションをする際はnullを指定します。

anyflow_user_name

String

ベンダー

エンドユーザーの名前を指定します。 anyflow_user_idと同様に、チームインテグレーションをする際はnullを指定します

nbf

Integer

ベンダー

JWTが有効になる日時を指定します。

iat

Integer

ベンダー

JWTが発行された日時を指定します。

セキュリティの観点から一度使用したJWTを再度使用することはできません。そのため、JWTは生成されるごとに異なるユニークな値にする必要があります。

ヒント

ペイロードサンプル

{
  "iss": "00000000-0000-0000-0000-000000000000", // Anyflowが発行した値
  "anyflow_team_email": "[email protected]",  // エラーの通知先
  "anyflow_team_id": "00000000-0000-0000-0000-000000000000",  // エンドユーザーチームの一意な識別子
  "anyflow_team_name": "Foo inc.",  // anyflow_team_idのエンドユーザーチーム名
  "anyflow_user_id": "00000000-0000-0000-0000-000000000000",  //エンドユーザーの一意な識別子
  "anyflow_user_email": "[email protected]",  // エラーの通知先
  "anyflow_user_name": "田中太郎",  // anyflow_user_idのエンドユーザー名
  "jti": "2565d821-81a2-40d0-8e9e-fbc012345678",  // UUID
  "exp": 1609426800,  // 有効期限
  "nbf": 1640876400,  // 有効になる日時
  "iat": 1640790000  // 発行日時
}

JWTキーを生成する

秘密鍵を生成する

秘密鍵を生成するには、次の通りにコマンドを実行します。

$ openssl genrsa -out private.key 2048
$ cat private.key
-----BEGIN RSA PRIVATE KEY-----

...

-----END RSA PRIVATE KEY-----

デプロイ環境を使用する場合は、デプロイ環境ごとに秘密鍵を分けることが可能です。デプロイ環境についてはこちらを参照してください。

公開鍵を生成する

次に、以下のコマンドを実行して公開鍵を抽出します。

$ openssl rsa -in private.key -pubout -out public.key
$ cat public.key
-----BEGIN PUBLIC KEY-----

...

-----END PUBLIC KEY-----

公開鍵を登録する

Anyflow管理画面に公開鍵を登録してください。

サンプルコード

以下はPythonでJWTを生成するサンプルコードです。 以下のコードではanyflow_user_id などが指定されていないため、チームインテグレーションになります。

Python
import jwt as pyjwt  # pip install pyjwt
from datetime import datetime, timedelta
import uuid

# 入手方法はカスタマーサクセス担当者までお願いします。
vender_id = '59fe0d15-60ef-47f5-8f10-399aa17c7e82'
# JWTの有効期限(UNIXタイムスタンプ)
expiration_time = (datetime.now() + timedelta(days=1)).timestamp()
# JWTのユニーク性を担保するための識別子
unique_id = str(uuid.uuid4())
# ベンダープロダクトのエンドユーザーチーム(組織)を識別するID
external_team_id = 'example_external_team_id'
# エンドユーザーチームの代表のメールアドレス(エラーの通知先になります)
team_email = '[email protected]'
# エンドユーザーチームの名前
team_name = 'Example Inc.'

# 生成した秘密鍵
PRIVATE_KEY = '''-----BEGIN RSA PRIVATE KEY-----
....
-----END RSA PRIVATE KEY-----'''

# JWTを生成
encoded_team_jwt = pyjwt.encode({
    'iss': vender_id,
    'exp': expiration_time,
    'jti': unique_id,
    'anyflow_team_id': external_team_id,
    'anyflow_team_email': team_email,
    'anyflow_team_name': team_name
}, PRIVATE_KEY, algorithm='RS256')
print(encoded_team_jwt)
# > "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI1OWZlMGQxNS02MGVmLTQ3ZjUtOGYxMC0zOTlhYTE3YzdlODIiLCJleHAiOjE2MDk0MjY4MDAsImV4dGVybmFsX3RlYW1faWQiOiJleGFtcGxlX2V4dGVybmFsX3RlYW1faWQiLCJ0ZWFtX2VtYWlsIjoiaW5mb0BleGFtcGxlLmNvbSIsInRlYW1fbmFtZSI6IkV4YW1wbGUgSW5jLiJ9.TuaiIJCjlrP_9o0BW3QZ8_wmB4JZG2sWG15aAB-qwjIREUcYGgJ1zfY2khXCd0IxXF9lwjxUApW2I0msVvuQd9ySAAMTPNEBeKZcKkUa8UYnkrz3I7OGN-5X6q-qh6r6VBLZ5UJb9qHql2f5mZJXpjK0oygsUSXZE3gDyzVDywce65lHz7IfB904UvnFCR6DCkusq8Ntob1hJ-eFf3bkhQALlLnJ7J4_Pxg9VxZjkD5_LprEZdIqpnFIkuugdsWFXVo2z_wIzjhsJaPo7TAVoc1gMVZQVaX-2kyOkSOOPK_R4-mHyQTf-z5j1-JobN6_CupaZ6cL9iWx9tYt6GMkoQ"

よくあるご質問

ユーザーインテグレーションとチームインテグレーションは何が異なりますか?

こちらを参考にしてください。

JWTの有効期限の推奨時間はありますか?

JWTの有効期限(exp)に関して、セキュリティの側面から1時間など短い時間を設定いただくことを推奨しております。

最終更新