- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在浏览论坛,但我无法找到我的代码中的错误,它总是导致错误,我无法解决它,请帮助我...有没有其他方法来验证用户而不是 Passport ,以便我可以使用它。我添加了更多句子,因为它不允许我发布查询,抱歉..
const http = require("http"),
hostname = "127.0.0.1",
port = 3000,
bodyParser = require("body-parser"),
mongoose = require("mongoose"),
express = require("express"),
passport = require("passport"),
localStrategy = require("passport-local"),
passportLocalMongoose = require("passport-local-mongoose"),
User = require("./models/user");
app = express();
mongoose.connect("mongodb://localhost/drive", { useNewUrlParser: true });
app.set("view engine", "ejs");
app.use(express.static("public"));
app.use(passport.initialize());
app.use(passport.session());
app.use(
require("express-session")({
secret: "Beta tumse na ho payega",
resave: false,
saveUninitialized: false
})
);
passport.use(new localStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.use(bodyParser.urlencoded({ extended: true }));
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
});
app.get("/", function(req, res) {
res.render("index");
});
app.get("/register", function(req, res) {
res.send("hello");
});
app.get("/login", function(req, res) {
res.render("login");
});
app.post(
"/login",
passport.authenticate("local", {
successRedirect: "/",
failureRedirect: "/login"
}),
function(req, res) {}
);
app.get("/logout", function(req, res) {
req.logout();
res.redirect("/");
});
function isLoggedIn(req, res, next) {
if (req.isAuthenticated()) {
return next();
} else {
console.log("Not logged");
res.redirect("/login");
}
}
app.get("/secret", isLoggedIn, function(req, res) {
res.send("You are logged in");
});
app.post("/register", function(req, res) {
if (req.body.password === req.body.cpassword) {
User.register(
new User({ username: req.body.username }),
req.body.password,
function(err, user) {
if (err) console.log(err);
else
passport.authenticate("local")(req, res, function() {
res.send("signed up");
});
}
);
} else res.send("Password Mismatch");
});
//DRIVE SCHEMA
//var driveSchema = mongoose.Schema({
// title: String,
// created: { type: Date, default: Date.now }
//});
app.listen(port, hostname, function() {
console.log("Server is running at " + hostname + "/" + port);
});
//./models/user.js file
const mongoose = require("mongoose"),
passportLocalMongoose = require("passport-local-mongoose");
var UserSchema = new mongoose.Schema({
username: String,
password: String
});
UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", UserSchema);
最佳答案
我使用了passport
和jwt
库来验证和维护用户的 session 。无需在服务器端维护用户 session 。
apis/apis.js :此文件包含所有 api 端点。 /login
url 将使用 Passport 对用户进行身份验证,并使用 jwt 向客户端发送 token
const passport = require('passport')
const expRoute = require('express').Router();
let exporter = process.exporter;
expRoute.post('/login', (req, res, next) => {
passport.authenticate(
'local',
{
// successRedirect: '/',
// failureRedirect: '/login',
successFlash: 'Welcome!',
failureFlash: 'Invalid username or password.'
},
(err, user, info) => {
if (err) {
return res.status(500).json(err)
}
else if (user) {
return res.status(200).json({
token: exporter.generateToken(user)
})
}
else {
return res.status(400).json(info)
}
}
)(req, res, next);
})
expRoute.get('/view', exporter.authenticateToken, (req, res) => {
let param = req.finalTokenExtractedData
if (param && exporter.isObjectValid(param, 'tokenId', true, true)) {
let condition = {
_id: param.tokenId
}
let options = {
_id: 0,
password: 0,
__v: 0
}
process.USER.findOne(condition, options) // mongo find
.then((data) => {
res.status(200).json({
result: data,
msg: 'success'
})
})
.catch((mongoErr) => {
exporter.logNow(`USER mongo Error: ${mongoErr}`)
res.status(400).json({
msg: 'user not found'
})
})
}
else {
res.status(404).json({
msg: 'invalid token'
})
}
})
module.exports = expRoute
common/env.js:该文件将初始化所有连接,例如mongo,需要很少的文件将用作全局
process.CONFIG = require('../configs/config.json')
process.exporter = require("../lib/exporter.js")
process.dbInit = (globalName, mongoUrl, collectionName) => {
require("../models/db-init.js")(mongoUrl, collectionName)
.then((modelObj) => {
process[globalName] = modelObj // will be used as global
})
.catch((dbInitErr) => {
process.exporter.logNow(`dbInit Error: ${dbInitErr}`)
process.exit()
});
}
lib/exporter.js:该文件具有导出器类,其中包含所有主要功能,如 mongo 连接、authenticateToken、verifyPassword 等。
const fs = require('fs'),
redis = require("redis"),
path = require("path"),
mongoose = require('mongoose'); mongoose.set('useCreateIndex', true);
const Schema = mongoose.Schema;
var bcrypt = require('bcryptjs')
var jwt = require('jsonwebtoken')
class Exporter {
mongoConnection(mongoURI, schemaObj) {
return new Promise(async (resolve, reject) => {
if (!mongoURI || typeof mongoURI == 'undefined' || mongoURI.length < 1)
return reject('invalid mongo connection url');
return resolve(mongoose.createConnection(mongoURI, { useNewUrlParser: true }))
})
}
createMongoSchema(schemaObj) {
return (new Schema(schemaObj));
}
createMongoModel(mongoDB, collectionName, newSchema) {
if (newSchema)
return mongoDB.model(collectionName, newSchema)
return mongoDB.model(collectionName)
}
authenticateToken(req, res, next) {
const bearerHeader = req.header('authorization')
if (typeof bearerHeader != 'undefined') {
const bearer = bearerHeader.split(' ')
const bearerToken = bearer[1]
jwt.verify(bearerToken, process.CONFIG.jwt.token.activated, (err, data) => {
if (err)
res.status(400).json({
msg: "Invalid token or please try to login again"
})
else {
process.exporter.getSingleHashKeysValuesFromRedis('expired_token', bearerToken)
.then((redisTokendata) => {
if (redisTokendata)
res.status(400).json({
msg: "token expired"
})
else {
req.finalTokenExtractedData = data
// if (req.originalUrl.trim() == process.logoutURL.trim())
req.jwtToken = {
token: bearerToken,
secret: process.CONFIG.jwt.token.activated
}
next()
}
})
.catch((redisTokenError) => {
process.exporter.logNow(`redis token error: ${redisTokenError}`)
res.status(400).json({
msg: "Some went wrong while checking token. Please try later."
})
})
}
})
}
else
res.status(400).json({
msg: "invalid token"
})
}
generateToken(data) {
let expiry = new Date();
// expiry.setDate(expiry.getDate() + 7)
expiry.setMinutes(expiry.getMinutes() + 5)
return jwt.sign({
tokenId: data._id,
exp: parseInt(expiry.getTime() / 1000),
}, process.CONFIG.jwt.token.activated)
}
createPassword(password) {
return new Promise((resolve, reject) => {
if (typeof password == 'undefined' && password == '')
return reject('password empty')
bcrypt.hash(password, 10, async (bErr, hash) => {
if (bErr)
reject(bErr)
else
resolve(hash)
})
})
}
verifyPassword(enteredPassword, savePassword) {
return bcrypt.compareSync(enteredPassword, savePassword)
}
}
module.exports = (new Exporter());
index.js:这是您将执行 node index.js
的文件。
const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const passport = require('passport');
require('./common/env')
require('./configs/passport')
const app = express()
const cors = require('cors')
app.use(cors());
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true}))
app.use(passport.initialize())
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
let apis = require('./apis/api')
app.use('/user', apis)
/**
* 404 Handler
*/
app.use((req, res, next)=>{
return res.status(404).send("Endpoint "+req.url +" not found");
})
/**
* if any error or exception occurred then write into a JS file so that app can be restarted
*/
process.on('uncaughtException', (err) => {
console.error(err.stack);
});
app.listen(3000, function(server) {
console.log("App listening at 3000");
});
当index.js文件成功执行并监听端口3000时,然后使用此URL http://localhost:3000/user/login
进行身份验证,它将接受您的用户名并密码,然后使用 Passport 进行身份验证并将 token 发送给客户端作为响应。 token 可以包含加密形式的用户数据并具有到期时间。
关于javascript - Passport js 中的 isAuthenticated() 始终返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55199837/
在 MVC4 应用程序中,在 Controller 逻辑中我想检查用户是否已登录。 我应该使用: User.Identity.IsAuthenticated 或者: WebSecurity.IsAut
我有一个 IsAuthenticated 方法,它有一个复杂的参数类型(我从 play2 的 zentasks 示例中复制了它): def IsAuthenticated(f: => String =
用户提交登录 POST 数据。 Passport.js 进行身份验证。 req.isAuthenticated() 为 true。 将用户从登录路径重定向至主页 在主页路由中,req.isAuthen
我开始学习node/express js,并且我使用passport制作了一个登录系统,但是我想在我的系统中制作一个成员(member)页面只能供已经登录的用户,经过一番研究我找到了答案here ,并
我开始学习node/express js,并且我使用passport制作了一个登录系统,但是我想在我的系统中制作一个成员(member)页面只能供已经登录的用户,经过一番研究我找到了答案here ,并
我正在使用 MVC 格式创建网站。现在它所做的只是从 SQL 服务器管理用户。我现在要做的是让用户登录,然后能够管理用户。它应该从登录页面转到帐户索引,但我只希望经过身份验证的用户可以查看此页面。它工
我正在尝试修复以下错误: /home/ubuntu/workspace/src/util/utils.js:2 if (req.isAuthenticated()) { ^ T
我已经实现了passport.js,登录时我将passport.authenticated()函数放在中间件中。 app.post('/api/v1/login', function
server.ext('onRequest', (request, reply) => { request.context = { token: request.headers['X-AC
这可能是个愚蠢的问题,但我在 Google 上搜索得很辛苦,却找不到答案。 我正在创建一个数据库位于另一个大陆的网站,因此速度是一个至关重要的问题。 据我了解, WebSecurity.Login(
我有一个关于 ASP.NET 身份提供程序的问题。我做了一个系统,你可以在其中对用户和角色执行 CRUD 操作,尽管我遇到了一个问题。如果我要删除一个已经通过身份验证(登录)的用户,他仍然可以在网站上
MSDN 代码示例说明:以下代码示例使用 IsAuthenticated 属性来确定当前请求是否已通过身份验证。如果尚未通过身份验证,请求将被重定向到另一个页面,用户可以在该页面中将其凭据输入到 We
我有一个 HttpModule实现了应该限制对 /courses/ 的访问我网站的目录,但有一个主要问题。 Request.IsAuthenticated总是 false . 这是代码: using
我的 Express 应用程序调用 request.isAuthenticated() 方法。但是,我不知道它检查什么来确定它是否经过身份验证。我的应用需要通过 OIDC 进行身份验证。如何告诉 is
我试图在我的 Controller 中调用 isAuthenticated 方法,但它告诉我不是一个函数。下面是我的代码片段。 Controller (function() { 'use strict
当我登录时,我已通过身份验证,但当我切换到另一个页面时,req.isAuthenticated 返回 false,并且我位于登录面板上。第二件事是,当我登录时,我不断收到错误“发送后无法设置 head
我使用 passportjs 的身份验证功能将始终返回 false,即使用户已经存在,它也将始终重定向到登录页面,这会覆盖我所有的身份验证路由,因此当我使用有效的用户凭据登录或创建新的用户,默认行为是
我已经寻找了一段时间,但找不到明确的文档来源。当我搜索这些内容时,第一个 Google 结果是 StackOverflow。 还有类似的中间件功能吗? 最佳答案 虽然在任何容易找到的地方都没有明确记录
我想为 Play2 Framework 应用创建自定义身份验证方法。我正在 Scala 和 Play 中尝试——而且我对这两者都是新手。 在 zentask 示例中,Trait Secured 中有一
我使用 passportjs 的身份验证功能将始终返回 false,即使用户已经存在,它也将始终重定向到登录页面,这会覆盖我所有的身份验证路由,因此当我使用有效的用户凭据登录或创建新的用户,默认行为是
我是一名优秀的程序员,十分优秀!