使用 JWT 进行护照身份验证:如何将护照的默认未经授权响应更改为我的自定义响应?

     2023-02-19     160

关键词:

【中文标题】使用 JWT 进行护照身份验证:如何将护照的默认未经授权响应更改为我的自定义响应?【英文标题】:Passport authentication with JWT: How can I change passport's default unauthorized response to my custom response? 【发布时间】:2019-05-30 20:08:26 【问题描述】:

我用passport 创建了一个Node 项目。当我没有将令牌作为标题时,它返回Unauthorized。如何将此消息更改为漂亮的Sorry invalid credentials

每次无法提供令牌时,我都会收到未经授权的响应。我想把它改成漂亮的消息。

passport.js

const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const mongoose = require('mongoose');

var User        = require('../models/user'); // get the mongoose model

const keys = require('../config/keys');

const opts = ;

opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrKey;

module.exports = passport => 
    passport.use(
        new JwtStrategy(opts, (jwt_payload, done) => 
            User.findById(jwt_payload.id)
                .then(user => 
                    if (user) 
                        return done(null, user);
                    
                    return done(null, false);
                )
                .catch(err => console.log(err))
        )
    );
;

用户路由.js

const express = require('express');
const router = express.Router();
const jwt = require('jsonwebtoken');
const passport = require('passport');
const setting=require("../validation/settings");


const User = require('../models/user');


// *** GET *** /api/users/all *** Retrieve all users' basic details ***
router.get("/", passport.authenticate('jwt', session: false), function (req, res)

    var token = getToken(req.headers);
  console.log('the token: ' + token);

    User.find()
    .select('fname lname email avatar contact_no role')
    .where('is_deleted').equals('false')
    .exec()
    .then(docs => 
        return res.send(setting.status("User details retrieval successfully",false, "User details retrieval successfully", docs))
        //res.status(200).json(setting.status(validation.SHOW,true,"User details retrieval successfully.",docs))
    .catch(err => 
        return res.send(setting.status("Error in retrieving user details",false, "Error may token", err))
    );
    );
);


getToken = function (headers) 
  if (headers && headers.authorization) 
    var parted = headers.authorization.split(' ');
    if (parted.length === 2) 
      return parted[1];
     else 
      return null;
    
   else 
    return null;
  
;


module.exports = router;

如何将unauthorized 消息更改为漂亮(“您无法获取详细信息,”)

【问题讨论】:

检查documentation 的护照。您可以使用 Flash 消息来实现这一点。我 我试过但没用。我认为它不属于我的 passport.js 【参考方案1】:

根据Passport的官方文档,您可以使用custom callback函数来处理授权失败的情况并覆盖默认消息。

如果您正在开发 REST API,然后您希望发送漂亮的 JSON 响应,如下所示:


    "error": 
        "name": "JsonWebTokenError",
        "message": "invalid signature"
    ,
    "message": "You cannot get the details. You are not authorized to access this protected resource",
    "statusCode": 401,
    "data": [],
    "success": false

我使用Passport JWT 身份验证来保护我的一些路由,并应用了authMiddleware,如下所示:

app/middlewares/authMiddleware.js

const express = require('express');
const router = express.Router();
const passport = require('passport');
const _ = require('lodash');

router.all('*', function (req, res, next) 
  passport.authenticate('jwt',  session: false , function(err, user, info) 

    // If authentication failed, `user` will be set to false. If an exception occurred, `err` will be set.
    if (err || !user || _.isEmpty(user)) 
      // PASS THE ERROR OBJECT TO THE NEXT ROUTE i.e THE APP'S COMMON ERROR HANDLING MIDDLEWARE
      return next(info);
     else 
      return next();
    
  )(req, res, next);
);

module.exports = router;

app/routes/approutes.js

const authMiddleware = require('../middlewares/authMiddleware');

module.exports = function (app) 
  // secure the route by applying authentication middleware
  app.use('/users', authMiddleware);
  .....
  ...
  ..

  // ERROR-HANDLING MIDDLEWARE FOR SENDING ERROR RESPONSES TO MAINTAIN A CONSISTENT FORMAT
  app.use((err, req, res, next) => 
    let responseStatusCode = 500;
    let responseObj = 
      success: false,
      data: [],
      error: err,
      message: 'There was some internal server error',
    ;

    // IF THERE WAS SOME ERROR THROWN BY PREVIOUS REQUEST
    if (!_.isNil(err)) 
      // IF THE ERROR IS REALTED TO JWT AUTHENTICATE, SET STATUS CODE TO 401 AND SET A CUSTOM MESSAGE FOR UNAUTHORIZED
      if (err.name === 'JsonWebTokenError') 
        responseStatusCode = 401;
        responseObj.message = 'You cannot get the details. You are not authorized to access this protected resource';
      
    

    if (!res.headersSent) 
      res.status(responseStatusCode).json(responseObj);
    
  );
;

【讨论】:

如何使用护照身份验证更新包含 jwt 的 cookie

】如何使用护照身份验证更新包含jwt的cookie【英文标题】:Howtoupdatecookiecontainingjwtusingpassportauthentication【发布时间】:2019-07-0705:03:23【问题描述】:我有一个包含签名jwt的cookie,有效期为5分钟。jwt包含基本用户信息(用于身份... 查看详情

护照 jwt 验证回调未调用

...called【发布时间】:2016-12-1411:31:45【问题描述】:我正在使用passport-jwt包进行简单的身份验证,令牌是由jsonwebtoken生成的。但问题是永远不会调用验证回调。这是我的passport.js代码。varJwtStrategy=require(\'passport-jwt\').Strategy;var 查看详情

护照-jwt 总是返回 401 未授权

...【发布时间】:2019-08-2913:33:36【问题描述】:我正在尝试使用passport-jwt身份验证策略对nodejsapi进行身份验证,但它总是抛出401未经授权的错误。我尝试了各种实现,但passport.authenticate功能似乎不起作用。使用以下护照版本:"护... 查看详情

使用 Passport 进行社交身份验证登录后如何重定向到个人资料页面? (角度,快递,护照,jwt)

】使用Passport进行社交身份验证登录后如何重定向到个人资料页面?(角度,快递,护照,jwt)【英文标题】:HowtoredirecttoprofilepageaftersocialauthloginwithPassport?(Angular,express,passport,jwt)【发布时间】:2020-09-0514:06:51【问题描述】:我... 查看详情

Laravel 通过生成的令牌进行身份验证,无需护照和 jwt

...018-05-2810:12:09【问题描述】:我正在尝试通过在laravel5.5中使用md5加密方法从登录用户的用户名中检查生成的令牌来执行api-auth,并且不想将令牌保存到用户表中。当用户注销时,令牌将无效。URL将是这样的:http://my 查看详情

护照后如何使用承诺登录。通过社会服务进行身份验证。 KeystoneJS + 护照

】护照后如何使用承诺登录。通过社会服务进行身份验证。KeystoneJS+护照【英文标题】:Howtodosigninwithpromisesafterpassport.authenticatewithsocialservices.KeystoneJS+Passport【发布时间】:2017-04-2218:08:43【问题描述】:除了myquestioninrepository我需... 查看详情

身份验证用户提供程序 [passport] 未使用 laravel 护照定义

】身份验证用户提供程序[passport]未使用laravel护照定义【英文标题】:Authenticationuserprovider[passport]isnotdefinedwithlaravelpassport【发布时间】:2019-03-2710:05:28【问题描述】:我在laravel中有一个api,我使用护照进行身份验证。在我的confi... 查看详情

如何将 Mongoose/Mongodb 与 node.js- 护照身份验证一起使用

】如何将Mongoose/Mongodb与node.js-护照身份验证一起使用【英文标题】:HowtouseMongoose/Mongodbwithnode.js-passportauthentication【发布时间】:2022-01-0814:22:48【问题描述】:我正在构建我的第一个全栈node.js应用程序,我想使用护照进行身份验... 查看详情

如何获得快速路线通过护照进行身份验证

...改为稍旧的es5版本。我不得不重新创建导出,需要而不是使用导入,并且路由现在可以正常工作了。我有这样的结构:index.js(app)api/index.js(/apiendpo 查看详情

对身份验证技术的怀疑 - 护照

...尝试了passport和passport-jwt的身份验证技术。这是我一直在使用的代码constJwtStrategy=require("passport-jwt").Strategy;constExtractJwt=r 查看详情

将护照 openID-stategy 与 JWT 相结合

...JWT【发布时间】:2015-12-2623:17:27【问题描述】:我在尝试使用openID(passport-steam)对passport.js进行身份验证时遇到问题,然后使用令牌(JWT)而不是会话。我当前的代码如下所示:app.post(\'/auth/steam\',passport.aut 查看详情

如何修复阻止注册用户登录的护照本地身份验证错误

...可以。该程序具有用户名字段和密码字段。因此人们可以使用他们的用户名和密码进行注 查看详情

使用电子邮件进行身份验证时,NestJS 护照身份验证返回 401

】使用电子邮件进行身份验证时,NestJS护照身份验证返回401【英文标题】:NestJSpassportauthenticationreturns401whenusingemailforauthentication【发布时间】:2020-07-1821:15:03【问题描述】:我有一个似乎并不罕见的问题,但我找到的解决方案在... 查看详情

NodeJs JWT 护照

...sJWTPassport【发布时间】:2018-10-2104:59:22【问题描述】:我使用带有护照验证JWT的nodejs。我可以创建JWT令牌,但如果我使用passport.authenticate(\'jwt\')保护我的路线,它就不起作用并且我有错误。我的错误:TypeError:无法读取未定义的... 查看详情

如何使用护照发送成功重定向的用户个人资料数据?

】如何使用护照发送成功重定向的用户个人资料数据?【英文标题】:howtosenduserprofiledataonsuccessredirectwithpassport?【发布时间】:2018-03-1610:31:51【问题描述】:我对Node.js还是很陌生,我正在学习使用护照进行身份验证,在我的节... 查看详情

使用护照进行身份验证后,如何在 React FROM express 中重定向到用户仪表板

】使用护照进行身份验证后,如何在ReactFROMexpress中重定向到用户仪表板【英文标题】:HowdoIredirecttouserdashboardinReactFROMexpressafterauthenticatingwithpassport【发布时间】:2021-05-0912:08:30【问题描述】:我正在使用MERN堆栈构建一个应用程... 查看详情

在 mongoose 中使用 Promise 进行护照身份验证

】在mongoose中使用Promise进行护照身份验证【英文标题】:Usingpromisesinmongooseforpassportauthentication【发布时间】:2017-01-0213:40:55【问题描述】:varLocalStrategy=require(\'passport-local\').Strategy;varUser=require(\'../models/user\');module.exports= 查看详情

护照反序列化用户未在帆中调用

...nsails【发布时间】:2015-12-2206:50:25【问题描述】:我正在使用Sails0.11版并尝试使用jwt身份验证配置应用程序。配置/passport.jsvarpassport=require(\'passport\');varjwt=require(\'express-jwt\');module.export 查看详情