Game Serverを実装する
ここまで来たら実装の準備は完了です。まずは、表1のようにURLを設計してみました。
Path | 処理概要 |
getOAuthRequestToken | APIサーバーからRequestTokenを取得し返す |
getOAuthAccessToken?oauth_verifier={verifier} | 検証コードを使用してAPIサーバーからAccessTokenを取得し、「3-legged OAuth success!!」と返す |
getCurrentUser | 認証済みユーザーのニックネームとサムネイル画像のURLをJSON形式で返す |
RESTful API 用に作成したConsumer Key とConsumerSecretを使って、LIST7のような実装に落とし込んでいきます。
var express = require("express"); var OAuth = require("oauth").OAuth; var OAUTH_BASE_URL = "https://app-sandbox.mobage.com/1/MyFirstMobageApp"; var OAUTH_CONSUMER_KEY = "jIvRpIQkvxU8LFipWoeXsQ"; var OAUTH_CONSUMER_SECRET = "9BYusiUlQe6J2yqnIUroKdshbJ0S9Jh395ru7ciwpg"; var OAUTH_VERSION = "1.0"; var OAUTH_CALLBACK = "oob"; var OAUTH_SIGNATURE_METHOD = "HMAC-SHA1"; var SOCIAL_BASE_URL = "https://app-sandbox.mobage.com/1/MyFirstMobageApp/opensocial"; // OAuth Counsumerを作成 function createConsumer(){ return new OAuth( OAUTH_BASE_URL + "/request_temporary_credential", OAUTH_BASE_URL + "/request_token", OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, OAUTH_VERSION, OAUTH_CALLBACK, OAUTH_SIGNATURE_METHOD); } // サーバーの作成 var server = express.createServer(); server.use(express.logger()); server.use(express.bodyParser()); server.use(express.cookieParser()); server.use(express.session({ secret: "l3udyzHdkbkbmslz7Rjzycpt" })); // RequestTokenを取得して、クライアントに返す server.get("/getOAuthRequestToken", function(req, res) { // RequestTokenを取得する createConsumer().getOAuthRequestToken( function(error, oauth_token, oauth_token_secret, results){ if(error) { // エラーの場合はAPIのレスポンスをそのまま返す res.writeHead(error.statusCode, {"Content-Type": "text/plain"}); res.write(error.data); res.end(); return; } // セッションにRequestTokenを保存 req.session.oauth_request_token = oauth_token; req.session.oauth_request_token_secret = oauth_token_secret; // RequestTokenをクライアントに返す res.writeHead(200, {"Content-Type": "text/plain"}); res.write(oauth_token); res.end(); } ); }); // クライアントから渡された検証コードを使ってAccessTokenを取得する server.get("/getOAuthAccessToken", function(req, res) { // リクエストパラメーターから検証コードを取得する var oauth_verifier = req.param("oauth_verifier"); // セッションからRequestTokenを取得する var oauth_request_token = req.session.oauth_request_token; var oauth_request_token_secret = req.session.oauth_request_token_secret; // AccessTokenを取得する createConsumer().getOAuthAccessToken( oauth_request_token, oauth_request_token_secret, oauth_verifier, function(error, oauth_token, oauth_token_secret, results){ if(error) { // エラーの場合はAPIのレスポンスをそのまま返す res.writeHead(error.statusCode, {"Content-Type": "text/plain"}); res.write(error.data); res.end(); return; } // セッションにAccessTokenを保存 req.session.oauth_access_token = oauth_token; req.session.oauth_access_token_secret = oauth_token_secret; // RequestTokenをクライアントに返す res.writeHead(200, {"Content-Type": "text/plain"}); res.write("3-legged OAuth success!!"); res.end(); } ); }); // AccessTokenを使用して、ログインユーザーのプロフィール情報を取得する server.get("/getCurrentUser", function(req, res) { // セッションからAccessTokenを取得する var oauth_access_token = req.session.oauth_access_token; var oauth_access_token_secret = req.session.oauth_access_token_secret; // ログインユーザーのプロフィール情報を取得する createConsumer().getProtectedResource( SOCIAL_BASE_URL + "/people/@me/@self?fields=nickname,thumbnailUrl", "GET", oauth_access_token, oauth_access_token_secret, function (error, data, response) { if(error) { // エラーの場合はAPIのレスポンスをそのまま返す res.writeHead(response.statusCode, {"Content-Type": "application/json"}); res.write(error.data); res.end(); return; } // APIサーバーからのHTTPステータス、レスポンスデータをそのまま返す res.writeHead(response.statusCode, {"Content-Type": "application/json"}); res.write(data); res.end(); } ); }); // サーバーの開始 server.listen(3000); console.log("running on http://localhost:3000");
今回は簡易的にサーバー側のセッションにOAuthのTokenを保存して認証フローを実現していますが、実運用でスケールされたサーバー環境の場合は、RDBやmemcachedなどの永続化メカニズムを使用することが一般的です。では、Game Serverを起動して動作確認をしてみましょう(LIST8)。
$ node GameServer.js running on http://localhost:3000
ブラウザからhttp://localhost:3000/getOAuthRequestTokenを開き、問題なくRequestTokenが取得できるかテストしてみましょう(図8)。