使用 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(未经授权)

测试受保护的 api 调用、mocha、supertest、node js、passport

Laravel Passport APi - 隐式授权

401 未经授权使用带有 Laravel Passport 的不记名令牌