注記:ユーザーハブ機能はクローズドベータ版です。詳細については、カスタマーサクセスマネージャーまでお問い合わせください。

このガイドでは、新しいユーザーハブシステムで「ユーザーID認証」を設定する方法について説明します。これは、開発者がSDK X 10.4およびWebチャットに機能を実装するために設計されています。ユーザーID認証は、セキュリティを強化し、スパムを削減し、ユーザーとサポートエージェントの両者の経験を向上させます。

ユーザーID認証とは何ですか?

エンドユーザーがログインをリクエストする際、固有の識別子(ユーザーIDまたはメールアドレス)に加えて、JWTも自動的に提供されるようにシステムを設定する必要があります。これにより、システムはリクエストがブランドからのものであり、悪意のある第三者からのものではないことを確認できます。

HelpshiftのユーザーID認証では、サーバー側で生成されたJWT(JSON Web Token)を使用し、ユーザーの固有のIDに基づいてトークンを生成することでユーザーを認証します。

使用可能なIDは、アプリユーザーID、メールID、電話番号、Facebook ID、Discord ID、WhatsApp ID、Google Playstore ID、Apple Game Center ID、Nintendo ID、PlayStation ID、Xbox Live ID、Steam IDです。詳細については、IDの種類をご参照ください。

JWTは、Helpshiftダッシュボードで利用可能な秘密鍵を使用して生成されます。

秘密鍵にアクセスできるのはHelpshiftと管理者/開発者のみであるため、ログインリクエストがエンドユーザーからのものであり、悪意のある第三者からのものではないことをシステムが認証できます。

注記:この機能は、SDKバージョン10.4.0以降であればデフォルトで利用可能です。ユーザーを識別したい場合は、必ずこの機能を使用してください。そうしないと、ユーザーが匿名のままになる問題が発生します。

ユーザーID認証フロー

 

ヒント:Helpshiftダッシュボードでアプリのテストバージョンとテストアプリを設定し、下記の手順を完了することを推奨いたします。これにより、問題が発生した場合のトラブルシューティングを行うことが可能になります。

ユーザーID認証を設定する理由

新しいIDシステム(ユーザーハブ)でユーザーID認証を設定することで、ユーザー認証とデータの整合性を管理するための頑丈なフレームワークが提供されます。このシステムの導入が不可欠な理由は次のとおりです。

  • 漏洩したメールデータベースを利用した不正アクセスや大量のデータ改ざんを防ぐため、必須のユーザーID認証を導入します。
  • ブランド側によるデータベースチェックを実施し、ID認証を行うことで、保存データと実際のユーザーIDを照合し、偽造されたIDトークンによる不正利用を防止します。
  • すべてのIDに対して完全なUID認証を導入し、すべてのIDタイプを認証および署名することで、複数のIDを介してのなりすましを防止します。
  • 認証後のデータ送信を保護することで、ログイン後のユーザーデータ改ざんを防ぎ、データの整合性を確保します。

エンドユーザーにはどのように表示されますか?

この機能を有効にすると、ユーザーは認証ステータスに基づいて下記のような経験を体験できます。

  • ユーザーが認証されていない場合、ログインできません。代わりに匿名ユーザーとして扱われ、認証失敗画面は表示されません。
  • 認証済みのログインユーザーは、過去のチケットを確認でき、新しいチケットを作成できます。(これはiOS、Android、Webチャットの両方に適用されます)
     
  • Webチャットでユーザーが認証されていない場合は、ログインされず、認証失敗画面が表示されます。
     

ユーザーID認証を設定する方法

ステップ1:秘密鍵を生成する

Helpshift管理者に連絡して下記の手順で秘密鍵を生成してもらいます。

ステップ2:秘密鍵を取得する

注:共有秘密鍵には有効期限がなく、一定のままです。これはJWTの生成と検証のみに使用されます。

「Helpshift管理者」によって生成された秘密鍵にアクセスするには、次の手順に従ってください。

  1. 設定( ) )ページに移動します。
  2. [アプリ設定]までスクロールします。
  3. 新しいIDシステムのユーザーID認証を設定するアプリを選択します。
  4. 秘密鍵はこのページで利用できます。
  5. [コピー]ボタンをクリックして、この秘密鍵をエンドポイントで使用するためにコピーします。

セキュリティ上の理由から、秘密鍵をエンドユーザーまたは第三者がアクセスできる場所に配置しないでください。

注:常にサーバー側でJWTを生成し、共有秘密鍵を安全に保管してください。

ステップ3:エンドポイントを設定する

秘密鍵を取得したら、エンドポイントでこれを使用して、JWT(JSON Web Token)をiOSアプリ、Androidアプリ、またはWebチャットウィジェットに渡す必要があります。

IDトークンは、ダッシュボードのアプリ設定で指定された共有秘密を使用して署名されたJWTである必要があります。この秘密鍵の生成は、通常のログインプロセスの一部として実行できます。

秘密鍵は漏洩を防ぐため、ユーザーのデバイス上に存在させるべきではありません。

JWTの生成に関する注意事項:

  • ユーザーIDやメールIDが利用可能な場合、JWTはユーザーIDやメールIDで生成する必要があります。
  • ユーザーIDやメールIDに加えて、電話番号、Facebook ID、Discord ID、WhatsApp ID、Google Play Store ID、Apple Game Center ID、Nintendo ID、PlayStation ID、Xbox Live ID、Steam IDなどの他の識別子も、JWTのIDペイロードの一部として含めることができます。
  • JWTを生成するには、次のJSON形式を使用する必要があります。
    {
      "identities": [{
        "identifier": "uid" | "email" | "phone_number" | "facebook_id" |
                      "discord_id"|"whatsapp_id"|"google_playstore_id"|
                      "apple_gamecenter_id" | "nintendo_id" | "psn_id" |
                      "xbox_live_id" | "steam_id"
        "value": "string",
        "metadata": {
          "string": "string"
        }
      }],
      "iat": // UNIX epoch time in seconds, generated in the last 24h or earlier
    }

:ユーザーIDやメールIDを渡す必要があります。

トラブルシューティングのヒント

ユーザーID認証のテスト中にエラーが発生した場合は、次のトラブルシューティングのヒントをご確認ください。

  • JWTは共有秘密鍵を使用して生成されます。JWTがない場合、ユーザーは識別されず、すべてのやり取りは匿名として扱われます。
  • セッションが期限切れになると、Helpshift SDK/Webchatはブランドに対し、新しいJWTを使用してでユーザーに再ログインするようプログラムに促します。これは通常、月に1回、またはHelpshiftが疑わしいアクティビティを検出した場合に発生します。
  • JWTエンドポイントが下記の要件を満たしていることをご確認ください。
    • 承認された形式でトークンを生成する
    • 共有秘密鍵を使用してトークンに署名する
    • iat(issued_at_time)が24時間以内の値を含める
  • JWTをキャッシュしている場合は、24時間以上キャッシュしないようにしてください。

コードサンプル

エンドポイントを設定するときは、次のコードサンプルをご参照ください。

Python
import jwt
import time

def generate_jwt(secret, user_email=None, user_id=None):
    iat = int(time.time())
    identities = []

    if user_id:
        identities.append({
            "identifier": "uid",
            "value": user_id
        })

    if user_email:
        identities.append({
            "identifier": "email",
            "value": user_email
        })

    payload = {
        "iat": iat,
        "identities": identities
    }

    # Generate the JWT token using HS256 algorithm
    token = jwt.encode(payload, secret, algorithm='HS256')
    return token
Javascript
const jwt = require('jsonwebtoken');

function generateJWT(secret, userEmail, userId) {

    // Issued At (current timestamp in seconds)
    const iat = Math.floor(Date.now() / 1000);
    const identities = [];

    if (userId) {
        identities.push({
            identifier: "uid",
            value: userId
        });
    }

    if (userEmail) {
        identities.push({
            identifier: "email",
            value: userEmail
        });
    }

    const payload = {
        iat,
        identities
    };
    const token = jwt.sign(payload, secret, { algorithm: 'HS256' });
    return token;
}
Java
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Claims;

import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Map;

public class JAVA {

    public static String generateJWT(String secret, String userEmail, String userId) {
        // Issued At (current timestamp in seconds)
        long iat = System.currentTimeMillis() / 1000;
        List<Map<String, String>> identities = new ArrayList<>();

        // Add user information to the identities list if available
        if (userId != null) {
            Map<String, String> userIdInfo = new HashMap<>();
            userIdInfo.put("identifier", "uid");
            userIdInfo.put("value", userId);
            identities.add(userIdInfo);
        }

        if (userEmail != null) {
            Map<String, String> userEmailInfo = new HashMap<>();
            userEmailInfo.put("identifier", "email");
            userEmailInfo.put("value", userEmail);
            identities.add(userEmailInfo);
        }

        Map<String, Object> payload = new HashMap<>();
        payload.put("iat", iat);
        payload.put("identities", identities);

        // Generate the JWT token
        return Jwts.builder()
                .setClaims(payload)
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();
    }
}

ステップ4:iOSアプリ/Androidアプリ/Webチャットウィジェットを設定する

JWTを生成するようにエンドポイントを設定したら、iOS、Android、およびWebチャットのコードでID認証を設定する必要があります。この手順を完了するには、iOSAndroid、およびWebチャットのID認証に関する開発者向けのドキュメントをご参照ください。

実装のテスト手順

前提条件:ユーザーがIdentities APIを使用してログインしており、JWTが上記のように実装されていることを確認します。

  1. チャットを開きます。
  2. 会話を開始します。
  3. チケットがHelpshiftダッシュボードに表示されることを確認します。
  4. 会話の開始時に渡されたIDが、ユーザーパネルのチケットに正しく反映されていることを確認します。

これで、ユーザーID認証を使用する準備ができました。