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

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

Githubの[blackaplysia/mirror](https://github.com/blackaplysia/mirror.git)にソースがあります。

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

# OAUTH認証の準備

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

1. [Google Developers Console](https://console.developers.google.com/project)で[CREATE PROJECT]より新規のprojectを作成(名前は任意)
1. [APIs & auth]→[APIs]でGoogle Mirror APIのstatusをONにする
1. [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に設定します。

```js: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.*`という値を読み込んで設定しています。

```json: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 ID`、`Client secret`、`Redirect URIs`に表示されている内容をそれぞれ転記します。

# OAUTH認証ページへの遷移

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

Google Mirror APIでは2個のスコープが公開されています。利用するAPIによって必要となるスコープは違いますので、個別に[リファレンスマニュアル](https://developers.google.com/glass/v1/reference/)で確認する必要があります。

* https://www.googleapis.com/auth/userinfo.profile
* https://www.googleapis.com/auth/glass.timeline

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

```js: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に投げます。

```js: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呼び出しが成功すると、`200`や`304`のようなコードで以下のようなレスポンスが返ってきます。

```json
{
 "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](https://qiita-image-store.s3.amazonaws.com/0/21963/7ec040e0-b10c-5e13-99fe-220e73901871.png)

# 参考
* [Build with the GDK and Mirror API](https://developers.google.com/glass/develop/index). Mirror API仕様。
* [passport-google-oauth](https://github.com/jaredhanson/passport-google-oauth). Passportによるgoogle oauth認証を実現。
* [node.jsのいろいろなモジュール13 – node-configで設定ファイルを切り替えたりする](http://dev.classmethod.jp/server-side/config/). node-configの使い方。