Skip to content

Commit 9774b1e

Browse files
authored
Merge pull request #776 from IABTechLab/jpn-translation-review-202410
Jpn translation review 202410
2 parents fb9ab01 + 4df47e8 commit 9774b1e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+577
-158
lines changed

i18n/ja/docusaurus-plugin-content-docs/current/endpoints/post-identity-buckets.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Link from '@docusaurus/Link';
99

1010
# POST /identity/buckets
1111

12-
ソルトバケットのローテーションをモニターします
12+
<Link href="../ref-info/glossary-uid#gl-salt-bucket">salt buckets</Link> のローテーションをモニターします
1313

1414
Used by: このエンドポイントは、主に広告主とデータプロバイダーによって使用されます。詳細は [Advertiser/Data Provider Integration Guide](../guides/advertiser-dataprovider-guide.md) を参照してください。
1515

i18n/ja/docusaurus-plugin-content-docs/current/endpoints/post-identity-map.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Link from '@docusaurus/Link';
99

1010
# POST /identity/map
1111

12-
複数のメールアドレス、電話番号、またはそれぞれのハッシュを、raw UID2 とソルトバケット ID にマッピングします。このエンドポイントを使用して、オプトアウト情報の更新をチェックすることもできます
12+
複数のメールアドレス、電話番号、またはそれぞれのハッシュを、raw UID2 と <Link href="../ref-info/glossary-uid#gl-salt-bucket-id">salt bucket IDs</Link> にマッピングします。このエンドポイントを使用して、オプトアウト情報の更新をチェックすることもできます
1313

1414
Used by: このエンドポイントは、主に広告主やデータプロバイダーが使用します。詳細は [Advertiser/Data Provider Integration Guide](../guides/advertiser-dataprovider-guide.md) を参照してください。
1515

@@ -19,7 +19,7 @@ Used by: このエンドポイントは、主に広告主やデータプロバ
1919

2020
- リクエストの最大サイズは 1MB です。
2121
- 大量のメールアドレス、電話番号、またはそれぞれのハッシュをマップするには、1 バッチあたり最大 5,000 アイテムのバッチサイズで、それらを *連続した* バッチで送信してください。
22-
- Private Operator を使用している場合を除き、バッチを並行して送信しないでください。つまり、1 つの HTTP 接続を使用して、[directly identifying information (DII)](../ref-info/glossary-uid.md#gl-dii) を連続してマッピングしてください。
22+
- <Link href="../ref-info/glossary-uid#gl-private-operator">Private Operator</Link> を使用している場合を除き、バッチを並行して送信しないでください。つまり、単一の HTTP 接続を使用して、[directly identifying information (DII)](../ref-info/glossary-uid.md#gl-dii) を連続してマッピングしてください。
2323
- メールアドレス、電話番号、またはそれぞれのハッシュのマッピングを必ず保存してください。<br/>マッピングを保存しないと、数百万のメールアドレスや電話番号をマッピングする必要がある場合に、処理時間が大幅に増加する可能性があります。しかし、実際に更新が必要なマッピングのみを再計算することで、毎日更新が必要な raw UID2 の数は約 1/365 となり、総処理時間を短縮できます。[Advertiser/Data Provider Integration Guide](../guides/advertiser-dataprovider-guide.md)[FAQs for Advertisers and Data Providers](../getting-started/gs-faqs.md#faqs-for-advertisers-and-data-providers) も参照してください。
2424

2525
## Request Format

i18n/ja/docusaurus-plugin-content-docs/current/endpoints/post-optout-status.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Link from '@docusaurus/Link';
99

1010
# POST /optout/status
1111

12-
raw UID2 のオプトアウトステータスを確認します。指定された raw UID2 のリストを使用して、このエンドポイントはオプトアウトした raw UID2 とそのオプトアウトが行われた時刻を返します。詳細は [User Opt-Out](../getting-started/gs-opt-out.md) を参照してください。
12+
<Link href="../ref-info/glossary-uid#gl-raw-uid2">raw UID2s</Link> のオプトアウトステータスを確認します。指定された raw UID2 のリストを使用して、このエンドポイントはオプトアウトした raw UID2 とそのオプトアウトが行われた時刻を返します。詳細は [User Opt-Out](../getting-started/gs-opt-out.md) を参照してください。
1313

1414
Used by: このエンドポイントは、主に広告主、データプロバイダー、DSP、共有者によって使用されます。一般的には、元のメールアドレスや電話番号にアクセスできないが、オプトアウトステータスを知りたい参加者向けです。
1515

@@ -24,7 +24,7 @@ Used by: このエンドポイントは、主に広告主、データプロバ
2424
このエンドポイントへのリクエストのバッチを管理するための主要なガイドラインは次のとおりです:
2525

2626
- 多数の UID2 のオプトアウトステータスを確認するには、1 バッチあたりのバッチサイズが最大 5,000 件となるように、順次バッチを送信してください。
27-
- Private Operator を使用している場合を除き、バッチを並行して送信しないでください。つまり、1 つの HTTP 接続を使用して、連続して raw UID2 のバッチを送信してください。
27+
- <Link href="../ref-info/glossary-uid#gl-private-operator">Private Operator</Link> を使用している場合を除き、バッチを並行して送信しないでください。つまり、複数の並列接続を作成せず、単一の HTTP 接続を使用して、連続して raw UID2 のバッチを送信してください。
2828

2929
## Request Format
3030

i18n/ja/docusaurus-plugin-content-docs/current/endpoints/post-token-refresh.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Used by: このエンドポイントは、主にパブリッシャーが使用
2828

2929
このエンドポイントについて知っておくべきことは、以下のとおりです:
3030

31-
- トークン更新のリクエストには暗号化は必要ありません
31+
- `POST /token/refresh` えんどぽいんとへのリクエストには暗号化は不要です
3232
- リクエストが HTTP ステータスコード 200 で成功すると、新しい UID2 Token または Out-Out 情報が返されます。
3333
- 成功したレスポンスは、そのレスポンスに新しいトークンまたは Opt-Out 情報が含まれているかどうかにかかわらず暗号化されます。エラーレスポンスは暗号化されません。
3434
- レスポンスを復号化するには、このトークンに対する最新の `refresh_response_key` 値を使用します。`refresh_response_key` の値は、[POST&nbsp;/token/generate](post-token-generate.md)`POST /token/refresh` のレスポンスで返されます。トークンがリフレッシュされるたびに、新しい `refresh_response_key` が返されます。現在のレスポンスを復号化するには、必ず最新のものを使用してください。

i18n/ja/docusaurus-plugin-content-docs/current/getting-started/gs-credentials.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Link from '@docusaurus/Link';
99

1010
# UID2 Credentials
1111

12-
UID2 <a href="/docs/intro#participants">参加者</a>はそれぞれ、固有の認証情報のセットを取得します。取得する認証情報のセットは、次の表に示すように、UID2 にどのように参加しているかによって決まります。
12+
UID2 <a href="../intro#participants">参加者</a>はそれぞれ、固有の認証情報のセットを取得します。取得する認証情報のセットは、次の表に示すように、UID2 にどのように参加しているかによって決まります。
1313

1414
| Audience | Credentials | Integration |
1515
| :--- | :--- | :--- |

i18n/ja/docusaurus-plugin-content-docs/current/getting-started/gs-encryption-decryption.md

Lines changed: 247 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ Maven を使用している場合は、以下の最小限の `pom.xml` を使用
206206

207207
このファイルには.NET 7.0が必要です。必要であれば、それ以前のバージョンを使用することもできますが、.NET Core 3.0以降でなければなりません。バージョンを変更するには、[top-level statements](https://learn.microsoft.com/ja-jp/dotnet/csharp/fundamentals/program-structure/top-level-statements) を Main メソッドに、[using 宣言](https://learn.microsoft.com/ja-jp/cpp/cpp/using-declaration?view=msvc-170)[using ステートメント](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-8.0/using) に置き換えてください。
208208

209+
</TabItem>
210+
<TabItem value='go' label='Go'>
211+
212+
以下のコード例では、Go を使用してリクエストを暗号化し、レスポンスを復号化します。必要なパラメータはファイルの一番下に記載されています。または、`go run uid2_request.go` を実行して確認できます。
213+
209214
</TabItem>
210215
</Tabs>
211216

@@ -574,5 +579,246 @@ else
574579
Console.WriteLine(JsonSerializer.Serialize(jDoc, new JsonSerializerOptions { WriteIndented = true }));
575580
}
576581
```
582+
577583
</TabItem>
578-
</Tabs>
584+
<TabItem value='go' label='Go'>
585+
586+
```go title="uid2_request.go"
587+
package main
588+
589+
import (
590+
"bytes"
591+
"crypto/aes"
592+
"crypto/cipher"
593+
"crypto/rand"
594+
"encoding/base64"
595+
"encoding/binary"
596+
"encoding/json"
597+
"fmt"
598+
"io"
599+
"log"
600+
"net/http"
601+
"os"
602+
"strings"
603+
"time"
604+
)
605+
606+
const (
607+
nonceLengthBytes = 8
608+
gcmIVLengthBytes = 12
609+
)
610+
611+
func main() {
612+
subArgs := os.Args[1:]
613+
614+
if len(subArgs) != 3 && len(subArgs) != 4 {
615+
printUsage()
616+
os.Exit(1)
617+
}
618+
619+
url := subArgs[0]
620+
621+
response, err := func() (map[string]interface{}, error) {
622+
if subArgs[1] == "--refresh-token" {
623+
return refresh(url, subArgs[2], subArgs[3])
624+
} else {
625+
return generate(url, subArgs[1], subArgs[2])
626+
}
627+
}()
628+
629+
if err != nil {
630+
log.Fatal(err)
631+
}
632+
633+
prettyPrint(response)
634+
}
635+
636+
func refresh(url string, refreshToken string, refreshResponseKey string) (map[string]interface{}, error) {
637+
fmt.Printf("Request: Sending refresh_token to %s\n", url)
638+
639+
response, err := http.Post(url, "", strings.NewReader(refreshToken))
640+
if err != nil {
641+
return nil, err
642+
}
643+
644+
return deserializeResponse(response, refreshResponseKey, true)
645+
}
646+
647+
func generate(url string, apiKey string, secret string) (map[string]interface{}, error) {
648+
payload, err := io.ReadAll(os.Stdin)
649+
if err != nil {
650+
return nil, err
651+
}
652+
653+
key, err := base64.StdEncoding.DecodeString(secret)
654+
if err != nil {
655+
return nil, err
656+
}
657+
658+
unencryptedEnvelope, err := makeUnencryptedEnvelope(payload)
659+
if err != nil {
660+
return nil, err
661+
}
662+
663+
envelope, err := makeEncryptedEnvelope(unencryptedEnvelope, key)
664+
if err != nil {
665+
return nil, err
666+
}
667+
668+
req, err := http.NewRequest("POST", url, strings.NewReader(base64.StdEncoding.EncodeToString(envelope)))
669+
if err != nil {
670+
return nil, err
671+
}
672+
673+
req.Header.Add("Authorization", "Bearer "+apiKey)
674+
675+
response, err := http.DefaultClient.Do(req)
676+
if err != nil {
677+
return nil, err
678+
}
679+
680+
return deserializeResponse(response, secret, false)
681+
}
682+
683+
func aesgcm(key []byte) (cipher.AEAD, error) {
684+
block, err := aes.NewCipher(key)
685+
if err != nil {
686+
return nil, err
687+
}
688+
689+
return cipher.NewGCM(block)
690+
}
691+
692+
func decryptResponse(ciphertext string, key string) ([]byte, error) {
693+
ciphertextBytes, err := base64.StdEncoding.DecodeString(ciphertext)
694+
if err != nil {
695+
return nil, err
696+
}
697+
698+
keyBytes, err := base64.StdEncoding.DecodeString(key)
699+
if err != nil {
700+
return nil, err
701+
}
702+
703+
aesgcm, err := aesgcm(keyBytes)
704+
if err != nil {
705+
return nil, err
706+
}
707+
708+
iv := ciphertextBytes[:gcmIVLengthBytes]
709+
return aesgcm.Open(nil, iv, ciphertextBytes[gcmIVLengthBytes:], nil)
710+
}
711+
712+
func deserialize(bytes []byte) (map[string]interface{}, error) {
713+
var anyJson map[string]interface{}
714+
err := json.Unmarshal(bytes, &anyJson)
715+
return anyJson, err
716+
}
717+
718+
func prettyPrint(obj map[string]interface{}) error {
719+
bytes, err := json.MarshalIndent(obj, "", " ")
720+
if err != nil {
721+
return err
722+
}
723+
724+
fmt.Println(string(bytes))
725+
return nil
726+
}
727+
728+
func checkStatusCode(response *http.Response, body []byte) error {
729+
if response.StatusCode != http.StatusOK {
730+
return fmt.Errorf("Response: Error HTTP status code %d\n%s", response.StatusCode, body)
731+
}
732+
733+
return nil
734+
}
735+
736+
func makeUnencryptedEnvelope(payload []byte) ([]byte, error) {
737+
timestamp := make([]byte, 8)
738+
binary.BigEndian.PutUint64(timestamp, uint64(time.Now().UnixMilli()))
739+
740+
nonce := make([]byte, nonceLengthBytes)
741+
_, err := rand.Read(nonce)
742+
if err != nil {
743+
return nil, err
744+
}
745+
746+
var body bytes.Buffer
747+
body.Write(timestamp)
748+
body.Write(nonce)
749+
body.Write(payload)
750+
return body.Bytes(), nil
751+
}
752+
753+
func encrypt(plaintext []byte, iv []byte, key []byte) ([]byte, error) {
754+
aesgcm, err := aesgcm(key)
755+
if err != nil {
756+
return nil, err
757+
}
758+
759+
return aesgcm.Seal(nil, iv, plaintext, nil), nil
760+
}
761+
762+
func makeEncryptedEnvelope(payload []byte, key []byte) ([]byte, error) {
763+
iv := make([]byte, gcmIVLengthBytes)
764+
_, err := rand.Read(iv)
765+
if err != nil {
766+
return nil, err
767+
}
768+
769+
ciphertext, err := encrypt(payload, iv, key)
770+
if err != nil {
771+
return nil, err
772+
}
773+
774+
var envelope bytes.Buffer
775+
envelope.WriteByte(1)
776+
envelope.Write(iv)
777+
envelope.Write(ciphertext)
778+
return envelope.Bytes(), nil
779+
}
780+
781+
func deserializeResponse(response *http.Response, key string, isRefresh bool) (map[string]interface{}, error) {
782+
defer response.Body.Close()
783+
784+
body, err := io.ReadAll(response.Body)
785+
if err != nil {
786+
return nil, err
787+
}
788+
789+
err = checkStatusCode(response, body)
790+
if err != nil {
791+
return nil, err
792+
}
793+
794+
plaintext, err := decryptResponse(string(body), key)
795+
if err != nil {
796+
return nil, err
797+
}
798+
799+
offset := 16
800+
if isRefresh {
801+
offset = 0
802+
}
803+
804+
return deserialize(plaintext[offset:])
805+
}
806+
807+
func printUsage() {
808+
fmt.Println(`Usage:
809+
echo '<json>' | go run uid2_request.go <url> <api_key> <client_secret>
810+
811+
Example:
812+
echo '{"email": "[email protected]", "optout_check": 1}' | go run uid2_request.go https://prod.uidapi.com/v2/token/generate UID2-C-L-999-fCXrMM.fsR3mDqAXELtWWMS+xG1s7RdgRTMqdOH2qaAo= wJ0hP19QU4hmpB64Y3fV2dAed8t/mupw3sjN5jNRFzg=
813+
814+
815+
Refresh Token Usage:
816+
go run uid2_request.go <url> --refresh-token <refresh_token> <refresh_response_key>
817+
818+
Refresh Token Usage example:
819+
go run uid2_request.go https://prod.uidapi.com/v2/token/refresh --refresh-token AAAAAxxJ...(truncated, total 388 chars) v2ixfQv8eaYNBpDsk5ktJ1yT4445eT47iKC66YJfb1s=`)
820+
}
821+
```
822+
</TabItem>
823+
824+
</Tabs>

0 commit comments

Comments
 (0)