unhurried

コンピュータ関連ネタがほとんど、ときどき趣味も…

Node.js OAuth 2.0 + JWT

Node.jsで実装したWeb APIにユーザー認証機能を追加するために使えそうなライブラリを探しました。
必要な機能はシンプルで2つのみです。

  • OAuth 2.0 Resource Owner Password Credentials Grantに対応する。
  • JWT形式のアクセストークンの発行・検証ができる。

使用したライブラリ

node-oauth20-providerのトークン発行機能をカスタマイズして、node-jsonwebtokenを利用してJWTを生成するようにすればOKです。

accessToken.js

var jwt = require('jsonwebtoken'), fs = require('fs');

module.exports.getToken = function(accessToken) {
    return accessToken.token;
};

module.exports.create = function(userId, clientId, scope, ttl, cb) {

    var private_key = fs.readFileSync('./resource/private_key.pem');
    var accessToken = {
        userId : userId,
        clientId : clientId,
        scope : scope,
        ttl : new Date().getTime() + ttl * 1000
    };
    var token = jwt.sign(accessToken, private_key);

    cb(null, token);
};

module.exports.fetchByToken = function(token, cb) {

    var publicKey = fs.readFileSync('./resource/public_key.pem');
    jwt.verify(token, publicKey, function(error, decoded) {
        if (error) {
            cb();

        } else {
            var accessToken = decoded;
            accessToken.token = token;
            cb(error, accessToken);
        }
    });
};

module.exports.checkTTL = function(accessToken) {
    return (accessToken.ttl > new Date().getTime());
};

感想

  • 既存のライブラリを組み合わせることで簡単に実装ができた。
  • node-oauth20-providerは発展途上という感じで、今回は使った範囲では下記の機能が欲しいところです。
    • ClientごとにRefresh Token発行するか切り替える機能。
    • Refresh Tokenをユーザーとクライアントの組み合わせに対して複数保持する機能。