概要:クリックに署名の検証を追加することで、広告不正による被害を回避することが可能です。これにより、不正なクリックがアドネットワークに紐付けられなくなります。
クリック署名について
不正業者は、ごくわずかな技術でアドネットワークに代わって、数千はたまた数百万もの偽クリックを作成し、AppsFlyerへ送信することが可能です。アドネットワーク自身がこのような問題が発生していることを認識できていない場合もあります。
AppsFlyerによって媒体へ紐付けられたクリックが、不正業者によって作られた偽クリックではなく実際にアドネットワークから発生したものであることを確実にするために、HMAC-SHA256の署名を使ってクリックに署名を付与することをおすすめします。
また、クリック署名はクリック洪水によってアドネットワークの計測がブロックされるのを防ぐことにも役立つでしょう。アドネットワークが極端なレベルのクリック洪水によりブロックのしきい値に達してしまうと、AppsFlyerはクリックの記録と成果の紐付けを停止するからです。
この署名によりAppsFlyerはクリックを検証でき、クリック情報が不正業者によって操作されていないことを確認します。
- 検証されたクリックは記録され、アドネットワークへ紐付けられます。
-
無効になったクリックは除外され、以下のように処理されます:
- アドネットワーク向け(広告主向けではなく)に提供されるProtect360のレポート画面に集計されます。(詳細)
- アドネットワークのコンバージョン率やクリック洪水のしきい値には影響を与えません。
クリック署名の連携
フロー
以下のチャートでは、初期の開発と基本テストから実稼働テスト、そして最終的な実稼働までの流れの概要を示しています。
手順
前提条件: クリック署名のAPI利用を承認するために、パートナーアカウントの管理者権限でV2.0のAPIトークンが必要です。
クリックに署名するには:
-
シークレットキーの生成APIを使用して、シークレットキーを生成してください。
推奨:24時間毎に新しいシークレットキーを生成して使用してください。シークレットキーの有効期限は36時間です。 -
シークレットキーの生成APIの呼び出し、受け取りとHMAC-SHA256の署名を作成するコードを、御社のサーバー内で開発してください。(コードサンプルも参照可能です。)
以下の表に記載されている他のAPIも利用可能です。 - 以下のようにコードをクリックURLに追加してください:
- expiresのパラメータには、アドネットワークがクリックを主張しなくなるUnixのタイムスタンプを含めてください。
- HMAC-SHA256の署名情報を含めてください。
例:https://app.appsflyer.com/com.app.id?pid=adnetwork_int&c=my_campaign&clickid=sdkfjasksjskdfj9845weh&af_siteid=12345&expires=1597657118&signature_v2=8fnDVzZP_WRZnv3KNJaREOEfvB5p9oRc_XlKEvUo8gk
注記
リンク内に含まれている特殊文字や記号、スペースのURLエンコードは、必ずクリック署名を生成するよりも前に行ってください。 最初に署名を生成してしまうと、検証が失敗してしまうのでご注意ください。
クリック署名の作成
クリック署名を作成するには以下の作業が必要です:
- 以下の各種属性(パラメータ)とJSONルールを使用して、JSONを作成してください。
- HMAC56を使用して、このJSONから署名を作成してください。
属性(パラメータ)一覧
クリック署名とエンゲージメント署名でサポートされている属性(パラメータ)は以下です:
順序 | パラメーター | 必須 | 備考 |
---|---|---|---|
1 | link_domain | はい |
クリックURLのドメインです。
|
2 | link_path | はい | クリックURLのpathで、先頭のバックスラッシュは含みません。 単一プラットフォームのURLの場合はapp-id、OneLinkのURLの場合はtenplate-idです。 |
3 | pid | はい | |
4 | af_prt | いいえ | |
5 | af_siteid | はい | |
6 | clickid | はい | クリック毎にユニークなクリック識別子です。 |
7 | expires | はい | クリックの有効期限です。 |
8 | af_engagement_type | いいえ | |
9 | af_click_lookback | いいえ | |
10 | af_viewthrough_lookback | いいえ | |
11 | af_reengagement_window | いいえ | |
12 | is_retargeting | いいえ | |
13 | af_ip | いいえ | |
14 | advertising_id | いいえ | |
15 | oaid | いいえ | |
16 | fire_advertising_id | いいえ | |
17 | idfa | いいえ | |
18 | idfv | いいえ |
属性(パラメータ)とJSONの仕様
属性(パラメータ)の順序と表示について
- エンゲージメントURLでサポートされているパラメータと値の組み合わせは、JSON内に含まれている必要があります。
- 属性(パラメータ)は、上の表に記載されている順序でJSONにリストする必要があるので注意してください。
空の属性(パラメータ)について
- JSON内に記載される属性(パラメータ)を空の値にしたり、スペースのみを渡すことはできません。
JSONのデータ構造
- JSONのデータ構造は、属性(パラメータ)の配列(array)である必要があります。
- 各属性(パラメータ)は["key", "value"]のフォーマットで記載してください。
例:[["key-1","value-1"],["key-2","value-2"]...["key-n","value-n"]]
- 各属性(パラメータ)は["key", "value"]のフォーマットで記載してください。
属性値の制限事項
- JSONの値は、JSON標準で定義されているように、すべて小文字の文字列で記述する必要があります。
JSONのスペースについて
- JSONはコンパクトにする必要があり、値の間に空白、タブ、改行文字を含めることはできません。
署名のアルゴリズムについて
- HmacSHA256をシークレットキーに使用して、JSONの署名を作成してください。
- パディングなしでBase64で署名をエンコードしてください。
- クリックURLに、signature_v2のパラメータと一緒に署名を追加してください。
//generate a signature from the click url and encode it with base64 without padding String generatedSignature = Base64.getUrlEncoder().withoutPadding().encodeToString(mac.doFinal(jsonString.getBytes()));
署名のサンプル
署名例の作成
OneLinkクリックURLの例:
https://yourbrand.onelink.me/qsWL?pid=mediasource_int&advertising_id=12345678-1234-1234-1234-123456789012
&af_ad_type=video&af_adset=MMP&clickid=sdkfjasksjskdfj9845weh&af_siteid=my_site&af_viewthrough_lookback=2h&c=my_campaign
&expires=1689695615
署名のJSONオブジェクトの例(ブランクスペースを削除する前):
[
["link_domain","yourbrand.onelink.me"],
["link_path","qswl"],
["pid","mediasource_int"],
["af_siteid","my_site"],
["clickid","12345"],
["expires","1689695615"]
]
署名のJSONオブジェクトの例(ブランクスペースを削除した後):
[["link_domain","yourbrand.onelink.me"],["link_path","qswl"],["pid","mediasource_int"],["template-id","qswl"],["af_siteid","my_site"],["clickid","12345"],["expires","1689695615"]]
署名付きの最終クリックURL:
https://yourbrand.onelink.me/qsWL?pid=mediasource_int&advertising_id=12345678-1234-1234-1234-123456789012
&af_ad_type=video&af_adset=MMP&af_siteid=my_site&af_viewthrough_lookback=2h&c=my_campaign
&expires=1689695615
&signature_v2=WIfCmfLAPSsVrBTqCqfihMeLCnbE4dIAlhHF84WsiWA
コード例
signing-supported-params.json
[
{"index":1, "name":"pid", "mandatory":true},
{"index":2, "name":"af_prt", "mandatory":false},
{"index":3, "name":"af_siteid", "mandatory":true},
{"index":4, "name":"clickid", "mandatory":true},
{"index":5, "name":"expires", "mandatory":true},
{"index":6, "name":"af_engagement_type", "mandatory":false},
{"index":7, "name":"af_click_lookback", "mandatory":false},
{"index":8, "name":"af_viewthrough_lookback", "mandatory":false},
{"index":9, "name":"af_reengagement_window", "mandatory":false},
{"index":10, "name":"is_retargeting", "mandatory":false},
{"index":11, "name":"af_ip", "mandatory":false},
{"index":12, "name":"advertising_id", "mandatory":false},
{"index":13, "name":"oaid", "mandatory":false},
{"index":14, "name":"fire_advertising_id", "mandatory":false},
{"index":15, "name":"idfa", "mandatory":false},
{"index":16, "name":"idfv", "mandatory":false}
]
signature-example.go
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
"net/url"
"os"
"strings"
"time"
)
type Param struct {
Name string
Mandatory bool
}
func LoadSupportedParams() ([]Param, error) {
path := "./signing-supported-params.json"
jsonFile, _ := os.Open(path)
defer jsonFile.Close()
byteValue, err := io.ReadAll(jsonFile)
if err != nil {
return nil, errors.New("failed loading " + path)
}
var params []Param
_ = json.Unmarshal(byteValue, ¶ms)
return params, nil
}
func computeHmac256(message, secret string) (res string, errResult error) {
defer func() {
if r := recover(); r != nil {
errResult = r.(error)
fmt.Println("failed to invoke ComputeHmac256. err: %+v", errResult)
res = ""
return
}
}()
key := []byte(secret)
h := hmac.New(sha256.New, key)
h.Write([]byte(message))
return base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(h.Sum(nil)), nil
}
// this function accepts a click url, a ttl for the click in seconds, and the list of supported params
// the function:
// 1. adds the expiration to the click based on the provided ttl
// 2. builds a json for the signature
// 3. create an HMAC256 signature
// 4. adds the signature to the click url
func signURLV2(originalURL string, secret string, clickTtlSeconds int64, supportedParams []Param) (signedURL string, err error) {
//add an expiration to the click
expires := time.Now().UTC().Unix() + clickTtlSeconds
urlWithExpired := fmt.Sprintf("%s%s%d", originalURL, "&expires=", expires)
//parse the url
parsedURL, err := url.Parse(urlWithExpired)
if err != nil {
return "", errors.New("failed parsing URL")
}
//build a json from the url
jsonStr, err := buildJSONFromURLV2(parsedURL, supportedParams)
if err != nil {
return "", err
}
//create a signature
signatureV2, err := computeHmac256(jsonStr, secret)
if err != nil {
fmt.Println("Failed to computeHMAC256 for url %s. err: %+v", jsonStr, err)
return "", errors.New("fail to computeHMAC256 for url")
}
//add the signature to the url
signedURL = fmt.Sprintf("%s%s%s", urlWithExpired, "&signature_v2=", signatureV2)
return signedURL, nil
}
// this function builds a json from a given click url.
// 署名する準備ができている json の文字列表現を返します。
func buildJSONFromURLV2(parsedURL *url.URL, supportedParams []Param) (string, error) {
//initiate an empty json in the structure [[key-1,val-1],[key-2,val-2]...[key-n,val-n]]
var jsonData [][2]string
//add the url host domain to the json
domain := parsedURL.Host
param := [2]string{"link_domain", domain}
jsonData = append(jsonData, param)
//add the path (app-id or template-id) to the json
path := parsedURL.Path
if len(path) > 1 {
param := [2]string{"link_path", path[1:]}
jsonData = append(jsonData, param)
}
//loop over the ordered list of supported parameters and add them to the json
for i := 0; i <len(supportedParams); i++ {name := supportedParams[i].Name val := parsedURL.Query().Get(name) if len(val) > 0 {
param := [2]string{name, val}
jsonData = append(jsonData, param)
} else if supportedParams[i].Mandatory {
return "", errors.New("missing mandatory param: " + name)
}
}
//generate string representation of the json object
jsonObj, _ := json.Marshal(jsonData)
return strings.ToLower(string(jsonObj)), nil
}
func main() {
supportedParams, err := LoadSupportedParams()
if err != nil {
fmt.Println("Error: ", err)
os.Exit(1)
}
var secretKey = "tqJU4Qd/eFTEWfqW7KCG9asDO0bmZoFzv8GY3VPSPAM="
var clickTtlSeconds int64 = 60
var originalUrl = "https://yourbrand.onelink.me/qsWL?pid=mediasource_int&advertising_id=12345678-1234-1234-1234-123456789012&clickid=1234&af_ad_type=video&af_adset=MMP&af_siteid=my_site&af_viewthrough_lookback=2h&c=my_campaign"
fmt.Println("Original URL: ", originalUrl)
signedUrl, err := signURLV2(originalUrl, secretKey, clickTtlSeconds, supportedParams)
if err != nil {
fmt.Println("Error: ", err)
os.Exit(1)
} else {
fmt.Println("Signed URL: ", signedUrl)
}
}
クリック署名の各種API
AppsFlyerでは、アドネットワークがクリック署名のプロセスを管理・テストできる各種APIを用意しています。以下表のAPI一覧と、APIの利用に必要な各種情報をまとめた各セクションを参照してください。
クリック署名の各種API
APIメソッド | 備考 |
---|---|
Generate secret key | 署名に使用するシークレットキーを生成します。 |
Revoke secret key | シークレットキーを無効化します。 |
Test | 署名をテストするために単発のクリックを送信します。 |
Configure mode |
クリック署名の各モードを設定します:
|
Configure circuit breaker |
過剰にクリックがブロックされてしまうことを防ぐために、クリック署名の機能を遮断する設定が可能です:
|
Get configuration |
有効なシークレットキーのIDと選択されているモードを取得します。 |
Report |
システムがreport-onlyモードまたはenabledモードの場合に、正常なクリックと失敗したクリックに関する統計情報を取得します。このAPIを使用して、本番環境に影響を与えずにクリック署名をテストしてください。 |
Exclude app | クリック署名のルールから除外するアプリIDを設定します。 |
Remove excluded app | 一度除外した後に、再度クリック署名のルールに含めるアプリIDを設定します。 |
旧バージョンについて
以下のバージョンは使用せず、参照用としてのみ記載しています。
V1 - 旧バージョン
Generate secret keyのメソッド
Generate secret keyの基本仕様
カテゴリ | ポイント |
説明 |
---|---|---|
リクエスト | HTTP method | POST |
Path |
https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=<ttlHours> |
|
認証ヘッダー |
|
|
レスポンス | 結果 | JSON内でシークレットキーが返されます。 |
リクエスト制限 | 一度に最大2つまでシークレットキーをアクティブにできます |
APIリクエスト
メソッド
POST https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=<ttlHours>
パラメーター
パラメーター |
説明 |
---|---|
ttlHours |
|
JSONレスポンス
Key |
説明 |
---|---|
secret-key-id |
シークレットキーのIDです。 |
secret key |
クリック署名のシークレットキーです。 |
expiration |
ミリ秒単位のエポックタイムです。 |
Generate secret keyのcurlサンプルとレスポンス
Curl リクエスト
curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/secret?ttlHours=36' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'
JSONレスポンス
{
"secret-key-id": "59ad6547-affc-45eb-a6c9-9805f88ee755",
"secret-key": "zGW6Rhrmb8+vuhHtL/Kp6rW5Ci9PNsjH1J5MGO9SIeg=",
"expiration": 1610533263
}
HTTPのレスポンスコード
レスポンスコード
Code |
メッセージ |
備考 |
---|---|---|
200 | OK |
|
401 | 許可されていません |
認証ヘッダーが無効、または見つかりません。 |
Revoke secret keyのメソッド
Revoke secret keyの基本仕様
カテゴリ | ポイント |
説明 |
---|---|---|
リクエスト | HTTP method | 削除 |
Path |
https://hq1.appsflyer.com/api/p360-click-signing/secret/<secret-id> |
|
認証ヘッダー |
|
|
レスポンス | 結果 | Empty |
APIリクエスト
メソッド
DELETE https://hq1.appsflyer.com/api/p360-click-signing/secret/<secret-id>
パラメーター
パラメーター |
説明 |
---|---|
secret-id |
無効にするシークレットキーのIDです。 |
Generate secret keyのcurlサンプルとレスポンス
Curl リクエスト
curl --location --request DELETE 'https://hq1.appsflyer.com/api/p360-click-signing/secret/59ad6547-affc-45eb-a6c9-9805f88ee755' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'
HTTPのレスポンスコード
レスポンスコード
Code |
メッセージ |
備考 |
---|---|---|
200 | OK |
|
401 | 許可されていません |
認証ヘッダーが無効、または見つかりません。 |
Testのメソッド
Testの基本仕様
カテゴリ | ポイント |
説明 |
---|---|---|
リクエスト | HTTP method | POST |
Path |
https://hq1.appsflyer.com/api/p360-click-signing/test |
|
認証ヘッダー |
|
|
レスポンス | 結果 | JSONで返されます。 |
APIリクエスト
メソッド
POST https://hq1.appsflyer.com/api/p360-click-signing/test
パラメーター
パラメーター |
説明 |
---|---|
URL |
署名を含む、テストで使用するクリックURLです。 |
JSONレスポンス
Key |
説明 |
---|---|
test-status |
Passed(成功) もしくは Failed(失敗) |
メッセージ |
テストの失敗理由。例:
|
Testのcurlサンプルとレスポンス
Curl リクエスト
curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/test' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}' \
--header 'Content-Type: application/json' \
--data-raw '{
"url": "https://app.appsflyer.com/com.app.id?pid=adnetwork_int&c=my_campaign&clickid=sdkfjasksjskdfj9845weh&af_site_id=12345&expires=1597657118&signature=8fnDVzZP_WRZnv3KNJaREOEfvB5p9oRc_XlKEvUo8gk"
}'
JSONレスポンス
{
"test-status":"Passed / Failed",
"message": "Invalid signature"
}
HTTPのレスポンスコード
レスポンスコード
Code |
メッセージ |
備考 |
---|---|---|
200 | OK |
|
401 | 許可されていません |
認証ヘッダーが無効、または見つかりません。 |
Configure modeのメソッド
Configure modeの基本仕様
カテゴリ | ポイント |
説明 |
---|---|---|
リクエスト | HTTP method | POST |
Path |
https://hq1.appsflyer.com/api/p360-click-signing/config/mode/<mode> |
|
認証ヘッダー |
|
|
レスポンス | 結果 | JSONで返されます。 |
APIリクエスト
メソッド
POST https://hq1.appsflyer.com/api/p360-click-signing/config/mode/<mode>
パラメーター
パラメーター |
説明 |
---|---|
mode |
選択肢:
|
Configure modeのcurlサンプル
Curl リクエスト
curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/config/mode/report-only' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'
HTTPのレスポンスコード
レスポンスコード
Code |
メッセージ |
備考 |
---|---|---|
200 | OK |
|
400 | Bad request |
Invalid mode (無効なモード) |
401 | 許可されていません |
認証ヘッダーが無効、または見つかりません。 |
Configure circuit breakerのメソッド
Configure circuit breakerの基本使用
カテゴリ | ポイント |
説明 |
---|---|---|
リクエスト | HTTP method | POST |
Path |
https://hq1.appsflyer.com/p360-click-signing/config/circuit-breaker |
|
認証ヘッダー |
|
|
レスポンス | 結果 | HTTPステータス |
APIリクエスト
メソッド
POST https://hq1.appsflyer.com/p360-click-signing/config/circuit-breaker
Request bodyのJSON
パラメーター |
説明 |
---|---|
status |
|
Configure circuit breakerのcurlサンプルとレスポンス
Curl リクエスト
curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/config/circuit-breaker' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'
--data-raw '{
"status":"enabled"
}'
HTTPのレスポンスコード
レスポンスコード
Code |
メッセージ |
備考 |
---|---|---|
200 | OK |
|
400 | Bad request |
無効なステータスです。 |
401 | 許可されていません |
認証ヘッダーが無効、または見つかりません。 |
Get configurationのメソッド
Get configurationの基本仕様
カテゴリ | ポイント |
説明 |
---|---|---|
リクエスト | HTTP method | GET |
Path |
https://hq1.appsflyer.com/api/p360-click-signing/config |
|
認証ヘッダー |
|
|
レスポンス | 結果 | JSONで返されます。 |
APIリクエスト
メソッド
GET https://hq1.appsflyer.com/api/p360-click-signing/config
JSONレスポンス
Key |
説明 |
---|---|
mode |
以下のいずれか:
|
circuit-breaker-config |
以下のいずれかのstatusを含む、JSONオブジェクトです:
|
active-key-ids |
アクティブなキーを保持したJSON配列です:
|
excluded-app-ids |
除外したアプリIDを含むJSON配列です。 |
Get configurationのcurlサンプルとレスポンス
Curl リクエスト
curl --location --request GET 'https://hq1.appsflyer.com/api/p360-click-signing/config' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'
JSONレスポンス
{
"mode": "report-only",
"active-key-ids": [
{
"secret-key-id": "59ad6547-affc-45eb-a6c9-9805f88ee755",
"expiration": 1610533263
}
],
"excluded-app-ids": [
"app-id-1", "app-id-2"
]
}
HTTPのレスポンスコード
レスポンスコード
Code |
メッセージ |
備考 |
---|---|---|
200 | OK |
|
401 | 許可されていません |
認証ヘッダーが無効、または見つかりません。 |
Reportのメソッド
Reportの基本仕様
カテゴリ | ポイント |
説明 |
---|---|---|
リクエスト | HTTP method | GET |
Path |
https://hq1.appsflyer.com/api/p360-click-signing/report |
|
認証ヘッダー |
|
|
レスポンス | 結果 | CSVで返されます。 |
APIリクエスト
メソッド
GET https://hq1.appsflyer.com/api/p360-click-signing/report
パラメーター
パラメーター |
説明 |
---|---|
start-date |
レポートの開始日時です。形式: yyyy-mm-ddThh |
end-date |
レポートの終了日時です。形式: yyyy-mm-ddThh |
API には、 start-dateとend-dateの両方を含めるか、もしくはどちらも入力しなくても機能します。start/end-dateが指定されていない場合、過去24時間の結果が表示されます。 |
CSVレスポンス
Column |
説明 |
---|---|
time |
クリックの日時です。形式:yyyy-mm-ddThh |
total_clicks |
レポート期間におけるクリック数の合計です。 |
valid_clicks |
レポート期間における有効なクリック数です。 |
missing_signature |
レポート期間における署名が欠損しているクリック数です。 |
expired_clicks |
レポート期間における署名の期限切れのクリック数です。 |
invalid_signature |
レポート期間における無効な署名のクリック数です。 |
no_active_secrets |
システム上に有効なシークレットキーがないために拒否されたクリック数です。(report-onlyモードの場合) |
Testのcurlサンプルとレスポンス
Curl リクエスト
curl --location --request GET 'https://hq1.appsflyer.com/api/p360-click-signing/report?start-date=2021-01-07T07&end-date=2021-01-17T12' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}' \
CSVレスポンス
time |
total_clicks |
valid_clicks |
missing_signature |
expired_clicks |
invalid_signature |
no_active_signatures |
---|---|---|---|---|---|---|
2021-01-17T07 |
928082156 |
928082156 |
0 |
0 |
0 |
0 |
2021-01-17T08 |
923796132 |
923796132 |
0 |
0 |
0 |
0 |
2021-01-17T09 |
917541373 |
917541373 |
0 |
0 |
0 |
0 |
2021-01-17T10 |
909977064 |
909977064 |
0 |
0 |
0 |
0 |
2021-01-17T11 |
965104299 |
965104299 |
0 |
0 |
0 |
0 |
2021-01-17T12 |
975134824 |
975134824 |
0 |
0 |
0 |
0 |
HTTPのレスポンスコード
レスポンスコード
Code |
メッセージ |
備考 |
---|---|---|
200 | OK |
|
401 | 許可されていません |
認証ヘッダーが無効、または見つかりません。 |
Exclude appのメソッド
Exclude appの基本仕様
カテゴリ | ポイント |
説明 |
---|---|---|
リクエスト | HTTP method | POST |
Path |
https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id> |
|
認証ヘッダー |
|
|
レスポンス | 結果 | Empty |
APIリクエスト
メソッド
POST https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>
パラメーター
パラメーター |
説明 |
---|---|
app-id |
クリック署名の検証対象から除外するアプリIDです。 |
Exclude appのcurlサンプル
Curl リクエスト
curl --location --request POST 'https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/appname.com' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'
HTTPのレスポンスコード
レスポンスコード
Code |
メッセージ |
備考 |
---|---|---|
200 | OK |
|
401 | 許可されていません |
認証ヘッダーが無効、または見つかりません。 |
Remove excluded appのメソッド
Remove excluded appの基本仕様
カテゴリ | ポイント |
説明 |
---|---|---|
リクエスト | HTTP method | 削除 |
Path |
https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id> |
|
認証ヘッダー |
|
|
レスポンス | 結果 | Empty |
APIリクエスト
メソッド
DELETE https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/<app-id>
パラメーター
パラメーター |
説明 |
---|---|
app-id |
クリック署名の検証対象から一度除外し、改めてそのリストから削除するアプリIDです。 |
Remove excluded appのcurlサンプル
Curl リクエスト
curl --location --request DELETE 'https://hq1.appsflyer.com/api/p360-click-signing/config/excluded-app/appname.com' \
-H 'Authorization: Bearer {API V2.0 token available to the admin in the dashboard.}'
HTTPのレスポンスコード
レスポンスコード
Code |
メッセージ |
備考 |
---|---|---|
200 | OK |
|
401 | 許可されていません |
認証ヘッダーが無効、または見つかりません。 |
Codeサンプル
package sign;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
.
.
.
String clickUrl = "https://app.appsflyer.com/com.app.id?pid=adnetwork_int&c=my_campaign&clickid=sdkfjasksjskdfj9845weh&af_site_id=12345";
String secretKey = "secret_key";
int ttlMinutes = 5;
//add expiration to the click URL
long expiration = System.currentTimeMillis() + (60000L * ttlMinutes);
clickUrl += "&expires="+expiration;
//create a SecretKey object from the given key string
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
//generate a signature from the click url and encode it with base64 without padding
String generatedSignature =
Base64.getUrlEncoder().withoutPadding().encodeToString(mac.doFinal(clickUrl.getBytes()));
//add the signature to the click URL
String signedClickUrl = clickUrl + "&signature=" + generatedSignature;
追加情報
トラブルシューティング
1時間に90%以上のクリックの署名検証が失敗した場合、クリック署名の検証を停止してreport-onlyモードに戻します。
これは、潜在的な技術的問題から貴社のトラフィックを保護し、異常なトラフィックの原因を見つけるための仕様です。
- 署名が想定通りに機能しており、クリックが正しくブロックされていることがわかった場合には、configure circuit breakerのメソッドを使ってcircuit-breakerを無効にしてください。
-
もしもクリックが誤ってブロックされていることがわかった場合:
- get configurationのメソッド を使ってクリック署名の設定を確認し、有効なシークレットキーを使用していることを確認してください。
- クリック署名レポートを使うと、ブロックされたクリックの詳細を確認し、無効と判定されたクリックの発生元(代理店 / アプリID)とその理由を調査可能です。
- 一般的ではない連携などが原因で特定のアプリにのみ問題が見つかった場合には、exclude appのAPIを使ってそのアプリをクリック署名の検証対象から除外してください。
-
設定周りに問題が見つかった場合には:
- report-onlyモードの実行を続けてください。
- 貴社側でのクリック署名のプロセスを修正してください。
- クリック署名レポートの結果を確認して、 クリックが想定通り認証されていることが確認できた場合には、再度クリック署名の検証を有効化してください。
よくある質問
Q. 本番環境に影響を与えずにクリック署名をテストするにはどうすればよいですか? A. クリック署名をテストする方法には以下2つの方法があります:
|
Q. APIトークンとシークレットキーの違いはなんですか? A. API トークン: クリック署名 API の承認と実行に使用するもので、アドネットワークごとに 1 つしか存在しません。AppsFlyer API V2.0トークンは管理者権限で管理画面から取得する必要があります。 シークレットキー: 署名の生成に使用されるものです。generate secret keyのメソッドを使用して秘密鍵を作成してください。また、新しいシークレットキーを作成するのも、アドネットワーク側の作業になります。詳しくは、特性のセクションを参照してください。 |
Q. クリック署名の機能を、特定のキャンペーンのみに適用することは可能ですか? A. いいえ、クリック署名はアドネットワークからのすべてのクリックに適用されます。特定のアプリのみを検証対象から除外することは可能ですが、キャンペーン単位での除外適用はできません。 |
特性
特性 |
説明 |
---|---|
クリック署名 | 署名はアドネットワークのサーバー上で生成する必要があります。 |
シークレットキー |
|
Report API | クリックの有効性の更新は、時間単位で集計されます。 |