Search

ExpressとJWTをできるだけシンプルに使う

依存

まず必要なパッケージをインストールします。

yarn add express express-jwt jsonwebtoken

トークンを生成

次の1行のコマンドで作れます。第2引数は復元に使うので覚えておきます。

node -e "console.log( require('jsonwebtoken').sign({value:'foo'}, 'a') )"
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ2YWx1ZSI6ImZvbyIsImlhdCI6MTUzNTU2NDUyNH0.Mkz75dMlWnK2Y_8g7CGjqwLNvlc1pC3O8znGuUP5ZS8

復元を試します。第2引数は同じものを指定します。
ちゃんとオブジェクトが表示されてれば大丈夫。

node -e "console.log( require('jsonwebtoken').verify('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ2YWx1ZSI6ImZvbyIsImlhdCI6MTUzNTU2NDUyNH0.Mkz75dMlWnK2Y_8g7CGjqwLNvlc1pC3O8znGuUP5ZS8', 'a') )"                                                                         02:42:24
# { value: 'foo', iat: 1535564524 }

Expressサーバーで認証する

まずlocalhost:3333okとだけ返す所まで作ります。

const express = require('express');
const jwt = require('express-jwt');
const app = express();
app.use('/', /* jwt middleware が入る */ (req, res) => res.sendStatus(200));
app.listen(3333);

app.useの第2引数でexpress-jwtを使います。設定は次の通り。

  • secretは上記で発行した時に使ったものを
  • requestPropertyは、デフォルトではreq.userに値が入るのですが、今回はユーザー情報でも何でもないのでなんとなくreq.data
    • ちなみにresultPropertyreq.res.dataになるみたいですなんか知った)
  • getTokenはトークンの置き場を自分で探して見つけたトークンを返してます。今はAuthorizationだけ見ます
app.use(
  '/',
  jwt({
    secret: 'a',
    requestProperty: 'data',
    getToken(req) {
      if (
        req.headers.authorization &&
        req.headers.authorization.split(' ')[0] === 'Bearer'
      ) {
        return req.headers.authorization.split(' ')[1];
      }

      return null;
    }
  }),
  (req, res) => res.status(200).send(req.data)
);

実装は終わったで、あとはサーバーを建ててcurlで試してみます。レスポンスがjsonなら大丈夫です!

curl -H 'Authorization: Bearer {トークン}' http://localhost:3333
# {"value":"foo",...}

UnauthorizedError: invalid signatureの場合はどこかおかしいのでsecret合ってるかどうかなど確認しましょう。