PlayFabのGoogle Play Game連携でAddOauthScope("profile")が必要な件について

# 概要
[Unity で Google Play ゲームを使用して PlayFab 認証を設定する](https://docs.microsoft.com/ja-jp/gaming/playfab/features/authentication/platform-specific-authentication/google-sign-in-unity)（マイクロソフト公式, 2018/06/11）（以下、本家）
「Unity ゲームへの Google サインインの追加」のコードで`AddOauthScope("profile")`が必要になっていることの調査。

# 環境
- Unity 2019.4.17f1
- [PlayFab SDK](https://docs.microsoft.com/ja-jp/gaming/playfab/sdks/unity3d/quickstart) 2.104.210208
- [Google Play Games plugin for Unity
](https://github.com/playgameservices/play-games-plugin-for-unity) v0.10.12

本家ドキュメントなどを参考にひととおりセットアップが終わっているものとします。

# Google サインインのコード
本家ドキュメントからコピペ

```csharp
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
.AddOauthScope("profile")
.RequestServerAuthCode(false)
.Build();
PlayGamesPlatform.InitializeInstance(config);
```

## サインインのダイアログ
「Googleで公開されているお客様の個人情報とお客様を関連付ける」とかいう、ちょっとものものしく感じる許可を求められます。
言っても公開されている個人情報ってデフォルトは氏名ぐらいではあるんですが、ゲーム程度で要求されたらサインインを躊躇orプレイ自体離脱するユーザーもいそうな気配。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191129/8a41e27f-be8c-ea9f-da70-67bedcd5733a.png)

## PlayFabマスタープレイヤーアカウント
サインイン→PlayFabClientAPI.LoginWithGoogleAccountしたら、作成されたPlayFabのマスタープレイヤーアカウントにもガッツリ氏名が出てきます（下側の黒塗り部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191129/e0b84855-9278-eab3-8352-ef49357e6410.png)
アカウント連携の目的って、端末変更した時のユーザー紐付けだけできたら良くて、氏名はゲームのアカウントに必要な情報ではないと思うんですけどねー

# `AddOauthScope("profile")`を削除してみる
```csharp
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
.RequestServerAuthCode(false)
.Build();
PlayGamesPlatform.InitializeInstance(config);
```
必要なのはPlayFabClientAPI.LoginWithGoogleAccountのrequestに含めるServerAuthCodeだけで、profileとか要らないのでは？ と思ったんですが、
`AddOauthScope("profile")`無しだと、PlayFabClientAPI.LoginWithGoogleAccountで以下のエラーが返ってきて、PlayFabログインに失敗します。
（PlayFabError.GenerateErrorReportをDebug.Logしたものをlogcatで取得）

```
I Unity   : /Client/LoginWithGoogleAccount: GoogleOAuthNoIdTokenIncludedInResponse
```

## サインインのダイアログ
「Googleで公開されているお客様の個人情報とお客様を関連付ける」がなくて、健全っぽい。
（でもPlayFabログインでエラーになるから、ダメ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191129/5f7a2061-f465-2b42-f759-917f9e0d680d.png)

Firebaseなど他のWebサービスとの連携のサンプルコードをWebで見ていると、この`AddOauthScope("profile")`無しパターンなので、PlayFabもそれじゃダメなのかなーと思うわけですが、うーむ :thinking: 

# `RequestIdToken()`してみる
`GoogleOAuthNoIdTokenIncludedInResponse`というエラーコードをふまえて、IdTokenが要るのかな？ と思って`AddOauthScope("profile")`の代わりに`RequestIdToken()`を追加してみました。

```csharp
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
.RequestServerAuthCode(false)
.RequestIdToken()
.Build();
PlayGamesPlatform.InitializeInstance(config);
```
これだとサインイン→PlayFabClientAPI.LoginWithGoogleAccountでPlayFabアカウント作成できました。

## サインインのダイアログ
「Googleで公開されているお客様の個人情報とお客様を関連付ける」有り :sob: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191129/8a41e27f-be8c-ea9f-da70-67bedcd5733a.png)

APIのスコープ説明を見てると、OAuthでopenid取り扱うこと自体がこれにあたるから、この個人情報〜の許可確認はあって然るべきということなのかな？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191129/0f78fd83-c1ad-f565-b92c-10f910670232.png)

## PlayFabマスタープレイヤーアカウント
氏名は取得されなくなったので、ちょっとだけ健全。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191129/53381280-b0ac-b612-2214-8c5d741e4912.png)

ここはユーザーに見える画面ではないので、ユーザー目線では何も変わっていないけど、現状はこれが落とし所なのかなーという感じです。

# 宣伝
そんなこんなでGoogle Play ゲームとPlayFabを連携させたゲームがこちらです。

https://play.google.com/store/apps/details?id=com.zurachu.kaitenshinai

PlayFabでは、先に作った[WebGL版（unityroomで公開）](https://unityroom.com/games/kaiten-shinai)と共有になるランキング（リーダーボード）機能程度しか使っていないのに、個人情報の関連付け要求とか表示されるのしのびないのですが…
Google Play ゲームのサインインを拒否した場合も、Android端末に紐づけてユーザー作るので、遊べないことはないです。
あとGoogle Play ゲーム初めて使ったついでに、実績（クエスト、アチーブメント）もつけてみました。

# 参考文献
- [LinkGoogleAccountRequest GoogleOAuthNoIdTokenIncludedInResponse
](https://community.playfab.com/questions/39715/linkgoogleaccountrequest-googleoauthnoidtokeninclu.html)