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とかと比べると場が整っていない感じだけど (場とは?)、うまく書けば少しのコードで恩恵を受けられる人が多くて良いと思う。