首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Passport Facebook-登录失败,节点和react应用程序中出现401错误

Passport Facebook-登录失败,节点和react应用程序中出现401错误
EN

Stack Overflow用户
提问于 2019-05-30 05:45:53
回答 1查看 396关注 0票数 0

当我尝试使用passport进行身份验证时,我得到了以下错误。我想知道我是不是遗漏了一些中间件什么的。无论如何,这在目前是行不通的。我在后端收到以下错误:]{消息:‘你应该提供access_token’}错误ERR_HTTP_HEADERS_SENT:发送到客户端后无法设置标头

App.js:29 POST http://127.0.0.1:3000/api/users/auth/facebook 401 (未经授权)

我已经确保访问令牌打印在前端:这是令牌blob {"access_token":"EAAGTZAFMSr8YBACcmZAaEaEMTbCKICwJqiohySMxb1pPrJaaECiPqfOqiPFln4hp2pucvSm9Pr42twDQVZBt4KZAIoEENaAINHVBcfZB8YdRM23Y9VjDSeSnUtOsyynufjCBdQyNozpI2N4bTJotZAEmLETjIqLZBxwP9VxBdDFZAYWMofEiZCUDrQwGk7fBahs8SEtzTB80kfAZDZD"}这里是前端

代码语言:javascript
复制
facebookResponse = (response) => {
    const token= JSON.stringify({access_token: response.accessToken}, {type : 'application/json'});
    console.log('this is ther token blob', token);
    const options = {
        method: 'POST',
        body: token,
        mode: 'cors',
        cache: 'default'
    };
    fetch('api/users/auth/facebook', options).then(r => {
        const token = r.headers.get('x-auth-token');
        if(token){
          try {
        r.json().then(user => {
            if (token) {
                this.setState({isAuthenticated: true, user, token})
            }
        });
      } catch{
        console.log('error');
      }
      }
    })
};

这是后端

代码语言:javascript
复制
    var express = require('express');
var router = express.Router();
var { generateToken, sendToken } = require('./token.utils');
var passport = require('passport');
var config = require('./config');
var request = require('request');
require('../../passport')();

router.use(passport.initialize());
router.use(passport.session());
router.post('/auth/facebook',
 function(req, res, next){
      passport.authenticate('facebook-token', function(error, user, info){
        console.log(error);
        console.log(user);
        console.log(info);
        if (error) {
          res.status(401).send(error);
        } else if (!user) {
          res.status(401).send(info);
        } else {
          next();
        }
        res.status(401).send(info);
  })(req, res);
});

module.exports = router;

以下是我使用facebook登录的jwt策略:

代码语言:javascript
复制
require('./mongoose')();
var passport = require('passport');
var User = require('mongoose').model('User');
var FacebookTokenStrategy = require('passport-facebook-token');

module.exports = function () {
    passport.use(new FacebookTokenStrategy({
            clientID: '443534076456---',
            clientSecret: 'd9c12cd1c8c7fcea7abb391a0bbb---'
        },
        function (accessToken, refreshToken, profile, done) {
            User.upsertFbUser(accessToken, refreshToken, profile, function(err, user) {
                return done(err, user);
            });
        }));
};

下面是主服务器文件:

代码语言:javascript
复制
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const passport = require('passport');
const path = require('path');
const users = require('./routes/api/users');
const cors = require('cors');

const app = express();
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
var corsOption = {
    origin: true,
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
    credentials: true,
    exposedHeaders: ['x-auth-token']
};
app.use(cors());


// const db = require('./config/keys').mongoURI;
// mongoose.connect("mongodb://user1:Voodoo12@ds263146.mlab.com:63146/fb-login-chat").then(()=> console.log('MongoDb Connected'))
// .catch(err=> console.log(err));
app.use(express.static(path.join(__dirname, 'public')));
app.use(passport.initialize());
app.use(passport.session());
app.use('/api/users', users);

//serve static assets if in production
// if(process.env.NODE_ENV === 'production'){
//   //Set a static folder
//   app.use(express.static('client/build'))
//   app.get('*', (req, res)=>{
//     res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
//   });
// }

const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Server running on port ${port}`));
EN

回答 1

Stack Overflow用户

发布于 2019-06-17 04:29:35

我认为您的API无法解码有效负载并提取访问令牌

尝试在请求的选项中添加标头

代码语言:javascript
复制
const options = {
    method: 'POST',
    body: token,
    mode: 'cors',
    cache: 'default',
    // add headers
    headers: { 'Content-type': 'application/json' }
};

致以敬意,MA

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56368962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档