> For the complete documentation index, see [llms.txt](https://docs-embed.anyflow.jp/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs-embed.anyflow.jp/release/embed/generate-jwt.md).

# JWTや公開鍵を生成する

## **JWTを生成する前に**

**ウィザードを埋め込むサイトのオリジン（URL）**&#x3092;Anyflow CSチームにご連絡ください。

開発環境や検証環境など、**SDKを使用する可能性がある全てのオリジン**をご連絡ください。\
後から追加/変更することも可能です。

登録するオリジンの例

* <http://localhost:8000>
* <http://dev.example.com:8080>
* <https://stg.example.jp>

※独自ドメインであればワイルドカードでの指定も可能です。\
独自ドメインではないものはワイルドカードでの指定はできません（`*.azure.net` , `*amazonaws.com`, `*.vercel.app` など）。

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

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

## **JWTを生成する**

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

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

### **ヘッダーの仕様**

<table><thead><tr><th width="106.671875">Key</th><th width="113.015625">Value</th></tr></thead><tbody><tr><td>alg</td><td>RS256</td></tr><tr><td>typ</td><td>JWT</td></tr></tbody></table>

#### **ヘッダーサンプル**

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

### **ペイロードの仕様**

<table><thead><tr><th width="194.86328125">Claim</th><th width="54.796875">必須</th><th width="84.12890625">型</th><th width="119.51953125">値の作成元</th><th>説明</th></tr></thead><tbody><tr><td>iss</td><td>◯</td><td>String</td><td>Anyflow</td><td>Anyflowがベンダーを識別するための値です。<br><a href="https://embed.anyflow.jp/settings/jwt">Anyflow Embedの管理画面</a>から取得した値を使用してください。</td></tr><tr><td>exp</td><td>◯</td><td>Integer</td><td>ベンダー</td><td>有効期限（UNIXタイムスタンプ）を指定します。<br>セキュリティの側面から1時間など短い時間を推奨しております。</td></tr><tr><td>jti</td><td>◯</td><td>String</td><td>ベンダー</td><td>JWTのユニーク性を担保するための識別子を指定します。<br>JWTを発行するごとに別の値が設定されるように、UUIDなどを指定します。</td></tr><tr><td>anyflow_team_id</td><td>◯</td><td>String</td><td>ベンダー</td><td>一意な<a href="https://docs-embed.anyflow.jp/introduction/glossary#endoyzchmu">エンドユーザーチーム</a>の識別子を指定します。<br>プロダクト側で生成した自由な値を使用してください。</td></tr><tr><td>anyflow_team_email</td><td>◯</td><td>String</td><td>ベンダー</td><td>通知などに利用される<a href="https://docs-embed.anyflow.jp/introduction/glossary#endoyzchmu">エンドユーザーチーム</a>の代表メールアドレスを指定します。<br>※実在するアドレスを指定してください</td></tr><tr><td>anyflow_team_name</td><td>◯</td><td>String</td><td>ベンダー</td><td>通知などに利用される<a href="https://docs-embed.anyflow.jp/introduction/glossary#endoyzchmu">エンドユーザーチーム</a>の名前を指定します。</td></tr><tr><td>anyflow_user_id</td><td>✕</td><td>String</td><td>ベンダー</td><td><p>一意な<a href="https://docs-embed.anyflow.jp/introduction/glossary#endoyz">エンドユーザー</a>の識別子を指定します。</p><p>このIDが指定されると、<a href="https://docs-embed.anyflow.jp/introduction/glossary#yzintegurshon">ユーザーインテグレーション</a>になります。<br><a href="https://docs-embed.anyflow.jp/introduction/glossary#chmuintegurshon">チームインテグレーション</a>をする際はnullを指定します。</p></td></tr><tr><td>anyflow_user_email</td><td>✕</td><td>String</td><td>ベンダー</td><td>通知などに利用される<a href="https://docs-embed.anyflow.jp/introduction/glossary#endoyz">エンドユーザー</a>のメールアドレスを指定します。<br>anyflow_user_idと同様に、<a href="https://docs-embed.anyflow.jp/introduction/glossary#chmuintegurshon">チームインテグレーション</a>をする際はnullを指定します。<br>※指定する場合は実在するアドレスを指定してください</td></tr><tr><td>anyflow_user_name</td><td>✕</td><td>String</td><td>ベンダー</td><td>エンドユーザーの名前を指定します。<br>anyflow_user_idと同様に、<a href="https://docs-embed.anyflow.jp/introduction/glossary#chmuintegurshon">チームインテグレーション</a>をする際はnullを指定します</td></tr><tr><td>nbf</td><td>✕</td><td>Integer</td><td>ベンダー</td><td>JWTが有効になる日時を指定します。</td></tr><tr><td>iat</td><td>✕</td><td>Integer</td><td>ベンダー</td><td>JWTが発行された日時を指定します。</td></tr></tbody></table>

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

{% hint style="success" %}

### ヒント

`anyflow_user_*` がJWTに格納されていた場合はユーザーインテグレーションになります。\
必須である `anyflow_team_*` しか格納されていない場合はチームインテグレーションになります。
{% endhint %}

#### **ペイロードサンプル**

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

## **JWTキーを生成する**

### **秘密鍵を生成する**

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

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

...

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

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

### **公開鍵を生成する**

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

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

...

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

#### **公開鍵を登録する**

[Anyflow管理画面](https://embed.anyflow.jp/settings/jwt)に公開鍵を登録してください。

<figure><img src="/files/IIIhGcKcAeg6iHnI6ARC" alt=""><figcaption></figcaption></figure>

## **サンプルコード**

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

{% code title="Python" overflow="wrap" %}

```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 = 'info@example.com'
# エンドユーザーチームの名前
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"
```

{% endcode %}

## **よくあるご質問**

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

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

* [チームインテグレーション](/introduction/glossary.md#chmuintegurshon)
* [ユーザーインテグレーション](/introduction/glossary.md#yzintegurshon)

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

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


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs-embed.anyflow.jp/release/embed/generate-jwt.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
