javascript - 在用户通过 Facebook 进行身份验证后,如何表明用户已通过身份验证?

标签 javascript node.js passport.js passport-facebook

我正在关注this教程,使用 Node 和 Passport 实现 Facebook 身份验证。

教程和 docs说要这样做:

router.get('/auth/facebook/callback',
  passport.authenticate('facebook', {
    successRedirect: '/',
    failureRedirect: '/login'
  })
);

但是用户如何知道他们是否通过了身份验证呢?我想将数据发送到我的前端,显示用户是否已登录,并且我可以用它来更新,比如我的导航栏。

据我了解,Facebook 身份验证的过程是这样的:

  1. 发送 GET/auth/facebook 请求。
  2. 命中路线。
  3. 304 重定向 将 URL 发送回 Facebook 门户。
  4. 向 Facebook 门户发送带有回调网址的请求。
  5. 用户在门户上点击“接受”。
  6. Facebook 发回 304 重定向,其中网址为您的回调网址。
  7. 请求将发送到您的回调网址,在本例中为 GET/auth/facebook/callback
  8. passport.use(obj, cb)cb 开始运行。
  9. 发回 304 重定向,网址为 //login,具体取决于成功或失败。
  10. 请求发送至 //login

我不确定如何使用登录用户更新我的前端。

router.get('/auth/facebook/callback',
  passport.authenticate('facebook'),
  function(req, res) {
    var userCopy = JSON.parse(JSON.stringify(req.user));
    delete userCopy.auth;
    res.status(200).json(userCopy);
  }
);

这不起作用,因为没有 $http.get().then() 接收数据。

<小时/>

我尝试添加一些查询参数:

successRedirect: '/?foo=bar'

但这对我不起作用。网址栏显示 http://localhost:3000/?foo=bar#_=_ 并且这不会记录任何内容:

app.get('/*', function(req, res) {
  var url = path.resolve(__dirname + '/../client/' + envFolder + '/index.html');
  res.sendFile(url, null, function(err) {
    if (err) {
      return res.status(500).send(err);
    }
    console.log('here');
    console.log(req.query);
    return res.status(200).end();
  });
});

当我执行 successRedirect: '/home?facebook=true' 时,它会起作用。但在 sendFile 内部,我无法发回任何其他内容。如果我尝试 res.send('Authenticated with Facebook') ,则会出现以下错误:错误:发送后无法设置 header 。。大概是因为 sendFile 正在发回文件并设置一些 header ,然后然后我尝试使用不同的 header 发送回其他内容。所以我不知道该怎么办。

<小时/>

我找到的方法是使用 run block :

function run($http, Session, $cookies) {
  $http
    .get('/current-user')
    .then(function(response) {
      Session.setUser(response.data);
      $cookies.put('userId', response.data._id);
    })
  ;
}
  1. 我不确定这是否是最好的方法。
  2. 它搞乱了我的测试,因为它们并不期待 HTTP 请求,并且当我并不总是想这样做时它会设置 session 和 cookie。

最佳答案

您可以在 View 中渲染用户对象,这样您就可以通过 Angular 检查变量是否存在来获取它:

router.get('/auth/facebook/callback',
  passport.authenticate('facebook'),
  function(req, res) {
    var userCopy = JSON.parse(JSON.stringify(req.user));
    delete userCopy.auth;
    res.status(200).render('index', {user: userCopy});
  }
);

您的 HTML 索引文件应包含:

<!--Embedding The User Object-->
<script type="text/javascript">
    var user = <%= user | json | safe %>;
</script>

最后你的 AngularJS 应用应该有这样的服务:

// Authentication service for user variables
angular.module('users').factory('Authentication', [

    function() {
        var _this = this;

        _this._data = {
            user: window.user
        };

        return _this._data;
    }
]);

在主 Controller 中注入(inject)身份验证服务并使用用户对象:

angular.module('core').controller('MainController', ['$scope', 'Authentication',
    function ($scope, Authentication) {
        $scope.authentication = Authentication;
    }
]);

关于javascript - 在用户通过 Facebook 进行身份验证后,如何表明用户已通过身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32029339/

相关文章:

javascript - 按年龄功能的价格折扣

javascript - 组合 react 组件

javascript - 子域中的 JS Assets 不会在 ff & ie 上加载,但 chrome 一切都很好

javascript - 错误: Can't set headers after they are sent - Correctly handling an error in an express controller

javascript - 无法读取未定义的属性 '_header'

javascript - Passport-github js,用户代理错误

javascript - 如何创建像 Stack Overflow 那样的视觉差异 View ?

javascript - 在查找中更新文档

node.js - NodeJS ExpressJS PassportJS - 仅用于管理页面

node.js - 使用 Jasmine 测试 Express/Passport 中间件——passport.authenticate 永远不会完成