ユーザーの認証を行う

このドキュメントは、⁠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イベントのオプションとして渡します。

krt('send', 'identify', {
  user_id: 'ユーザーID',
}, {
  jwt: 'IDトークン',
});
Tracker.identify("ユーザーID", [
  "jwt": "IDトークン"
])
Tracker.identify("ユーザーID", mapOf(
  "jwt" to "IDトークン"
))