Help us understand the problem. What is going on with this article?

Node.jsからGoogle Mirror API経由でタイムラインにカードをインサートする

More than 5 years have passed since last update.

Node.js+expressを使って、Google Mirror API経由でgoogle glassのタイムラインにカードをインサートするサンプルをつくりました。

Githubのblackaplysia/mirrorにソースがあります。

Google Mirror APIはGoogle OAUTH認証によって対象を同定します。そこで、サンプルでは、最初にpassportモジュールを使ってOAUTH認証を行います。

OAUTH認証の準備

まず、Google OAUTH認証を利用するための準備としてCliend IDの作成を行います。

  1. Google Developers Consoleで[CREATE PROJECT]より新規のprojectを作成(名前は任意)
  2. [APIs & auth]→[APIs]でGoogle Mirror APIのstatusをONにする
  3. [APIs & auth]→[Credentials]で[CREATE NEW CLIENT ID]より新規のClient IDを作成する

Client IDは、以下のパラメータで設定します。

パラメータ 設定する内容
Application type Web application
Authorized JavaScript origins 認証をリクエストするサーバURL
Authorized redirect URI Googleが認証後に遷移するリダイレクト先URI

これらのうち、Authorized redirect URIについては、サンプルをそのまま使う場合にはパスが/auth/google/callbackとなるように注意してください。理由は、単にサンプルではこのURIで受けているからです。

コードへのClient IDの埋め込み

Cliend IDは、passport (passport-google-oauth)のstrategyに設定します。

app.js
passport.use(new GoogleStrategy({
    clientID: conf.google.clientID,
    clientSecret: conf.google.clientSecret,
    callbackURL: conf.google.callbackURL
  },
  function(accessToken, refreshToken, profile, done) {
    token = accessToken;
    process.nextTick(function() {
      return done(null, profile);
    });
  }
));

サンプルでは、node-configの機能を使って、config/default.jsonからconf.google.*という値を読み込んで設定しています。

config/default.json.smp
{
    "google":{
        "clientID":"YOUR_GOOGLE_OAUTH_CLIEND_ID",
        "clientSecret":"YOUR_GOOGLE_OAUTH_CLIENT_SECRET",
        "callbackURL":"YOUR_GOOGLE_OAUTH_CALLBACK_URL"
    }
}

実際にこれらに設定する値は、Google Developer's Consoleに設定したClient IDの情報です。具体的には、Client IDClient secretRedirect URIsに表示されている内容をそれぞれ転記します。

OAUTH認証ページへの遷移

それでは、Google OAUTHにリクエストを投げて、ユーザ認証とGoogle Mirror APIの認可を受けたアクセストークンを取得します。

Google Mirror APIでは2個のスコープが公開されています。利用するAPIによって必要となるスコープは違いますので、個別にリファレンスマニュアルで確認する必要があります。

これをpassport.authenticate()に渡します。このコードを実行するとGoogleによる認可確認ページに遷移します。

app.js
app.get('/auth/google',
  passport.authenticate('google', {
    scope: [
      'https://www.googleapis.com/auth/userinfo.profile',
      'https://www.googleapis.com/auth/glass.timeline' ],
    successReturnToOrRedirect: '/',
    failureRedirect: '/login'}));

コールバック

Googleによる認可が完了すると、googleからcallbackURLに遷移します。ここではとくに何もする必要がありませんので、そのままトップページに遷移しています。

カードのインサート

サンプルでは、google認証が完了するとトップページに/messageへのリンクが表れます。これをクリックすると、ユーザに対応するglassのタイムラインにカードをインサートします。

Google glassのタイムラインにカードをインサートするには、以下のようにjson形式のデータをAPIに投げます。

app.js
  var data = '{ "text": "Hello, I am a Mirror API.", "notification": {"level": "DEFAULT"}}';
  var options = {
    host: 'www.googleapis.com',
    path: '/mirror/v1/timeline',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Content-Length': data.length,
      'Authorization': 'Bearer ' + "Google OAuth認証で取得したアクセストークン"
    }
  }
  var post_req = https.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function(chunk) {
      console.log('Response: ' + chunk);
    });
  });
  post_req.write(data);
  post_req.end();

このAPI呼び出しが成功すると、200304のようなコードで以下のようなレスポンスが返ってきます。

{
 "kind": "mirror#timelineItem",
 "id": "XXXXXXXX",
 "selfLink": "https://www.googleapis.com/mirror/v1/timeline/XXXXXXXX",
 "created": "2014-03-28T00:21:43.615Z",
 "updated": "2014-03-28T00:21:43.615Z",
 "etag": "1395966103615",
 "text": "Hello, I am a Mirror API.",
 "notification": {
  "level": "DEFAULT"
 }
}

同時に、glassには以下のようなカードが挿入されます。
screenshot-mirror-api.png

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away