Node.jsで実装したWeb APIにユーザー認証機能を追加するために使えそうなライブラリを探しました。
必要な機能はシンプルで2つのみです。
- OAuth 2.0 Resource Owner Password Credentials Grantに対応する。
- JWT形式のアクセストークンの発行・検証ができる。
使用したライブラリ
- OAuth 2.0:https://github.com/t1msh/node-oauth20-provider
- GitHubでResouce Owner Password Credentials Grantに対応したものを探した。
- クライアント認証、アクセストークン発行・検証などをカスタマイズできる設計になっている。
- JWT:https://github.com/auth0/node-jsonwebtoken
- http://jwt.io/で紹介されている。
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をユーザーとクライアントの組み合わせに対して複数保持する機能。