このドキュメントは、⁠identifyイベント実行時のなりすましを防止するための「本人確認機能」の実装手順を説明するものです。

本機能では、貴社サーバーで発行したIDトークン (JWT) を⁠identifyイベントに付与することで、リクエストの正当性をKARTEサーバーで検証します。

実装手順

IDトークンを発行する

はじめに、ユーザーごとのIDトークン(JWT)を発行する処理を貴社サーバーに実装します。

1. ライブラリの選定と準備

JWTの生成には、信頼できる標準的なライブラリを使用してください。

2. 秘密鍵の安全な管理

IDトークンの署名に利用する秘密鍵 (Secret Key) は、弊社から提供されたものを利用します。

なお秘密鍵は [組織・プロジェクト設定] - [セキュリティ設定] - [シークレットキー] から取得してください。

ご注意ください

秘密鍵は、環境変数やAWS Secrets Managerなどのシークレット管理サービスを用いて、コードベースから分離された安全な場所に保管してください。

3. IDトークン(JWT)の仕様

生成するJWTは、以下の仕様を満たす必要があります。

クレーム 説明 データ型 必須
alg (Header) 署名アルゴリズム。HS256 をハードコードで指定してください。 String
sub (Payload) ユーザーを一意に特定する user_id。 String
exp (Payload) トークンの有効期限。発行から 30〜60秒後 のUnixタイムスタンプ(秒)を強く推奨。 Number

4. 実装例

以下に、auth0/java-jwt ライブラリを使用したIDトークン発行処理の実装例を示します。

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.time.Instant;
import java.time.temporal.ChronoUnit;

public class IdentityTokenService {

    private final Algorithm algorithm;

    /**
     * コンストラクタで秘密鍵を読み込み、アルゴリズムを初期化する
     * @param secretKey 環境変数などから読み込んだ秘密鍵
     */
    public IdentityTokenService(String secretKey) {
        this.algorithm = Algorithm.HMAC256(secretKey);
    }

    /**
     * 指定されたユーザーIDのIDトークンを生成する
     * @param userId ログイン中のユーザーID
     * @return 生成されたIDトークン (JWT文字列)
     */
    public String generateToken(String userId) {
        Instant now = Instant.now();
        Instant expiresAt = now.plus(30, ChronoUnit.SECONDS); // 30秒後に失効

        String token = JWT.create()
                .withSubject(userId)
                .withExpiresAt(expiresAt)
                .sign(this.algorithm);

        return token;
    }
}

IDトークンを付与する

次に、クライアントサイドから先ほど発行したIDトークンを取得して、⁠identifyイベントのオプションとして渡します。

TypeScript

krt('send', 'identify', {
  user_id: 'ユーザーID',
}, {
  jwt: 'IDトークン',
});

Swift (iOS)

Tracker.identify("ユーザーID", [
  "jwt": "IDトークン"
])

Kotlin (Android)

// language: kotlin
Tracker.identify("ユーザーID", mapOf(
  "jwt" to "IDトークン"
))