Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

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

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
目次

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の実行結果

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

著者プロフィール

バックナンバー

連載:ゲームエンジン「ngCore」最速チュートリアル
All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5