依存
まず必要なパッケージをインストールします。
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:3333
でok
とだけ返す所まで作ります。
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
でちなみに
resultProperty
はreq.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
合ってるかどうかなど確認しましょう。