SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ゲームエンジン「ngCore」最速チュートリアル(AD)

サーバーサイドのロジックもJavaScriptで!
~ngCoreを使ってMobageのソーシャル機能を実装

ゲームエンジン「ngCore」最速チュートリアル 第4回

  • このエントリーをはてなブックマークに追加

Game Serverを実装する

 ここまで来たら実装の準備は完了です。まずは、表1のようにURLを設計してみました。

表1:Game ServerのURL設計
Path 処理概要
getOAuthRequestToken APIサーバーからRequestTokenを取得し返す
getOAuthAccessToken?oauth_verifier={verifier} 検証コードを使用してAPIサーバーからAccessTokenを取得し、「3-legged OAuth success!!」と返す
getCurrentUser 認証済みユーザーのニックネームとサムネイル画像のURLをJSON形式で返す

 RESTful API 用に作成したConsumer Key とConsumerSecretを使って、LIST7のような実装に落とし込んでいきます。

LIST7:Game Serverの実装(GameServer.js)
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)。

LIST8:Game Serverの起動
$ node GameServer.js
running on http://localhost:3000

 ブラウザからhttp://localhost:3000/getOAuthRequestTokenを開き、問題なくRequestTokenが取得できるかテストしてみましょう(図8)。

図8:getOAuthRequestTokenの実行結果
図8:getOAuthRequestTokenの実行結果

次のページ
まとめ

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
ゲームエンジン「ngCore」最速チュートリアル連載記事一覧

もっと読む

この記事の著者

水島 壮太(株式会社ディー・エヌ・エー)(ミズシマ ソウタ(カブシキガイシャディー・エヌ・エー))

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6326 2012/04/11 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング