OAuth2認証(OpenID Connect)をライブラリ使わず実装することがなかったので、簡単にnode + expressで試してみたメモ。認証して、Gmailの一覧を取得して返すまで。ゴリゴリと書いてしまって汚いですがとりあえず自分の備忘として・・・。
事前作業
Google Developer Consoleでアプリケーションの作成と、認証情報を登録しておく。redirect_urlにはhttp://localhost:3000/oauth2callback
を登録する。また、「ライブラリ」から、GmailAPIを有効化しておく。
サンプルソース
app.js
var express = require('express');
var request = require('request');
var app = express();
var clientId = '{client_id}';
var clientSecret = '{client_secret}';
var responseType = 'code';
var scope = 'openid%20profile%20email%20https://www.googleapis.com/auth/gmail.readonly';
var redirectUri = 'http://localhost:3000/oauth2callback';
var authUrl = 'https://accounts.google.com/o/oauth2/v2/auth';
var tokenUrl = 'https://www.googleapis.com/oauth2/v4/token';
var mailUrl = 'https://www.googleapis.com/gmail/v1/users/me/messages';
var server = app.listen(3000, function() {
console.log('Server is started');
});
// 擬似ログインページ
app.get('/login', function(req, res, next) {
// Redirect to Google authentication endo point
var url = authUrl
+ '?client_id=' + clientId
+ '&response_type=' + responseType
+ '&scope=' + scope
+ '&access_type=offline'
+ '&redirect_uri=' + redirectUri;
console.log(url);
res.redirect(302, url);
});
// Redirect url先
app.get('/oauth2callback', function(req, res, next) {
var code = req.query.code;
console.log(code);
// 認可コードを使って、access_tokenを得る
request({
url: tokenUrl,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
code: code,
client_id: clientId,
client_secret: clientSecret,
redirect_uri: redirectUri,
grant_type: 'authorization_code'
}
}, function(error, response, body) {
var obj = JSON.parse(body);
var accessToken = obj['access_token'];
var idToken = obj['id_token'];
var refreshToken = obj['refresh_token'];
// access_tokenを使って、Gmailのメール一覧を取得する
request({
url: mailUrl,
method: 'GET',
headers: {
'Authorization': 'Bearer ' + accessToken
}
}, function(error, response, body) {
res.json({
'access_token': accessToken,
'refresh_token': refreshToken,
'id_token': idToken,
'mail': body
});
});
});
});
実行
$ npm install express request
$ node app.js
http://localhost:3000/login にアクセスすると、Google認証画面が出てきます