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

概要

OneSignalは、ユーザーのなりすましを防ぐのに役立つアイデンティティ検証という拡張セキュリティ機能を提供しています。この機能は、サーバー上で安全に生成されたJSON Web Token(JWT)を利用します。サブスクリプション情報を検証するために、これらのトークンがアプリとOneSignalのAPIに渡されます。 次の場合にアイデンティティ検証を有効にすることをお勧めします:
  • ユーザーのログイン
  • メールサブスクリプションの追加
  • SMSサブスクリプションの追加
  • ユーザーアイデンティティの変更
support@onesignal.comに連絡してこれを有効にしてください。

前提条件

セットアップ

1

新しいキーを生成する

OneSignalアカウントにログインし、設定 > キーとID > アイデンティティ検証に移動します。

アイデンティティ検証の構成

新しいキーを生成をクリックして、新しいキーペアを作成します。

新しいキーペアの作成

PEMファイルをダウンロードするか、秘密鍵をコピーし、秘密鍵を安全に保管してください。

アイデンティティ検証のキーペア

秘密鍵は常にキー管理システムなどの安全な環境に保管してください。秘密鍵を決して公開しないでください
2

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

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

JWTペイロード

JWTには次のプロパティを含めることができます:
iss
required
OneSignalアプリID
exp
required
トークンの有効期限。
identity
required
ユーザーのエイリアス。
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ペイロードに含めます。これらの詳細が事前に利用できない場合、検証サーバーは、サブスクリプション情報が利用可能になったときに動的にトークンを生成するエンドポイントを提供する必要があります。例:サブスクリプションを追加するためのJWTの生成
const subscriptions = [
  {
      "type": "Email",
      "token": "[email protected]"
  },
  {
      "type": "SMS",
      "token": "+12345678"
  }
]
const onesignalJWT = signOneSignalJWT('APP_ID', 'EXTERNAL_ID', subscriptions)
3

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

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

// The JWT is generated on your backend using the authenticated user's
// External ID or any other custom aliases you may have set.
String onesignalJWT = "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3OGUzMjA4Mi1lYTI3LTQyZTMtYTg5OC1jNzJlMTQxODI0ZWEiLCJleHAiOjE2NTc3NzU4NzIsImlkZW50aXR5Ijp7ImFsaWFzX2xhYmVsX2V4YW1wbGUiOiJhbGlhc19pZF9leGFtcGxlIn0sInN1YnNjcmlwdGlvbnMiOlt7InR5cGUiOiJFbWFpbCIsInRva2VuIjoidGVzdEBkb21haW4uY29tIn0seyJ0eXBlIjoiU01TIiwidG9rZW4iOiIrMTIzNDU2NzgifV19.\_iazvUy6krturWicV1eXqPzptzIB8y_GmvDXfFp6OXNxiLvI2wRkWS5iH_gJWPmyZc48KLpJXgR2RT6Jn8_5Aw"

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から、トークンアイデンティティ検証をトグルして有効にします。

トークンアイデンティティ検証の有効化

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

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

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

REST API

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