LoginSignup
7
8

More than 5 years have passed since last update.

OAuth2認証(OpenID Connect)を試した備忘メモ

Last updated at Posted at 2016-08-16

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認証画面が出てきます

参考

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8