Mobage OAuth認証の活用:ユーザ特定

IMG_0022.JPG

いつもお世話になっております!

テクニカルコンサルティンググループのチョイと申します。
日頃はデベロッパー様のゲーム開発を応援、サポートするお仕事をしております。

本日は、基本的なお話ではありますが、Mobageオープンプラットフォームでスマートフォンアプリを開発する際、ゲームサーバー側でどのようにユーザを特定すれば良いかのお話をしたいと思います。(もちろん、ゲームサーバーが存在する前提です。)

背景

Mobageオープンプラットフォームでは、ユーザ様の交流を通じてゲームをより楽しく遊べるソーシャルゲームが、パートナーデベロッパー様により、数多く提供されております。

これらのゲームは、PCやスマートフォンブラウザを利用してアクセスするものもあれば、スマートフォンアプリとしてダウンロードして遊ぶものもあります。

いずれも、Mobageオープンプラットフォーム上に構築されているソーシャルグラフのデータを利用し、ユーザ間交流を促進しながら進行していきます。その中で、ユーザ間でゲームを有効に進めるためのアイテムを交換する機能が実装されるものも少なくないでしょう。

そもそもユーザが持っている端末上で独立に動作するスマートフォンアプリに、ユーザ間での交流機能を提供するためには、各種データを集中的に管理するゲームサーバーは不可欠な存在になります。

いうまでもありませんが、ゲームサーバーはいろいろな場面において、スマートフォンクライアントにログインしているユーザを特定する必要があります。たとえば、ゲームの進捗状況を保存したり、上述のアイテム交換を処理したりすることが挙げられます。

そのため、ユーザの特定を確実に行う必要があります。そうしなければ、ユーザの成り済ましが容易にでき、チートユーザがゲーム内に横行することになるでしょう。

問題の実例

たとえば、下記の例をみてみましょう。

bad_example.png

クライアント側でログインしているユーザをgetCurrentUser() APIで取得して、下記のようにクライアントアプリからゲームサーバーにPOSTするとします。これで、ユーザ1234XXXXから、ユーザ4321YYYYへ、アイテムveryrareitemがプレゼントされることとします。

POST /game/social/presents HTTP/1.1
Host: gameserver.example.com
Content-Length: 53
Content-Type: application/x-www-form-urlencoded

userId=1234XXXX&toUserId=4321YYYY&itemId=veryrareitem

Webアプリを開発する場合、ユーザの認証と特定は全てサーバー上で行われるため、このような状況はまずありませんが、スマートフォンアプリの場合、ユーザが端末上でSDKを利用して認証してから、ゲームサーバーに接続する流れが主流ですので、上記のようにログインユーザのIDをそのままクライアントからサーバーに送信する実装は実際にあったりします。

この場合、ゲームサーバーはこのuserIdを無条件に受け付けてしまうと、悪意を持ったユーザがuserIdの値を任意のユーザIDに変え、toUserIdの値を自分のユーザIDに変えるだけでいくらでもほかのユーザからアイテムを横領できます!

いけない!これではチートされます。

対策①

それでは、クライアントとゲームサーバー間での通信にHTTPSと改ざん検知(チェックサムや署名など)を導入すればどうでしょう。

HTTPS通信と改ざん検知を導入することで、セキュリティが向上されるのは間違いありませんが、端末のメモリを直接に書き換えるなど、そもそも通信路に送信する前のデータが改ざんされたりしたら、やはり効果は限られてきますね。(とはいえ、大前提ですのでかならず導入していただきたいです。)

対策②

さて、これ以上どうすればいいでしょうか。

ここで活用できるのは、OAuth認証People APIです。

OAuth認証というのは、

  • サービス提供者(=Mobage)

  • リソースオーナー(=Mobageユーザ)

  • サービスコンシューマー(=ゲーム)

という3者間で行われる、リソースオーナーがサービスコンシューマーに対して、サービス提供者に預かっているリソースの利用権限を認可するオープンプロトコルです。

OAuthの最も優れている点は、ユーザ様の認証情報(ユーザ名、パスワード)を第3者に公開しないまま、データにアクセス権限を付与できるところでしょう。その上、仕様がオープンになっているため、多くのサービスプロバイダーに広く採用されています。そのため、各種プログラミング言語に対応するライブラリもたくさん公開されています。最初の導入にハードルを感じる方もいらっしゃいますが、こちらにMobageでOAuth認証を行う際のサンプルを提供しております。

基本的には、OAuth認証はユーザ様がMobageに預けているユーザデータにゲーム側からアクセスしてもいいよとの認可プロセスになりますが、逆手をとれば、このユーザデータを持っているユーザの特定にも活用できます。ユーザ特定の部分は、Mobage RESTful APIのPeople APIを利用します。

具体的に、下記のような流れになります。

oauth.png

少しコミカルにアレンジしましたが、まじめなシーケンス図はこちらをご参照下さい。

実際の通信データは、下記のように変わります。

POST /game/social/presents HTTP/1.1
Host: my.gameserver.jp
Content-Length: 37
Content-Type: application/x-www-form-urlencoded
Cookie: sessionId=X93jD8kfe93F8dfk34kdaf9KD

toUserId=4321YYYY&itemId=veryrareitem

上記フローのポイントは:

  • クライアントから、ログインしているユーザのID情報を一切送っていません。

  • ユーザとaccess tokenの関連づけは、Mobage SDKとMobageプラットフォーム間でセキュアに行われます。

  • ゲームサーバーからは一時的で予測されにくいランダムなSession IDを発行することにより、ほかのユーザに成り済まそうと思っても他人のSession IDを取得するのが困難であるため、偽装が難しくなります。

以上で確実にログインしたユーザを特定することができるようになりました。

ただし、上記を実装すればセキュリティは万全になるわけではありませんのでご注意ください。最低限HTTPS、データ改ざん検出、OAuthによるユーザ特定を導入してください。

このほかにも、ゲームデータの整合性を検証したり、同じリクエストを何度も受け付けないようにするなどの対応も必要になりますが、今回は、あくまでもユーザの特定だけにフォーカスしました。

それでは、今後ともこのような話を皆様と共有していきたいと思いますので、これからもMobage Developers Blogを宜しくお願いいたします!