クリック署名:アドネットワーク向け

概要:クリックに署名の検証を追加することで、広告不正による被害を回避することが可能です。これにより、不正なクリックがアドネットワークに紐付けられなくなります。

クリック署名について

不正業者は、ごくわずかな技術でアドネットワークに代わって、数千はたまた数百万もの偽クリックを作成し、AppsFlyerへ送信することが可能です。アドネットワーク自身がこのような問題が発生していることを認識できていない場合もあります。

AppsFlyerによって媒体へ紐付けられたクリックが、不正業者によって作られた偽クリックではなく実際にアドネットワークから発生したものであることを確実にするために、HMAC-SHA256の署名を使ってクリックに署名を付与することをおすすめします。

また、クリック署名はクリック洪水によってアドネットワークの計測がブロックされるのを防ぐことにも役立つでしょう。アドネットワークが極端なレベルのクリック洪水によりブロックのしきい値に達してしまうと、AppsFlyerはクリックの記録と成果の紐付けを停止するからです。

この署名によりAppsFlyerはクリックを検証でき、クリック情報が不正業者によって操作されていないことを確認します。

  • 検証されたクリックは記録され、アドネットワークへ紐付けられます。
  • 無効になったクリックは除外され、以下のように処理されます:
    • アドネットワーク向け(広告主向けではなく)に提供されるProtect360のレポート画面に集計されます。(詳細
    • アドネットワークのコンバージョン率やクリック洪水のしきい値には影響を与えません。

クリック署名の連携

フロー

以下のチャートでは、初期の開発と基本テストから実稼働テスト、そして最終的な実稼働までの流れの概要を示しています。 

Click_signing_integration_flow.png

手順

前提条件: クリック署名のAPI利用を承認するために、パートナーアカウントの管理者権限でV2.0のAPIトークンが必要です。

クリックに署名するには:

  1. シークレットキーの生成APIを使用して、シークレットキーを生成してください。
    推奨:24時間毎に新しいシークレットキーを生成して使用してください。シークレットキーの有効期限は36時間です。 
  2. シークレットキーの生成APIの呼び出し、受け取りとHMAC-SHA256の署名を作成するコードを、御社のサーバー内で開発してください。(コードサンプルも参照可能です。)
    以下の表に記載されている他のAPIも利用可能です。
  3. 以下のようにコードをクリック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エンコードは、必ずクリック署名を生成するよりも前に行ってください。 最初に署名を生成してしまうと、検証が失敗してしまうのでご注意ください。

クリック署名の作成

クリック署名を作成するには以下の作業が必要です:

  1. 以下の各種属性(パラメータ)JSONルールを使用して、JSONを作成してください。
  2. HMAC56を使用して、このJSONから署名を作成してください。

属性(パラメータ)一覧

クリック署名とエンゲージメント署名でサポートされている属性(パラメータ)は以下です:

順序 パラメーター 必須 備考
1 link_domain はい

クリックURLのドメインです。
例:

  • app.appsflyer.com
  • myapp.onelink.me
  • click.mycustomdomain.com
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"]]

属性値の制限事項

  • 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, &params)
	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

クリック署名の各モードを設定します: 

  • disabled (デフォルト設定): クリック署名の検証は行なわれません。
  • report-only (テストモード): AppsFlyerはクリック署名を検証しますが、無効な署名のクリックをブロックはしません。アドネットワークはReport APIを使ってクリックの成否に関する情報を取得可能です。本番環境に影響を与えずに、クリック署名の機能をテストしたい場合にご利用ください。
  • enabled: AppsFlyerが無効な署名を持つクリック、または署名が欠損しているクリックを実際にブロックします。
Configure circuit breaker

過剰にクリックがブロックされてしまうことを防ぐために、クリック署名の機能を遮断する設定が可能です:

  • enabled (デフォルト設定): Protext360のシステムが、無効と判別されたクリックの数が多すぎると判別した場合、誤ってブロックされた可能性のあるクリックを保護するために、以下のような変更が適用されます:
    • Configure modeのAPIをreport-onlyに変更します。
    • クリック署名のAPIが正しく設定されていることを確認するために、アドネットワークにアラートメールが送信されます。
  • disabled: ブロック率が異常に高い場合においても、Protect360が無効と判別された全てのクリックをブロックし続けます。
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
  • シークレットキーの有効期限です。1時間から1440時間(60日)まで設定可能です。
  • デフォルト設定は36時間です。

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(失敗)

メッセージ

テストの失敗理由。例:

  • Missing signature (署名がありません。)
  • Invalid signature (署名が無効です。)
  • Expired  (署名が期限切れです。)

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

選択肢:

  • enabled
    注意!"report-only"モードを数時間実行し、設定が正しく機能しており、全てのクリックが署名の検証を通過したことを確認した後にのみ、モードを"enabled"に設定してください。
  • disabled
  • report-only

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
  • enabled
  • disabled

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

以下のいずれか:

  • enabled
  • disabled
  • report-only
circuit-breaker-config

以下のいずれかのstatusを含む、JSONオブジェクトです:

  • enabled
  • disabled

active-key-ids

アクティブなキーを保持したJSON配列です:

  • secret-key-id: ランダムに生成されたシークレットキーのIDです。
  • expiration: シークレットキーのミリ秒単位のエポック時間で表現された有効期限です。

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を無効にしてください。
  • もしもクリックが誤ってブロックされていることがわかった場合:
    1. get configurationのメソッド を使ってクリック署名の設定を確認し、有効なシークレットキーを使用していることを確認してください。
    2. クリック署名レポートを使うと、ブロックされたクリックの詳細を確認し、無効と判定されたクリックの発生元(代理店 / アプリID)とその理由を調査可能です。
  • 一般的ではない連携などが原因で特定のアプリにのみ問題が見つかった場合には、exclude appのAPIを使ってそのアプリをクリック署名の検証対象から除外してください。
  • 設定周りに問題が見つかった場合には:
    1. report-onlyモードの実行を続けてください。
    2. 貴社側でのクリック署名のプロセスを修正してください。
    3. クリック署名レポートの結果を確認して、 クリックが想定通り認証されていることが確認できた場合には、再度クリック署名の検証を有効化してください。

よくある質問

Q. 本番環境に影響を与えずにクリック署名をテストするにはどうすればよいですか?

A. クリック署名をテストする方法には以下2つの方法があります:

  1. Test APIを使用してください。この方法は、開発段階で単一のクリックに対する署名をテストするのに便利な方法です。
  2. report-onlyモードを使用してください。report-onlyモードでは、本番環境のクリック署名が検証されブロックされ得るデータも確認が可能ですが、無効と判定されたクリックは実際にはブロックされません。そのため、実際のトラフィックに影響を与えることなく、クリック署名が機能していることをテスト可能です。

Q. APIトークンとシークレットキーの違いはなんですか?

A. API トークン: クリック署名 API の承認と実行に使用するもので、アドネットワークごとに 1 つしか存在しません。AppsFlyer API V2.0トークンは管理者権限で管理画面から取得する必要があります。

シークレットキー: 署名の生成に使用されるものです。generate secret keyのメソッドを使用して秘密鍵を作成してください。また、新しいシークレットキーを作成するのも、アドネットワーク側の作業になります。詳しくは、特性のセクションを参照してください

Q. クリック署名の機能を、特定のキャンペーンのみに適用することは可能ですか?

A. いいえ、クリック署名はアドネットワークからのすべてのクリックに適用されます。特定のアプリのみを検証対象から除外することは可能ですが、キャンペーン単位での除外適用はできません。

特性

特性

説明

クリック署名 署名はアドネットワークのサーバー上で生成する必要があります。
シークレットキー
  • 広告ネットワークでは、最大2つまでシークレットキーを同時にアクティブにすることが可能です。
  • 個々のシークレットキーには有効期限があります。
  • 期限切れのシークレットキーで署名されたクリックは除外されます。
Report API クリックの有効性の更新は、時間単位で集計されます。