Node.jsでJWTを使ったログイン機能を実装しています。ポストマンを使ってリクエストヘッダのAuthorizationに発行されたトークンを手入力し、APIを動作させることはできたのですが、ログインと同時に自動でリクエストヘッダにトークンを設定する方法がわかりません。どなたかご教授いただけますと幸いです。
Javascript
1const mongoose = require('mongoose'); 2const jwt = require('jsonwebtoken'); 3 4//ユーザーモデルのインスタンスに対してトークンを発行 5userSchema.methods.generateAuthToken = async function () { 6 const user = this; 7 const token = jwt.sign({ _id: user._id.toString() }, 'hogehoge'); 8 9 user.tokens = user.tokens.concat({ token }); 10 11 await user.save(); 12 return token; 13}; 14 15const User = mongoose.model('User', userSchema); 16 17module.exports = User;
JavaScript
1const jwt = require('jsonwebtoken'); 2const User = require('../models/user'); 3 4//トークンを認証するミドルウェア 5const auth = async (req, res, next) => { 6 try { 7 const token = req.header('Authorization').replace('Bearer ', ''); 8 const decoded = jwt.verify(token, 'hogehoge'); 9 const user = await User.findOne({ _id: decoded._id, 'tokens.token': token }); 10 11 if (!user) { 12 throw new Error(); 13 } 14 15 req.token = token; 16 req.user = user; 17 18 next(); 19 } catch (e) { 20 res.status(401).send({ error: 'Please authenticate.' }); 21 } 22}; 23 24module.exports = auth; 25
JavaScript
1const express = require('express'); 2 3const router = new express.Router(); 4const User = require('../models/user'); 5const auth = require('../middleware/auth'); 6 7//ユーザー作成時にトークンを発行 8router.post('/createUser', async (req, res) => { 9 const user = new User(req.body); 10 11 try { 12 await user.save(); 13 const token = await user.generateAuthToken(); 14 res.status(201).send({ user, token }); 15 } catch (e) { 16 res.status(400).send(e); 17 } 18}); 19 20//ログイン時にトークンを発行 21router.post('/login', async (req, res) => { 22 try { 23 const user = await User.findByCredentials(req.body.name, req.body.password); 24 const token = await user.generateAuthToken(); 25 res.send({ user, token }); 26 } catch (e) { 27 res.status(400).send(e); 28 } 29}); 30 31//ログアウト時に認証 32router.post('/logout', auth, async (req, res) => { 33 try { 34 req.user.tokens = req.user.tokens.filter((token) => token.token !== req.token); 35 await req.user.save(); 36 res.send(); 37 } catch (e) { 38 res.status(500).send(); 39 } 40}); 41 42//ユーザー情報の取得時に認証 43router.get('/profile', auth, async (req, res) => { 44 res.send(req.user); 45}); 46 47module.exports = router; 48
###追記
具体的にいうと、
router.post('/login', async (req, res) => { try { const user = await User.findByCredentials(req.body.name, req.body.password); const token = await user.generateAuthToken(); res.send({ user, token }); } catch (e) { res.status(400).send(e); } });
ログイン時にサーバ側から返ってきたtoken
をヘッダのAuthorizationの中に入れる方法が知りたいです。現状だと、ログインした後もtoken
が返ってくるだけでログイン状態を維持することができません。
あなたの回答
tips
プレビュー