我正在尝试在我的项目中实现 GraphQL,我想passport.authenticate('local')在我的登录中使用Mutation
我想要的代码改编:
const typeDefs = gql`
type Mutation {
login(userInfo: UserInfo!): User
}
`
const resolvers = {
Mutation: {
login: (parent, args) => {
passport.authenticate('local')
return req.user
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
passport设计多为REST / Express吗?passport.authenticate方法(将用户名和密码传递给它)吗?我正在尝试这个git示例.
当我将它与我的项目集成时效果很好,但我想要实现的是发送json作为对客户端/请求的响应,而不是successRedirect:'/ profile'和failureRedirect:'/ signup'.
是否可以发送json,还是有其他方法来获得相同的?
任何帮助将不胜感激,TU
任何人都可以帮我这个.Error: passport.initialize() middleware not in use当我尝试连接到数据库中的用户时,我不断得到.异常案例工作得很好(没有找到错误的密码/用户名).
这是设置:
我正在使用的版本
// version
node --version v0.10.33
express@4.10.2
passport@0.2.1
passport-local@1.0.0
Run Code Online (Sandbox Code Playgroud)
server.js代码在这里
// server.js
'use strict';
var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session');
var passport = require('passport');
var flash = require('connect-flash');
var cookieParser = require('cookie-parser');
//Our custom modules
var mysqlc = require('./modules/mysql_client');
// Our custom apps
var app = express();
//view engine setup
app.set('env', process.env.NODE_ENV);
console.log('Running as environment: ' + app.get('env'));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(favicon(path.join(__dirname,'./public/favicon.ico'))); …Run Code Online (Sandbox Code Playgroud) 编辑我试过两个,重定向,而不是重定向.重定向时,我得到的结果与我直接请求的结果相同/,但是当我不接收时,我得到的是一个包含的对象data = Moved Temporarily. Redirecting to /
鉴于此策略:
var strategy = new LocalStrategy(
{
session: true
},
function (username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (user.password !== password) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
});
Run Code Online (Sandbox Code Playgroud)
而这台服务器:
//************ EDIT ****//
function genuuid(req) {
return "Test UID"; …Run Code Online (Sandbox Code Playgroud) 我在注册用户时检查电子邮件是否已存在.如果用户已存在,则传递错误消息"email already exists".但在前端它显示"未授权"错误401.我想传递错误消息,我从后端传递到前端,但它传递默认消息.下面是我如何检查用户是否已经存在并发送错误消息,
exports.register = new LocalStrategy({
usernameField: 'email',
passReqToCallback: true
}, function(req, email, password, done,res) {
var newUser = new User({
email: email,
password: password,
name: req.body.fname
});
var searchUser = {
email: email
};
User.findOne(searchUser, function(err, user) {
if (err) return done(err);
console.log("err "+err);
if (user) {
return done(null, false, {
message: "email already exists"
});
}
newUser.save(function(err) {
console.log("newUser "+newUser);
done(null, newUser);
})
});
});
Run Code Online (Sandbox Code Playgroud)
我使用护照进行身份验证,
authRouter.post('/signup', passport.authenticate('local-register'),function(req, res) {
createSendToken(req.user, res);
});
Run Code Online (Sandbox Code Playgroud)
错误消息不是我传递给前端的消息.它显示未经授权的错误,这是默认错误.当我在前端的控制台中打印错误消息时,它显示,
Object {data: "Unauthorized", …Run Code Online (Sandbox Code Playgroud) 在我的app.js中,我有:
router.post('/login', passport.authenticate('local', {
successRedirect: '/admin/users',
failureRedirect: '/login'
}), function (req, res) {
});
Run Code Online (Sandbox Code Playgroud)
我的用户对象如下所示:
{ _id: 586afad4a4ff884d28b6ca97,
firstName: 'Joseph',
...
isAdmin: false }
Run Code Online (Sandbox Code Playgroud)
我想做的是:
router.post('/login', passport.authenticate('local', {
successRedirect: {
if(req.body.user.isAdmin === true) {
res.redirect('/admin/users')
}
res.redirect('/dashboard');
},
failureRedirect: '/login'
}), function (req, res) {
});
Run Code Online (Sandbox Code Playgroud)
但似乎我不能.使用passport.authenticate检查用户是管理员还是登录帖子的最简单示例是什么
我一直未能获得passport.authenticate在async/await或promise模式下工作.这是一个我认为应该工作的例子,但它无法执行passport.authenticate().
const passport = require("passport");
let user;
try {
user = await __promisifiedPassportAuthentication();
console.log("You'll never have this ", user);
} catch (err) {
throw err;
}
function __promisifiedPassportAuthentication() {
return new Promise((resolve, reject) => {
console.log("I run");
passport.authenticate('local', (err, user, info) => {
console.log("I never run");
if (err) reject(err);
if (user) resolve(user);
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何智慧的圣言都会受到高度赞赏.
因为我可以req.user通过传入来获取任何路由中的登录用户:
passport.authenticate("jwt", { session: false })
Run Code Online (Sandbox Code Playgroud)
我想允许用户使用除本地登录之外的Twitter登录,因此我在node.js API中有一个passport-twitter策略.如何使用req.user访问本地登录用户?
module.exports = passport => {
passport.use(
new Strategy({
consumerKey: "",
consumerSecret: "",
callbackURL: "http://localhost:3000"
},
function(token, tokenSecret, profile, cb) {
Profile.findOne({
user: req.user._id
}).then(
userdetail => {
userdetail.twuser = profile._json.screen_name;
userdetail.token = token;
userdetail.tokenSecret = tokenSecret;
userdetail.save().then();
return cb(null, profile);
}
)
}
)
);
};
Run Code Online (Sandbox Code Playgroud) 我遇到的问题似乎并不罕见,但我找到的解决方案在我的项目中不起作用。
我想做的是使用护照进行简单的身份验证,如本教程所示: https: //docs.nestjs.com/techniques/authentication
我一直遵循这个教程,一开始它很有效。后来我决定使用用户的电子邮件和密码而不是用户名作为身份验证。因此,我将身份验证过程中的变量名称和参数更改为电子邮件,这就是一切崩溃的点。我在这里错过了什么吗?
auth.module.ts
import {Module} from '@nestjs/common';
import {UsersModule} from "../users/users.module";
import {AuthService} from "./services/auth.service";
import {PassportModule} from "@nestjs/passport";
import {LocalStrategy} from "./strategies/local.strategy";
import {AuthController} from "./controllers/auth.controller";
import {JwtModule} from "@nestjs/jwt";
import {jwtConstants} from "./constants";
import {JwtStrategy} from "./strategies/jwt.strategy";
import {EncryptionModule} from "../encryption/encryption.module";
@Module({
imports: [
UsersModule,
EncryptionModule,
PassportModule.register({defaultStrategy: 'jwt'}),
JwtModule.register({
secret: jwtConstants.secret,
signOptions: {
expiresIn: '30s'
}
})
],
providers: [
AuthService,
LocalStrategy,
JwtStrategy
],
controllers: [
AuthController
]
})
export class AuthModule {
}
Run Code Online (Sandbox Code Playgroud)
控制器/auth.controller.ts …
如何使用JWT(后端快递)将nuxt auth模块(前端)与本地护照一起使用?
定义 jwt 策略以验证 jwt 令牌(express)
var JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt;
var opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = 'secret';
opts.issuer = 'accounts.examplesoft.com';
opts.audience = 'yoursite.net';
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
User.findOne({id: jwt_payload.sub}, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
return done(null, user);
} else {
return done(null, false);
// or you could create a new account
}
});
}));
Run Code Online (Sandbox Code Playgroud)
定义用于验证用户名和密码的本地策略(快速)
passport.use(new LocalStrategy(
function(username, password, done) …Run Code Online (Sandbox Code Playgroud) passport-local ×10
passport.js ×8
node.js ×6
express ×4
api ×1
async-await ×1
graphql ×1
javascript ×1
nestjs ×1
nuxt.js ×1
passport-jwt ×1