SDK 認証
SDK 認証を使用すると、ログイン ユーザーに代わって行われた SDK 要求に暗号化証明 (サーバー側で生成) を提供できます。
アプリでこの機能を有効にすると、JSON Web Token(JWT)署名が無効または欠落しているリクエストを拒否するようにBrazeダッシュボードを設定できます。
- カスタムイベント、属性、購入、セッションデータの送信
- Brazeワークスペースで新しいユーザーを作成する
- 標準ユーザー・プロファイル属性の更新
- メッセージの受信またはトリガー
認証されていないログインユーザーがアプリの SDK API キーを使用して、他のユーザーになりすますなどの悪意のあるアクションを実行するのを防ぐことができるようになりました。
開始:
開始するには、次の 4 つの大まかな手順があります。
- サーバー側の統合 - 公開キーと秘密キーのペアを生成し、秘密キーを使用して現在ログインしているユーザーの JWT を作成します。
- SDK統合 - Braze SDKでこの機能を有効にし、サーバーから生成されたJWTをリクエストします。
- 公開鍵の追加 - Brazeダッシュボードの「設定管理」ページに_公開鍵_を追加します。
- Brazeダッシュボード内での適用の切り替え - Brazeダッシュボード内でこの機能の適用をアプリごとに切り替えます。
サーバー側の統合
公開鍵と秘密鍵のペアを生成する
RSA256公開鍵と秘密鍵のペアを生成します。公開鍵は最終的にBrazeダッシュボードに追加され、秘密鍵はサーバーに安全に保管する必要があります。
RS256 JWT アルゴリズムで使用できるように、2048 ビットの RSA キーが推奨されます。
秘密鍵は _秘密_にしておくことを忘れないでください。アプリやウェブサイトで秘密鍵を公開したり、ハードコードしたりしないでください。秘密キーを知っているユーザーは誰でも、アプリケーションの代わりにユーザーを偽装したり、ユーザーを作成したりできます。
現在のユーザーの JSON Web トークンを作成する
秘密鍵を取得したら、サーバー側のアプリケーションはそれを使用して、現在ログインしているユーザーのアプリまたはWebサイトにJWTを返す必要があります。
通常、このロジックは、アプリが現在のユーザーのプロファイルを通常要求する場所であればどこにでも配置できます。たとえば、ログイン エンドポイントや、アプリが現在のユーザーのプロファイルを更新する場所などです。
JWT を生成する場合、次のフィールドが必要です。
JWT ヘッダー
分野 | 必須項目 | 説明 |
---|---|---|
alg |
はい | サポートされているアルゴリズムは です RS256 。 |
typ |
はい | 型は と等しく JWT なければなりません。 |
JWT ペイロード
分野 | 必須項目 | 説明 |
---|---|---|
sub |
はい | 「件名」は、Braze SDKを呼び出すときに changeUser 指定したユーザーIDと等しくなければなりません。 |
exp |
はい | このトークンの有効期限の「有効期限」。 |
aud |
いいえ | “audience” 要求は省略可能であり、設定 braze する場合は |
iss |
いいえ | “issuer” 要求は省略可能であり、設定する場合は SDK API キーと等しくなります。 |
JWT ライブラリ
JSON Web Tokenの詳細や、この署名プロセスを簡素化する多くのオープンソースライブラリを参照するには、 https://jwt.io をご覧ください。
SDK統合
この機能は、次の [SDK バージョン](/docs/ja 以降で使用できます。/user_guide/engagement_tools/campaigns/ideas_and_strategies/new_features/#filtering-by-most-recent-app-versions):
Braze SDKでこの機能を有効にします。
この機能を有効にすると、Braze SDKは、Braze Serverへのネットワークリクエストに、現在のユーザーの最後に認識されたJWTを追加します。
このオプションのみで初期化しても、Brazeダッシュボード内で 認証の適用 を開始するまで、データ収集にはまったく影響しませんのでご安心ください。
を呼び出す initialize
ときは、省略可能な enableSdkAuthentication
プロパティ true
を に設定します。
1
2
3
4
5
import * as braze from"@braze/web-sdk";
braze.initialize("YOUR-API-KEY-HERE", {
baseUrl: "YOUR-SDK-ENDPOINT-HERE",
enableSdkAuthentication: true,
});
Appboy インスタンスを設定するときは、setIsSdkAuthenticationEnabled
.true
1
2
3
BrazeConfig.Builder brazeConfigBuilder = new BrazeConfig.Builder()
.setIsSdkAuthenticationEnabled(true);
Braze.configure(this, brazeConfigBuilder.build());
または、braze.xmlに追加する <bool name="com_braze_sdk_authentication_enabled">true</bool>
こともできます。
Appboy インスタンスを設定するときは、setIsSdkAuthenticationEnabled
.true
1
2
3
BrazeConfig.Builder brazeConfigBuilder = BrazeConfig.Builder()
.setIsSdkAuthenticationEnabled(true)
Braze.configure(this, brazeConfigBuilder.build())
または、braze.xmlに追加する <bool name="com_braze_sdk_authentication_enabled">true</bool>
こともできます。
SDK認証を有効にするには、Brazeインスタンスを初期化する前に、オブジェクトのプロパティBRZConfiguration
をconfiguration.api.sdkAuthentication
に設定しますYES
。
1
2
3
4
5
6
BRZConfiguration *configuration =
[[BRZConfiguration alloc] initWithApiKey:@"{BRAZE_API_KEY}"
endpoint:@"{BRAZE_ENDPOINT}"];
configuration.api.sdkAuthentication = YES;
Braze *braze = [[Braze alloc] initWithConfiguration:configuration];
AppDelegate.braze = braze;
SDK 認証を有効にするには、SDK の初期化時にオブジェクトのプロパティBraze.Configuration
を次のようにtrue
設定configuration.api.sdkAuthentication
します。
1
2
3
4
5
let configuration = Braze.Configuration(apiKey: "{YOUR-BRAZE-API-KEY}",
endpoint: "{YOUR-BRAZE-ENDPOINT}")
configuration.api.sdkAuthentication = true
let braze = Braze(configuration: configuration)
AppDelegate.braze = braze
現在、SDK 認証は、ネイティブ iOS および Android コードで SDK を初期化する一環として有効にする必要があります。Flutter SDKでSDK認証を有効にするには、他のタブからiOSとAndroidの統合に従ってください。SDK認証を有効にすると、残りの機能をDartに統合できます。
現在のユーザーの JWT トークンを設定する
アプリが Braze changeUser
メソッドを呼び出すたびに、 サーバー側で生成された JWT トークンも指定します。
また、現在のユーザーのセッションの途中で更新するようにトークンを構成することもできます。
これは changeUser
、ユーザーID _が実際に変更_された場合にのみ呼び出す必要があることに注意してください。このメソッドは、ユーザー ID が変更されていない場合に署名を更新する方法として使用しないでください。
以下を呼び出す changeUser
ときに JWT トークンを指定します。
1
2
import * as braze from "@braze/web-sdk";
braze.changeUser("NEW-USER-ID", "JWT-TOKEN-FROM-SERVER");
または、セッションの途中でユーザーのトークンを更新した場合は、次のようになります。
1
2
import * as braze from"@braze/web-sdk";
braze.setSdkAuthenticationSignature("NEW-JWT-TOKEN-FROM-SERVER");
以下を呼び出す appboy.changeUser
ときに JWT トークンを指定します。
1
Braze.getInstance(this).changeUser("NEW-USER-ID", "JWT-TOKEN-FROM-SERVER");
または、セッションの途中でユーザーのトークンを更新した場合は、次のようになります。
1
Braze.getInstance(this).setSdkAuthenticationSignature("NEW-JWT-TOKEN-FROM-SERVER");
以下を呼び出す appboy.changeUser
ときに JWT トークンを指定します。
1
Braze.getInstance(this).changeUser("NEW-USER-ID", "JWT-TOKEN-FROM-SERVER")
または、セッションの途中でユーザーのトークンを更新した場合は、次のようになります。
1
Braze.getInstance(this).setSdkAuthenticationSignature("NEW-JWT-TOKEN-FROM-SERVER")
以下を呼び出す changeUser
ときに JWT トークンを指定します。
1
[AppDelegate.braze changeUser:@"userId" sdkAuthSignature:@"signature"];
または、セッションの途中でユーザーのトークンを更新した場合は、次のようになります。
1
[AppDelegate.braze setSDKAuthenticationSignature:@"signature"];
以下を呼び出す changeUser
ときに JWT トークンを指定します。
1
AppDelegate.braze?.changeUser(userId: "userId", sdkAuthSignature: "signature")
または、セッションの途中でユーザーのトークンを更新した場合は、次のようになります。
1
AppDelegate.braze?.set(sdkAuthenticationSignature: "signature")
以下を呼び出す changeUser
ときに JWT トークンを指定します。
1
braze.changeUser("userId", sdkAuthSignature: "signature")
または、セッションの途中でユーザーのトークンを更新した場合は、次のようになります。
1
braze.setSdkAuthenticationSignature("signature")
無効なトークンのコールバック関数を登録する
この機能を 必須に設定すると、次のシナリオで SDK リクエストが Braze によって拒否されます。 - Braze APIが受信するまでにJWTの有効期限が切れている - JWTが空または欠落している - JWTは、Brazeダッシュボードにアップロードした公開鍵の検証に失敗しました。
サブ subscribeToSdkAuthenticationFailures
スクライブを使用すると、これらの理由のいずれかで SDK 要求が失敗したときに通知を受け取ることができます。コールバック関数には、エラーuserId
に関連する ‘errorCode’ reason
を持つオブジェクト、要求の (ユーザーが匿名でない場合)、およびエラーの原因となった認証signature
が含まれます。
失敗した要求は、アプリが新しい有効な JWT を提供するまで定期的に再試行されます。そのユーザーがまだログインしている場合は、このコールバックを機会にサーバーに新しいJWTをリクエストし、Braze SDKにこの新しい有効なトークンを提供することができます。
これらのコールバックメソッドは、独自の監視サービスやエラーログサービスを追加して、Brazeリクエストが拒否される頻度を追跡するのに最適な場所です。
1
2
3
4
5
6
7
import * as braze from"@braze/web-sdk";
braze.subscribeToSdkAuthenticationFailures((error) => {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
const updated_jwt = await getNewTokenSomehow(error);
appboy.setSdkAuthenticationSignature(updated_jwt);
});
1
2
3
4
5
6
Braze.getInstance(this).subscribeToSdkAuthenticationFailures(error -> {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the error user matches the currently logged-in user
String newToken = getNewTokenSomehow(error);
Braze.getInstance(getContext()).setSdkAuthenticationSignature(newToken);
});
1
2
3
4
5
6
Braze.getInstance(this).subscribeToSdkAuthenticationFailures({ error: BrazeSdkAuthenticationErrorEvent ->
// TODO: Optionally log to your error-reporting service
// TODO: Check if the `user_id` within the `error` matches the currently logged-in user
val newToken: String = getNewTokenSomehow(error)
Braze.getInstance(getContext()).setSdkAuthenticationSignature(newToken)
})
Braze Swift SDKのバージョン5.14.0
から、SDK認証デリゲートメソッドはBrazeDelegate
BrazeSDKAuthDelegate
、
```objc Braze *braze = [[Braze alloc] initWithConfiguration:configuration]; braze.sdkAuthDelegate = デリゲート; AppDelegate.braze = braze;
// Method to implement in delegate
- (void)braze:(Braze *)braze sdkAuthenticationFailedWithError:(BRZSDKAuthenticationError *)error {
// TODO: Optionally log to your error-reporting service
藤堂:within
error
が現在ログインしているユーザーと一致するかどうかを確認しますuser_id
NSLog(@”Invalid SDK Authentication signature.”); NSString *newSignature = getNewSignatureSomehow(error); [AppDelegate.braze setSDKAuthenticationSignature:newSignature]; () ```
Braze Swift SDKのバージョン5.14.0
から、SDK認証デリゲートメソッドがプロトコルからBrazeSDKAuthDelegate
分離BrazeDelegate
されました。これより前のバージョンを使用している場合は、 に準拠し BrazeDelegate
ている任意の場所に SDK 認証デリゲート メソッドを実装する必要があります。
```swift let braze = Braze(configuration: configuration) braze.sdkAuthDelegate = デリゲート AppDelegate.braze = braze
// Method to implement in delegate
func braze(_ braze: Braze, sdkAuthenticationFailedWithError error: Braze.SDKAuthenticationError) {
// TODO: Optionally log to your error-reporting service
藤堂:withinerror
が現在ログインしているユーザーと一致するかどうかを確認しますuser_id
print(“Invalid SDK Authentication signature.”)
let newSignature = getNewSignatureSomehow(error)
AppDelegate.braze?.set(sdkAuthenticationSignature: newSignature)
()
```
```dart
braze.setBrazeSdkAuthenticationErrorCallback((BrazeSdkAuthenticationError error) async {
// TODO: Optionally log to your error-reporting service
// TODO: Check if the user_id
within は error
、現在ログインしているユーザーと一致します
print(“Invalid SDK Authentication signature.”)
let newSignature = getNewSignatureSomehow(error)
braze.setSdkAuthenticationSignature(newSignature);
});
```
公開鍵の追加
ダッシュボードの「 設定の管理 」ページで、Brazeダッシュボードの特定のアプリに公開鍵を追加します。各アプリは、最大 3 つの公開キーをサポートします。複数のアプリで同じ公開鍵と秘密鍵が使用される可能性があることに注意してください。
公開鍵を追加するには、次のようにします。
- 利用可能なアプリの一覧からアプリを選択します。
- 「 SDK認証」で、「 公開鍵の追加」をクリックします。
- 公開鍵を貼り付け、オプションの説明を追加します。
- 変更を保存すると、公開キーの一覧にキーが表示されます。
キーを削除したり、キーを主キーに昇格したりするには、各キーの横にあるオーバーフローメニューで対応するアクションを選択します。
Brazeダッシュボードで有効化する
サーバーサイド統合とSDK統合が完了したら、これらの特定のアプリに対してこの機能を有効にし始めることができます。
BrazeダッシュボードでアプリのSDK認証設定が [必須 ]に設定されていない限り、SDKリクエストは認証なしで通常どおり流れ続けることに注意してください。
統合に問題が発生した場合(たとえば、アプリが誤ってトークンをSDKに渡している、サーバーが無効なトークンを生成しているなど)、Brazeダッシュボードでこの機能を無効にすると、検証なしでデータの流れが通常どおり再開されます。
適用オプション
ダッシュボードの [Manage Settings ] ページには、Braze がリクエストを検証する方法を制御する 3 つの SDK 認証状態があります。
設定 | 説明 |
---|---|
無効 | Brazeは、ユーザーに提供されたJWTを検証しません。(デフォルト設定) |
オプション | Brazeはログインユーザーのリクエストを検証しますが、無効なリクエストは拒否しません。 |
必須項目 | Brazeは、ログインしたユーザーのリクエストを検証し、無効なJWTを拒否します。 |
[省略可能] 設定は、この機能がアプリの SDK トラフィックに及ぼす潜在的な影響を監視するのに便利な方法です。
無効な JWT 署名は Optional 状態と Required 状態の両方で報告されますが、SDK 要求が拒否されるのは Required 状態のみで、アプリは再試行して新しい署名を要求します。
分析
各アプリには、この機能が [オプション ] と [必須 ] の状態の間に収集された SDK 認証エラーの内訳が表示されます。
データはリアルタイムで利用でき、グラフ内のポイントにカーソルを合わせると、特定の日付のエラーの内訳を確認できます。
![認証エラーのインスタンス数を示すグラフ。また、エラーの合計数、エラーの種類、および調整可能な日付範囲も表示されます。10
エラーコード
エラーコード | エラーの理由 | 説明 |
---|---|---|
10 | EXPIRATION_REQUIRED |
有効期限は、Brazeの使用に必要なフィールドです。 |
20 | DECODING_ERROR |
一致しない公開キーまたは一般的なキャッチされないエラー。 |
21 | SUBJECT_MISMATCH |
想定される科目と実際の科目は同じではありません。 |
22 | EXPIRED |
指定されたトークンの有効期限が切れています。 |
23 | INVALID_PAYLOAD |
トークンペイロードが無効です。 |
24 | INCORRECT_ALGORITHM |
トークンのアルゴリズムはサポートされていません。 |
25 | PUBLIC_KEY_ERROR |
公開鍵を適切な形式に変換できませんでした。 |
26 | MISSING_TOKEN |
要求でトークンが指定されていません。 |
27 | NO_MATCHING_PUBLIC_KEYS |
指定されたトークンと一致する公開キーがありませんでした。 |
28 | PAYLOAD_USER_ID_MISMATCH |
要求ペイロード内のすべてのユーザー ID が必要に応じて一致するわけではありません。 |
よくある質問
この機能は、すべてのアプリで同時に有効にする必要がありますか?
いいえ、この機能は特定のアプリに対して有効にすることができ、すべてのアプリで一度に使用する必要はありません。
古いバージョンのアプリをまだ使用しているユーザーはどうなりますか?
この機能の適用を開始すると、古いバージョンのアプリによるリクエストはBrazeによって拒否され、SDKによって再試行されます。ユーザーがサポートされているバージョンにアプリをアップグレードすると、エンキューされた要求が再び受け入れられるようになります。
可能であれば、他の必須アップグレードの場合と同様に、ユーザーにアップグレードを促す必要があります。または、許容できる割合のユーザーがアップグレードされたことを確認するまで、この機能を オプション のままにしておくこともできます。
JWTトークンを生成するときは、どの有効期限を使用する必要がありますか?
平均セッション時間、セッション Cookie/トークンの有効期限、またはアプリケーションが現在のユーザーのプロファイルを更新する頻度の値を大きくすることをお勧めします。
ユーザーのセッションの途中で JWT の有効期限が切れた場合はどうなりますか?
ユーザーのトークンがセッションの途中で期限切れになった場合、SDK は呼び出して 、Brazeにデータを送信し続けるために新しいJWTトークンが必要であることをアプリに知らせるために呼び出します。
サーバー側の統合が中断され、JWT を作成できなくなった場合はどうなりますか?
サーバーがJWTトークンを提供できない場合、または統合の問題に気付いた場合は、Brazeダッシュボードでいつでもこの機能を無効にすることができます。
無効にすると、保留中の失敗したSDKリクエストは最終的にSDKによって再試行され、Brazeによって受け入れられます。
この機能が共有シークレットの代わりに公開キー/秘密キーを使用するのはなぜですか?
共有シークレットを使用すると、Brazeダッシュボードページなど、その共有シークレットにアクセスできる人なら誰でもトークンを生成し、エンドユーザーになりすますことができます。
代わりに、公開鍵/秘密鍵を使用しているため、Brazeの従業員(ダッシュボードユーザーは言うまでもなく)でさえ、秘密鍵にアクセスできません。
拒否された要求はどのように再試行されますか?
認証エラーが原因でリクエストが拒否されると、SDKはユーザーのJWT署名の更新に使用されるコールバックを呼び出します。
要求は、エクスポネンシャル バックオフ アプローチを使用して定期的に再試行されます。50回連続して失敗すると、次のセッションが開始されるまで再試行が一時停止されます。各 SDK には、データ フラッシュを手動で要求する方法もあります。