メインコンテンツへスキップ

概要

OneSignalは、ユーザーのなりすましを防ぐのに役立つアイデンティティ検証という拡張セキュリティ機能を提供しています。この機能は、サーバー上で安全に生成されたJSON Web Token(JWT)を利用します。サブスクリプション情報を検証するために、これらのトークンがアプリとOneSignalのAPIに渡されます。 アイデンティティ検証を有効にして保護する:
  • ユーザーのログイン
  • メールサブスクリプションの追加
  • SMSサブスクリプションの追加
  • ユーザーアイデンティティの変更
アイデンティティ検証は現在ベータ版です。アカウントで有効にするには support@onesignal.com までお問い合わせください。サポートが有効にしたら、ダッシュボードで有効化します(ステップ 5 を参照)。

前提条件

ラッパーSDKサポート(Flutter、React Native、Unityなど)は近日公開予定です。

セットアップ

1

新しいキーを生成する

OneSignalアカウントにログインし、設定 > キーとID > アイデンティティ検証に移動します。
Settings page showing Keys and IDs with Identity Verification section
新しいキーを生成をクリックして、新しいキーペアを作成します。
Generate New Keys button in the Identity Verification section
PEMファイルをダウンロードするか、秘密鍵をコピーし、秘密鍵を安全に保管してください。
Identity Verification key pair with private key and PEM download
秘密鍵は常にキー管理システムなどの安全な環境に保管してください。クライアントサイドコード、公開リポジトリ、またはログに秘密鍵を決して公開しないでください。
2

バックエンドで検証JWTを生成する

アイデンティティ検証では、OneSignalにログインする前に、認証サーバーでエンドユーザーを認証する必要があります。エンドユーザーがバックエンドで認証するときに、トークンを生成し、デバイスへの認証レスポンスに含めます。アプリがバックエンドサーバーを実行していない場合は、ユーザーを検証してこれらのトークンを生成するための軽量サーバーのセットアップを検討してください。

JWTペイロード

JWTには次のプロパティを含めることができます:
iss
必須
OneSignalアプリID
exp
必須
トークンの有効期限。
identity
必須
ユーザーのエイリアス。
subscriptions
ユーザーにメールおよびSMSサブスクリプションを追加する場合にのみ必要です。

JWTへの署名

ES256アルゴリズムを使用してJWTに署名します。JWTをOneSignalに送信するときに検証の問題を回避するために、バックエンドがこの署名方法を使用するように構成されていることを確認してください。これにはJWTライブラリを使用することをお勧めします。jsonwebtokenを使用した例:
import jwt from 'jsonwebtoken';

const APP_ID = process.env['ONESIGNAL_APP_ID']
const IDENTITY_VERIFICATION_SECRET = process.env['ONESIGNAL_IDENTITY_VERIFICATION_SECRET_KEY']

// Generates JWT, potentially with subscription claims, for the user identified by the External ID
function signOneSignalJWT(externalId, subscriptions) {
return jwt.sign({
iss: APP_ID,
exp: Math.floor(Date.now() / 1000) + 3600, // 1-hour expiration
identity: {
'external_id': externalId,
},
subscriptions
},
IDENTITY_VERIFICATION_SECRET,
{ algorithm: 'ES256' });
}

// Pass this token to your mobile app to use with the `login` SDK method
const onesignalJWT = signOneSignalJWT('EXTERNAL_ID');

秘密鍵は、ダッシュボードからダウンロードした前のステップのファイルにあります。

JWT を確認する

SDKと統合する前に、サーバーを起動してエンドポイントを呼び出すことで、JWTが正しく生成されていることを確認します:
  node server.js
  curl http://localhost:3000/generate-jwt/your-external-id
次のようなレスポンスを受け取るはずです:
{
  "jwt": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9..."
}
JWT値をjwt.ioに貼り付け、デコードされたペイロードに次のパラメーターが含まれていることを確認します:
{
  "iss": "your-onesignal-app-id",
  "exp": 1234567890,
  "identity": {
    "external_id": "your-external-id"
  }
}
次のステップに進む前に、以下を確認してください:
  • iss設定 > キーとID の OneSignal アプリIDと一致している
  • identity.external_id が存在し、OneSignal.login() に渡す値と一致している
  • exp が将来のタイムスタンプである — 期限切れのトークンはOneSignalに拒否されます

サブスクリプションを含める

理想的には、ユーザーのログイン時に、メールアドレスや電話番号などのサブスクリプションの詳細をJWTペイロードに含めます。これらの詳細が事前に利用できない場合、検証サーバーは、サブスクリプション情報が利用可能になったときに動的にトークンを生成するエンドポイントを提供する必要があります。例:サブスクリプションを追加するためのJWTの生成
const subscriptions = [
  {
      "type": "Email",
      "token": "[email protected]"
  },
  {
      "type": "SMS",
      "token": "+12345678"
  }
]
const onesignalJWT = signOneSignalJWT('EXTERNAL_ID', subscriptions)
3

`login`メソッドにJWTを渡す

バックエンドがJWTを生成したら、それを使用してloginメソッドを呼び出します。このトークンは、メールやSMSサブスクリプションの追加などの変更を行う前に、ユーザーのアイデンティティが検証されることを保証します。ログインの例:
String externalId = "YOUR_EXTERNAL_ID";
String onesignalJWT = "YOUR_JWT_TOKEN";

OneSignal.login(externalId, onesignalJWT);
4

JWTライフサイクルイベントを処理する

トークンの無効化などのシナリオを処理するために、バックエンドに専用のエンドポイントを実装する必要があります。このエンドポイントは、OneSignalが更新を要求したときに更新されたJWTを提供する必要があります。トークンの無効化とJWTの更新を処理する例:
OneSignal.addUserJwtInvalidatedListener(event -> {
  // Get the expired user's External ID
  String externalId = event.getExternalId();

  // Fetch a new JWT from your backend for the user
  String onesignalJWT = "yourUpdatedToken";

  // Provide the new JWT to the SDK
  OneSignal.updateUserJwt(externalId, onesignalJWT);
});
これにより、ユーザーのJWTが無効化されたときに、バックエンドから新しいJWTをフェッチしてOneSignalに渡すことができます。また、この関数を使用して、メールアドレスと電話番号を含むトークンを生成し、認証中に作成されたトークンにそれらが含まれていない場合にメールとSMSサブスクリプションを管理できます。
5

ダッシュボードでトークンアイデンティティ検証を有効にする

設定 > キーとIDから、トークンアイデンティティ検証をトグルして有効にします。
Token Identity Verification toggle enabled in dashboard settings
有効にすると、アプリはサブスクリプションの真正性を検証するためにOneSignal JWTを送信する必要があります。さらに、アプリはアイデンティティ検証トークンサーバーによって生成されたJWTを使用してloginメソッドを呼び出す必要があります。

サブスクリプションを追加する

モバイルアプリからサブスクリプションを追加するために追加の手順を実行する必要はありません。loginメソッドを呼び出すと、自動的に処理されます。
OneSignal.getUser().addEmail(emailAddress);

REST API

トークンアイデンティティ検証が有効になっている場合、以下のAPIへのすべてのリクエストには、ベアラートークンとしてヘッダーにサーバー生成のJWTを含める必要があります(例:Authorization: Bearer <JWT>)。

よくある質問

本人確認は必須ですか?

いいえ、ただし強く推奨されます。これなしでは、ユーザーの外部ユーザーIDを知っている任意のクライアントがそのユーザーになりすまし、サブスクリプションやデータを変更できてしまいます。

セッション中にJWTの有効期限が切れた場合はどうなりますか?

SDKはJWT無効化イベントを発火します。addUserJwtInvalidatedListenerを実装して(JWTライフサイクルイベントの処理を参照)、バックエンドから更新されたトークンを取得してupdateUserJwtに渡してください。

どのSDKが本人確認をサポートしていますか?

現在、ネイティブAndroid SDK(5.2.0+)とiOS SDK(5.3.0+)です。ラッパーSDKのサポート(Flutter、React Native、Unityなど)は近日公開予定です。

REST APIに本人確認は必要ですか?

トークン本人確認が有効な場合、サポートされているAPIへのすべてのリクエストは、Authorizationヘッダーにサーバー生成のJWTをベアラートークンとして含める必要があります。JWTの生成方法はSDKの使用と同じです。

JWTはどのアルゴリズムを使用しますか?

本人確認では、ES256アルゴリズム(P-256とSHA-256を使用したECDSA)で署名されたJWTが必要です。他のアルゴリズムは拒否されます。