質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

0回答

1601閲覧

JWT認証でリクエストヘッダのAuthorizationにトークンを設定する方法

maskmelon

総合スコア63

JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

1クリップ

投稿2020/07/29 03:46

編集2020/07/29 15:14

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が返ってくるだけでログイン状態を維持することができません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問