base64
base64
を扱う場合、base64
コマンドによってエンコード、デコードできます。
$ echo test | base64
$ echo test | base64 | pbcopy
# 以下のコマンドはコピーしないように
$ pbpaste | base64 -d
jsonと組み合わせると以下のように感じで使えます。
$ echo "eyJ0aXRsZSI6IiIsImJvZHkiOiIifQo=" | base64 -d | jq .
{
"title": "",
"body": ""
}
また、secret base64を使うことで暗号化データを扱えます。これについては後述するjwt
を使います。
例えば、jwtというものがあります。これを使うと、jsonに暗号化及び署名を行えます。
$ echo "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" | base64 -d
OAuthなどのAccess Tokenを扱う場合、非常に便利です。
以下の記事が参考になります。
https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
http://trustedanalytics.org/how-to-secure-tap-applications-using-oauth2/
基本的には以下の様な感じで使います。
$ mkdir koa-test && cd koa-test
$ npm install koa koa-jwt co-body --save
$ openssl genrsa -out demo.rsa 1024
$ openssl rsa -in demo.rsa -pubout > demo.rsa.pub
$ vim app.js
var koa = require('koa');
var parse = require('co-body');
var jwt = require('koa-jwt');
var fs = require('fs');
var app = koa();
var publicKey = fs.readFileSync('demo.rsa.pub');
var privateKey = fs.readFileSync('demo.rsa');
// JWT Error Catcher
app.use(function *(next) {
try {
yield next; //Attempt to go through the JWT Validator
} catch(e) {
if (e.status == 401 ) {
// Prepare response to user.
this.status = e.status;
this.body = 'You don\'t have a signed token dude :('
} else {
throw e; // Pass the error to the next handler since it wasn't a JWT error.
}
}
});
// Public endpoint to login.
app.use(function *(next) {
if (this.url.match(/^\/login/)) {
var claims = yield parse(this);
var token = jwt.sign(claims, privateKey, {algorithm: 'RS256'});
this.status = 200;
this.body = {token: token};
} else {
yield next;
}
});
// Everything behind this will be protected.
app.use(jwt({
secret: publicKey,
algorithm: 'RS256'
}));
app.use(function *() {
this.status = 200;
this.body = 'You are logged in dude! Welcome!';
});
app.listen(3000);
$ node app.js
----------------
$ curl -X POST -H "Content-Type: application/json" localhost:3000/login -d '{"username": "elbuo8"}'
https://sendgrid.com/blog/json-web-tokens-koa-js/