【发布时间】:2019-11-04 13:22:33
【问题描述】:
我正在构建一个应用程序,我需要授权用户登录我读到 localstorage 不是一个安全的选项,所以我现在选择 cookie 来存储令牌接下来要做什么,如何在客户端使用它们是我的代码
这里是后端: 路线:
var express = require('express')
var router = express.Router()
var Controller = require('./controller')
var authController = require('./authController')
var BooksIdeaController = require('./BooksIdeaController')
router.post('/register',Controller.register);
router.post('/login',authController.login);
router.post('/booksIdea/:id',authController.verify,BooksIdeaController.addComment)
router.post('/booksIdea/addbook',authController.verify,BooksIdeaController.addBookIdea)
router.get('/booksIdea/show',authController.verify,BooksIdeaController.showBookIdea)
router.put('/booksIdea/edit/:id',authController.verify,BooksIdeaController.UpdateBookIdea)
router.delete('/booksIdea/delete/:id',authController.verify,BooksIdeaController.DeleteBookIdea)
module.exports = router;
authController.js 文件
const con = require('./db');
var bcrypt = require('bcrypt');
let jwt = require('jsonwebtoken');
const express = require('express')
var cookieParser = require('cookie-parser')
const app = express()
module.exports.login=function(req,res){
var username=req.body.name;
var password=req.body.password;
con.query('SELECT * FROM users WHERE username = ?',[username], function (error, results, fields) {
if (error) {
res.json({
status:false,
message:'there are some error with query'
})
}else{
if(results.length >0){
bcrypt.compare(password, results[0].password, function (err, result) {
if (result == true) {
jwt.sign({user:results},'configSecret',(err,token)=>{
// res.json({
// token:token
// })
res.cookie('token', token, { httpOnly: true })
.sendStatus(200);
res.send('About this wiki');
});
// res.json({
// status:true,
// message:'successfully authenticated'
// })
} else {
res.json({
status:false,
message:"username and password does not match"
});
}
});
}
else{
res.json({
status:false,
message:"username does not exits"
});
}
}
});
}
module.exports.home=function(req,res){
res.send('hello');
}
//////
// if(password==results[0].password){
// }else{
//
// }
module.exports.verify = function verifyToken(req, res, next) {
// Get auth header value
const bearerHeader = req.headers['authorization'];
// Check if bearer is undefined
if(typeof bearerHeader !== 'undefined') {
// Split at the space
const bearer = bearerHeader.split(' ');
// Get token from array
const bearerToken = bearer[1];
// Set the token
req.token = bearerToken;
// Next middleware
next();
} else {
// Forbidden
res.sendStatus(403);
}
}
这里是反应部分
import axios from 'axios'
export const login = user => {
return axios
.post('http://localhost:5001/login', {
name: user.name,
password: user.password
})
.then(response => {
return response.data
})
.catch(err => {
console.log(err)
})
}
【问题讨论】:
-
同时添加您的身份验证控制器
-
它在那里我添加了它
-
您的 cookie 可以通过节点作为 req.cookie 访问。因此,您可以在中间件上创建检查 coockie 是否与存储在数据库中的 cookie 相关,然后返回经过身份验证的,否则返回未经身份验证的响应。
-
谢谢你的回答,你能给我一个解释这个话题的链接吗