昨日に引き続き Pokemon Go / ポケモン Go です。
昨日のポストに対する皆様の反応を拝見していると、iOS版はわかったから、Android版はどうなの?という意見が多かったので、今回はAndroid版です。
また、結局 Pokemon Go はどういう権限を要求しているのか?について若干混乱が見られたので、そのあたりもついでに整理していこうと思います。
では、早速見ていきます。
まずは、Android版の動きです。
◆環境設定
昨日のiOSと同様に、Wifi設定よりProxyサーバとしてPC上で動かしているFiddlerを使うように設定します。
準備はほぼ同じなので、さっそくGoogleでログインしてみます。
◆ログイン時のトラフィックの違い
実際にログオンしてみるとiOSとは大きな違いがあることがわかります。
iOS版では、WebViewが立ち上がりGoogleアカウントでログインする必要がありますが、Android版ではOSにログオンしているGoogleアカウントがシームレスに使われるため、改めてGoogleへログインする必要がありません。
トラフィックをキャプチャすると、android.clients.google.com/authに対して直接client_idなどをPOSTしてid_tokenを受け取っています。
POST https://android.clients.google.com/auth HTTP/1.1
POSTデータ
androidId=3798d3c8e02a1cce
&lang=en_US
&google_play_services_version=9256438
&sdk_version=23
&device_country=jp
&client_sig=321187995bc7cdc2b5fc91b11a96e2baa8602c62
&callerSig=321187995bc7cdc2b5fc91b11a96e2baa8602c62
&Email=reign.of.pharaoh%40gmail.com
&service=audience%3Aserver%3Aclient_id%3A82..snip..b.apps.googleusercontent.com
&app=com.nianticlabs.pokemongo
&check_email=1
&token_request_options=
&callerPkg=com.nianticlabs.pokemongo
&Token=oauth2rt_1%2FBF_GAY86cPwrwUgpf2HZd3pV71FRTE0q-YgCePsVp2E
ちなみに、iOS版とはclient_idが違うんですね。
このリクエストに対して、HTTP 200で以下のデータが返ってきます。Authにid_tokenが入ってきています。
Auth=eyJhbGciOiJSUzI1N...snip...d9LC7FGaQ
issueAdvice=auto
Expiry=1469374236
storeConsentRemotely=1
isTokenSnowballed=0
jwt.ioでdecodeするとちゃんとid_tokenになっています。
以降のAPIコール時はiOSと同じくid_tokenがPOSTされているので、Android版でもid_tokenに乗っている情報以外(iOSと違って、メールアドレス以外に姓と名がid_tokenに含まれます)はサービスにはわたっていないことがわかります。
まぁ、一安心ということで。
◆結局どういうパーミッションが求められているのか?
前回も今回もOpenID Connectという文脈でPokemon GoアプリケーションがGoogleへどのような情報や操作を要求しているのか?を見て、とりあえず新規にGoogleアカウントを作らなくてもよさそう、という結論に達しました。
しかし、前回のポストに対するコメントとして、連絡先へのアクセスが要求されたりするので、やっぱりアカウントは新規に作る方がいいのでは?みたいなコメントもありました。
確かにAndroid版を見ると、アプリが端末に対して連絡先へのアクセスを要求しています。
※理由はよくわかりませんが。。。
<iOS版>
<Android版>
ここは非常に混乱を招きやすい部分ですが、結論から言いますとアプリケーションが端末に対して要求している権限と、Googleアカウントでログインする際にGoogleに対して要求する権限は全く別のものであり、Googleアカウントの新規作成うんぬん、という話は後者にしか関係しません。(いわゆる、OAuthのscopeパラメータの話ですので)
ここで言う連絡先へのアクセスは前者の端末インストール時の話なので、連絡先へのアクセスが嫌なのであれば、Googleアカウントを新規に取り直すのではなく、専用端末を新規に購入すべきである、ということになります。
まぁ、この辺りは確かにユーザにとってわかりにくいですね。