【Google】Androidアプリで外部アカウント識別子に設定した値をAPIから取得する
GooglePlay の以下の API に外部アカウント識別子(ExternalAccountIdentifiers)の項目があります。
この項目、あまり活用例がないかなと思っていたのですが、Android アプリでサブスク商品を購入する際に setObfuscatedAccountId などで特定の値を設定しているプロダクトも多いようです。
外部アカウントというのは、アプリ外購入の外部ではなく、Google の外部という意味でサービスを提供しているところを指していると思われます。
利用用途を見ていると、昔の Google Billing Library にあった developerPayload っぽく使っているところが多いのでしょうか?
では、こちらの設定例と API での取得結果を見ていきましょう。
Developer Payload
developer payload なんて過去の話と思っていたのですが、GooglePlay のドキュメントページに存在しているのですね。
ここの「購入のアトリビューション」の段落に外部アカウント識別子の情報について触れられています。
Android アプリ側では、BillingFlowParams で setObfuscatedAccountId() や setObfuscatedProfileId() を活用すれば良さそうですね。
難読化(Obfuscated)について
ちなみに Obfuscated が付いている項目ですが、メールアドレスなど個人情報に該当するものはハッシュ(符号化)や暗号化して設定しろということで、平文でも登録が可能です。
ただ、メールアドレスなどをそのまま設定しようとすると Google 側で弾かれるのかな。
各メソッドのところで以下のように説明されていますね。
このフィールドには、メールなどの個人を特定できる情報 (PII) をクリアテキストで保存しないでください。
このフィールドに PII を保存しようとすると、購入がブロックされます。
Google Play では、暗号化または一方向ハッシュを使用して難読化された識別子を生成し、Google Play に送信することを推奨しています。
APIで取得される情報
では、アプリ側で設定した内容を API で取得して確認してみましょう。
アプリ側で何も設定しなかった場合は、オブジェクトに対して null が返ってきます。
{
"externalAccountIdentifiers": null
}
値を設定した場合は、設定した項目に反映されます。
{
"externalAccountIdentifiers": {
"externalAccountId": null,
"obfuscatedExternalAccountId": "accountId",
"obfuscatedExternalProfileId": null
}
}
まとめ
GooglePlay の外部アカウント識別子について紹介してきました。
これを活用することで、購入レシート(Receipt)や署名(Signature)が他のユーザに盗まれてしまった場合も、購入したユーザにサービスを提供すべきかのチェックができるようになるでしょうか。
このように、ベストプラクティス的なノウハウが溜まっていくといいのですが。