• ..

Figma

    Express と JWT (JSON Web Token) をできるだけシンプルに使う

    依存

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

    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合ってるかどうかなど確認しましょう。