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

Posted

技术标签:

【中文标题】护照-jwt 总是返回“未经授权” - 401【英文标题】:passport-jwt always return 'Unauthorized' - 401 【发布时间】:2018-05-19 01:22:59 【问题描述】:

我正在尝试在我的应用程序中执行社交身份验证,为此我使用了两个模块:passport-google-oauth-20 和 passport-jwt。

当用户使用 google 帐户成功登录时,我会创建一个令牌并将其作为具有“授权”标头类型的 Bearer 令牌发送到标头。

问题是:当我尝试访问一些受保护的路由时,总是返回未经授权的。似乎没有调用 passport.authencate('jwt')。

这是我的代码:

const express = require('express')
const JwtStrategy = require('passport-jwt').Strategy
const ExtractJwt = require('passport-jwt').ExtractJwt
const GoogleStrategy = require('passport-google-oauth20').Strategy
const passport = require('passport')
const morgan = require('morgan')
const moment = require('moment')
const db = require('./configs/database')
const User = require('./models/user')
const PORT = (process.env.PORT || 8080)
const jwt = require('jsonwebtoken')
const app = express()

app.set(db)
app.use(morgan('dev'))
app.use(function(req, res, next)   
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization, Access-Control-Allow-Credentials");
    res.header("Access-Control-Allow-Credentials", "true");
    next();
  );




//passport setup
let opts = 
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken()
opts.secretOrKey = 'shhhhhhhhhhhh'

passport.use('jwt', new JwtStrategy(opts, function(jwt_payload, done)
    User.findById(jwt_payload.user._id, (err, user)=>
        if(user)
            return done(null, user)
         else
             return done(null, false)
        
        if(err)
            return done(err, false)
        
    )
))

passport.use(new GoogleStrategy(
    clientID: '',
    clientSecret: '',
    callbackURL: "http://localhost:8080/auth/google/callback"
  ,
  function(accessToken, refreshToken, profile, cb) 

    User.findOne('google.id': profile.id , function (err, user) 
        if(user)
            return cb(null, user)
        
        else
            let newUser = 
                'google.id':profile.id,
                'google.name':profile.displayName,
                'google.token':accessToken
            
            User.create(newUser, (err, user)=>
                return cb(null, user)
            )
        
        if(err)
            return cb(err)
        
    );
  
));


app.get('/auth/google',
passport.authenticate('google',  scope: ['profile','email'] ));


app.get('/auth/google/callback', 
passport.authenticate('google',  failureRedirect: '/login', session:false),
    (req, res) => 
    console.log(req.user._id)
    let token = jwt.sign(id:req.user._id, user:req.user, sucess:true, 'shhhh',expiresIn:36000)
    res.json(token:'Bearer ' + token)
);


app.get('/dashboard', passport.authenticate('jwt',  session: false ), function(req, res)   
    res.json(message:'worked', user:req.user)
  );



app.listen(PORT, () => 
    console.log(`Server running on PORT $PORT. At: $moment().format('LT')`)
)

【问题讨论】:

【参考方案1】:

https://***.com/a/46020083/4548946

如果您使用的是 ExtractJwt.fromAuthHeaderAsBearerToken(),标头应包含 'Authorization' = 'bearer token_received_on_login'

【讨论】:

【参考方案2】:

像我最近所做的那样,为将来遇到这种情况的其他人添加,您必须初始化护照:

在基于 Connect 或 Express 的应用程序中,需要使用 passport.initialize() 中间件来初始化 Passport。如果您的应用程序使用持久登录会话,则还必须使用 passport.session() 中间件。

http://www.passportjs.org/docs/configure/

【讨论】:

以上是关于护照-jwt 总是返回“未经授权” - 401的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 护照 oauth 路线总是返回 401 未经授权

护照-jwt 401 未经授权

护照-jwt sequelize 401 总是

Angular JWT Auth - 总是 401 未经授权

在内部生成 laravel 护照令牌。 401错误未经授权

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