2016-06-14 / @syui

pc

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/