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)。

