使用 Passport 授权时为 API 测试设置 Postman
Posted
技术标签:
【中文标题】使用 Passport 授权时为 API 测试设置 Postman【英文标题】:Setting Up Postman for API Testing When Using Passport Authorization 【发布时间】:2016-12-11 07:46:07 【问题描述】:在测试我的应用程序的 API 时试图让 Postman 工作时,我有点困惑。即,我正在使用 Passport 身份验证;但是,我不知道它默认为哪种类型或在我的代码中使用哪种类型。我怎样才能弄清楚这一点以及我应该在 Postman 中选择哪种类型?
这是相关的护照代码:
var login = require('./login');
var signup = require('./signup');
var User = require('../models/user');
module.exports = function(passport, path, nodemailer, sesTransport, EmailTemplate, templateDir, template)
// Passport needs to be able to serialize and deserialize users to support persistent login sessions
passport.serializeUser(function(user, done)
//console.log('serializing user: ');console.log(user);
done(null, user._id);
);
passport.deserializeUser(function(id, done)
User.findById(id, function(err, user)
//console.log('deserializing user:',user);
done(err, user);
);
);
// Setting up Passport Strategies for Login and SignUp/Registration
login(passport);
signup(passport, path, nodemailer, sesTransport, EmailTemplate, templateDir, template);
最后,我几乎所有的 API 点仅在用户登录时才起作用。如何通过保存授权凭据在 Postman 中模拟相同的行为?
编辑:
Perhaps this code is relevant as well:
module.exports = function(passport)
passport.use('login', new LocalStrategy(
passReqToCallback : true,
usernameField: 'email',
passwordField: 'password'
,
function(req, username, password, done)
// check in mongo if a user with username exists or not
User.findOne( 'email' : username ,
function(err, user)
// In case of any error, return using the done method
if (err)
return done(err);
// Username does not exist, log the error and redirect back
if (!user)
console.log('User Not Found with username '+username);
return done(null, false, req.flash('message', 'User Not found.'));
// User exists but wrong password, log the error
if (!isValidPassword(user, password))
console.log('Invalid Password');
return done(null, false, req.flash('message', 'Invalid Password')); // redirect back to login page
// User and password both match, return user from done method
// which will be treated like success
return done(null, user);
);
)
);
var isValidPassword = function(user, password)
return bCrypt.compareSync(password, user.password);
【问题讨论】:
您使用的是哪种护照认证策略?大多数人使用passport-http-bearer。 如何确定?我查看了代码,似乎没有任何参数。 可以是本地护照吗? 【参考方案1】:我没有运行本地身份验证策略的代码,但我认为以下邮递员设置应该适合您。
请求访问令牌;假设您的端点是 auth/local。
-
打开邮递员
创建一个 POST 请求
在授权选项卡下设置“无身份验证”
在正文选项卡下 -> 点击 x-www-form-urlencoded
添加一个名为email的键并输入用户email
添加一个名为 password 的密钥并输入电子邮件的相关密码
请参阅下面的令牌请求屏幕截图:
响应将返回一个 access_token。
要使用 access_token,只需创建一个 HTTP 请求,然后在 HEADER 选项卡中,添加键 Authorization 后跟“Bearer”的值
查看使用令牌请求截图:
【讨论】:
@MadPhysicist 让我知道这是否适合您。 您所指的“关联电子邮件密码”是什么? 我已经尝试了您建议的第一部分。在登录页面上,我有两个文本字段:电子邮件和密码。这些是我在执行 POST 请求时预先填写的键和值。但是,它返回(代码 200)并且似乎将整个登录页面(html 表单)返回给我。 @MadPhysicist 从您的登录端点返回的内容由您自己的代码确定。 Passport 仅执行身份验证并告诉您的应用程序执行身份验证的用户是否有效。通常,您的代码会继续生成唯一的访问令牌并将其作为响应传回给用户。然后,用户将使用此令牌在后续请求中代表他。检查端点中的代码。我怀疑你会有类似res.redirect('login-page-url')
“关联电子邮件机密” - 我的意思是用户的护照。【参考方案2】:
我使用它,它在邮递员中运行良好。 获得访问令牌的响应后 在授权选项卡下。从“类型”下拉列表中选择“不记名令牌”。并且带有字段的令牌将出现在右侧。输入访问令牌。
这适用于 Laravel REST API。
查看屏幕截图 Postman Auth Token passing
【讨论】:
【参考方案3】:我所做的是。首先通过邮递员发送登录请求。如果您查看响应,您应该会看到一个 cookie 选项卡。复制cookie的值
Postman Picture
当您想检查标头中的“受保护”路由时,您需要选择 cookie 并在值中粘贴您之前复制的值。
Cookie Header
【讨论】:
以上是关于使用 Passport 授权时为 API 测试设置 Postman的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 通过 Passport 实现 API 请求认证:隐式授权令牌
Laravel 通过 Passport 实现 API 请求认证:移动端应用篇(密码授权令牌)
使用 Passport 进行 Laravel API 身份验证导致 401(未经授权)