3章 OAuth 認証を行う

本チュートリアルで作成するサンプルコードは Unity Tutorial Sample Download からダウンロードできます。

スマートフォンのアプリケーションではフィーチャーフォンやブラウザのアプリケーションとは違い gadget サーバーによるクライアント認証が存在しないため、クライアントアプリケーション、Game Server、Mobageプラットフォームの3者間でデータをやり取りしながらの認証を行うアーキテクチャを採用しています。アーキテクチャについては Game Server を使用したゲームアーキテクチャをご参考ください。
  • クライアントアプリケーション
  • Game Server
  • Mobageプラットフォーム

の3者間 で行う認証処理を 3-legged 認証 と言い、Mobage では上記のような認証処理を行う為に RESTful API を使用した認証プロセスを提供しています。3-legged 認証処理のフローは下記のようになります。

  1. クライアントから Game Server へ temporary credential の要求をする (1.)
  2. Game Server から Platform へ temporary credential の要求をしクライアントに返す (2. ~ 4.)
  3. クライアントで authorizeToken メソッドを呼び出し verifier code を取得する (5. ~ 8.)
  4. クライアントから Game Server へ token credential の要求をする (9.)
  5. Game Server から Platform へ token credential の要求をする (10. ~ 12.)
  6. 以後の通信は取得した Token Credential を使用して Game Server と Mobage プラットフォーム間で行う事が可能となる (13. ~ 16.)

以上が RESTful API を使用した認証プロセスの概要となります。より詳細な情報は RESTful API をご参照ください。


3-legged 認証処理の実装

Game Server では OAuth 処理を行う為に Google の提供している OAuth.php のライブラリを使用しています。

必要な物

3-legged 認証処理を実装するにあたり必要な物をまとめたので参考にしてください。

必要な物

用途

REST_CONSUMER_KEY

Game Server から Platform に通信する際に使用する

REST_CONSUMER_SECRET

Game Server から Platform に通信する際に使用する

MOBAGE_APPLICATION_ID

SDK の initialize に使用する

ANDROID_SDK_CONSUMER_KEY

SDK の initialize に使用する(Android 用)

ANDROID_SDK_CONSUMER_SECRET

SDK の initialize に使用する(Android 用)

IOS_SDK_CONSUMER_KEY

SDK の initialize に使用する(iOS 用)

IOS_SDK_CONSUMER_SECRET

SDK の initialize に使用する(iOS 用)

リンクをクリックすると各情報の取得方法を解説したページに遷移します。

1. クライアントから Game Server へ temporary credential の要求をする

クライアントアプリケーションから Game Server に temporary credential 取得リクエストを送信します。

Unity で HTTP のリクエストを送信するにはそれぞれ下記のように実装します。
 

 クリックすると該当処理を行うコードが表示されます...

Unity


2 ~ 4. Game Server から Platform へ temporary credential の要求をしクライアントに返す

クライアントアプリケーションから temporary credential 取得リクエストを受信したら Game Server は Mobage Platform の temporary credential 用の End point へリクエストを行います。

また、Platform からのレスポンスが返ってきたら Game Server は temporary credential をクライアントアプリケーションに返却する必要があります。
Platform へのリクエストとレスポンスは下記のようになります。

HTTPS Request

Platform へリクエストを送る際には

と OAuth.php を利用して Authorization header を作成する必要があります。 Authorization header のサンプルは下記をご参考ください。

 

 クリックすると該当処理を行うコードが表示されます...

Game Server

Game Server から Platform へのリクエストを作成して送信する処理の実装はこのようになります。

 

HTTPS Response

Platform から

  • oauth_token
  • oauth_token_secret
  • oauth_callback_confirmed

が返ってきますがクライアントアプリケーションでは "oauth_token(temporary_credential)" のみの使用となるので "oauth_token" のみをクライアントアプリケーションに返します。また、"oauth_token", "oauth_token_secret" は token credential の取得リクエスト時に署名として使用するので "tmp_oauth_token", "tmp_oauth_token_secret" としてセッション等に保存してください。

"oauth_token_secret" はセキュリティ担保の為、ネットワークに流さないようにしてください。

 

 クリックすると該当処理を行うコードが表示されます...
Game Server

Platform からのレスポンスをクライアントアプリケーションへ返却する処理の実装はこのようになります。


5 ~ 8. クライアントで authorizeToken メソッドを呼び出し verifier code を取得する

temporary credential の取得が完了したら、次はクライアントアプリケーションで temporary credential を引数に Mobage SDK の authorizeToken メソッドを呼び出して verifier code を取得します。この際、クライアントアプリケーションで Mobage SDK の initialize に使用した

Android アプリケーションの場合

iOS アプリケーションの場合

の組み合わせが正しい物でないとエラーとなるのでご注意ください。

Unity での authorizeToken メソッドの呼び出し方は下記のようになります。

temporaryCredential は "temporary_credential:XXXXXXXXXXXXXXXX" のような形式となります。URL エンコードが掛かっていて "temporary_credential%3aXXXXXXXXXXXXXXXX" 等のような形式になっている場合 Mobage SDK の authorizeToken メソッドがエラーとなります。

Unity の場合

9. クライアントから Game Server へ token credential の要求をする

verifier code の取得が完了したら、クライアントアプリケーションから Game Server に token credential 取得リクエストを送信します。

Unity で HTTP のリクエストを送信するにはそれぞれ下記のように実装します。
 

 クリックすると該当処理を行うコードが表示されます…
temporary credential 取得時と違い verifier code を POST 又は GET の Game Server に渡す必要があります。

Unity


10 ~ 12. Game Server から Platform へ token credential の要求をする

クライアントアプリケーションから token credential 取得リクエストを受信したら Game Server は Mobage Platform の token credential 用の End point へリクエストを行います。

また、Platform からのレスポンスが返ってきたら Game Server は token credential を取得の可否をクライアントアプリケーションに返却する必要があります。
Platform へのリクエストとレスポンスは下記のようになります。

HTTPS Request

Platform へリクエストを送る際には

と OAuth.php を利用して Authorization header を作成する必要があります。 Authorization header のサンプルは下記をご参考ください。

 

 クリックすると該当処理を行うコードが表示されます...
Game Server

Game Server から Platform へのリクエストを作成して送信する処理の実装はこのようになります。


HTTPS Response

Platform から

  • oauth_token
  • oauth_token_secret
  • oauth2_token

が返ってきますがクライアントアプリケーションでは使用しないので返却する必要はございません。"oauth_token", "oauth_token_secret" は今後 Game Server から Platform へのリクエスト時に署名として使用するのでセッション等に保存してください。

"oauth_token_secret", "oauth2_token" はセキュリティ担保の為、ネットワークに流さないようにしてください。

Token CreToken Credential (oauth_token, oauth2_token) の管理は、Mobage の UserID 単位で行わず、必ずセッション ID 等のセッション単位で行って下さい。
不適切な事例として、以下の様なものがあります。

  • 条件
    • Token Credential を UserID 単位でデータベースに格納している。
    • Android と iOS で起動時に 3-legged 認証を行い、データベース上の Token Credential を上書きしている。
  • 上記条件を満たす場合に、以下の挙動を行った場合
    • iOS で一旦ゲームを起動してサスペンド状態にした後に、Android でゲームを起動し、再度 iOS でレジュームしゲームを進めた。
  • 発生する不具合
    • iOS 側でアイテムを購入したが、iOS のゲームポイントの残高が減らず、Android のモバコインの残高が減少する。

Mobage オープンプラットフォームでは、デバイスの区別は Token Credential に紐付いて行われます。そのため、どちらかのデバイスを使って発行した Token Credential はデバイス間で共有することができません。セッション ID ごとに Token Credential が管理されているのであればこのような心配も無くなりますので、適切な実装をお願いします。

 クリックすると該当処理を行うコードが表示されます...
Game Server

Platform からのレスポンスをクライアントアプリケーションへ返却する処理の実装はこのようになります。

 

その他実装上の注意点

上記意外に実装を行う際の注意点は下記のようになります。

Platform から 401 エラーが返却された場合

取得した Token Credential の有効期限は発行後24時間です。Token Credential の有効期限が切れた場合は Platform からの応答が status code 401 となります。Platform から status code 401 が返ってきた場合は もう一度始めから 3-legged 認証処理を行って Token Credenatial を取得する ように実装をお願い致します。


参考情報

更新履歴

  • 2014/02/18
    • 初版作成
 

PREVIOUS

SDK を導入する (Unity)

NEXT

4章 ログインユーザー情報を取得する