Node.jsでAWSのAPIで認証するやつ書いた

https://github.com/r7kamura/aws-signer-v4

Amazon API GatewayのREST APIを利用したかったんだけど、Node.js用のaws-sdkにはまだその機能が入っていないこともあり、自分で認証するためのライブラリを書いた。リクエストのメソッド、URL、ヘッダ、ボディ、AWSのAccessKeyID、SecretAccessKey、リージョンを、決められた手順に従って加工し、Authorizationリクエストヘッダに入れることで認証が通るようになる。その決められた手順を実装した。詳しい仕様は AWS Signature version 4 のページに記載されているがほとんどの人間は読む必要は無い。自分でこのロジックを実装したいなら、JavaScriptの場合は aws-sdk-js/lib//signers/v4.js にAWSのSDKを利用しながら実装されたコードが載っているので参考になる。Rubyの場合は aws-sdk-core/lib/aws-sdk-core/signers/v4.rbや、3rdパーティの実装である aws4 を読むのが分かりやすい。

つくったライブラリはこういう感じで使えるようになってる。

var Sign = require('aws-signer-v4'); request.headers.Authorization = new Sign( accessKeyId: 'AWS\_ACCESS\_KEY\_ID', body: request.body, headers: request.headers, method: 'GET', region: 'ua-east-1', secretAccessKey: 'AWS\_SECRET\_ACCESS\_KEY', url: request.url ).toString()

昨日、自分で好きなmiddlewareを組み合わせて君だけの最強のHTTPクライアントをつくれる stackable-fetcher というやつを書いたので、今回つくった aws-signer-v4 を組み合わせて、リクエストを送る前に勝手に認証用のAuthorizationヘッダを組み立ててくれるmiddlewareを書いてみた。stackable-fetcherのexamples に置いてある。こういう感じでuseして使える。

var AwsSignerV4 = require('/path/to/middlewares/aws-signer-v4'); var Fetcher = require('stackable-fetcher'); var fetcher = new Fetcher() .use(AwsSignerV4, { accessKeyId: '...', secretAccessKey: '...', region: '...' }) fetcher.get('https://apigateway.us-east-1.amazonaws.com/restapis') .then(function (response) { console.log(response.status); });

Node.js、Rubyとかと比べると場が整っていない感じだけど (場とは?)、うまく書けば少しのコードで恩恵を受けられる人が多くて良いと思う。