読者です 読者をやめる 読者になる 読者になる

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

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

Amazon API GatewayREST APIを利用したかったんだけど、Node.js用のaws-sdkにはまだその機能が入っていないこともあり、自分で認証するためのライブラリを書いた。リクエストのメソッド、URL、ヘッダ、ボディ、AWSのAccessKeyID、SecretAccessKey、リージョンを、決められた手順に従って加工し、Authorizationリクエストヘッダに入れることで認証が通るようになる。その決められた手順を実装した。詳しい仕様は AWS Signature version 4 のページに記載されているがほとんどの人間は読む必要は無い。自分でこのロジックを実装したいなら、JavaScriptの場合は aws-sdk-js/lib//signers/v4.jsAWSSDKを利用しながら実装されたコードが載っているので参考になる。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とかと比べると場が整っていない感じだけど (場とは?)、うまく書けば少しのコードで恩恵を受けられる人が多くて良いと思う。