概要
https://cloud.google.com/cdn/docs/using-signed-urls?hl=ja の"署名付き URL をプログラムで作成する" のところに Node.js のサンプルプログラムがないので作ってみた。
準備
$ npm i -S urlsafe-base64
$ npm i -S crypto
$ npm i -S moment
サンプルプログラム
const URLSafeBase64 = require("urlsafe-base64")
const crypto = require("crypto")
function signUrl(url, expiration, keyName, key) {
const decodedKey = URLSafeBase64.decode(key)
const sep = url.indexOf("?") != -1 ? "&" : "?"
const signingUrl = `${url}${sep}Expires=${expiration}&KeyName=${keyName}`
const signature = crypto.createHmac("sha1", decodedKey).update(signingUrl).digest()
const encoded = URLSafeBase64.encode(signature)
return `${signingUrl}&Signature=${encoded}`
}
使い方例
引数 key は、この例のように BASE64 エンコードされたものです。これは Cloud DNS の URL 署名鍵で自動生成されたものを使うことができたり、自分で作ったものを使うことができます。しかし、その署名鍵は安全に保管してください。
誤ってGitHubの公開リポジトリーに公開するとか、Webで公開してしまうとかいったことがないようにしてください。
const moment = require("moment")
const url = signUrl("https://myhost/path/to/image.jpg", moment().add(1, "hours").unix(), "my-key", "YmFzZTY0ZW5jb2RlZAo=")