当前位置: 首页 > 面试题库 >

在Node.js Passport的Google策略上自定义returnUrl

吴山
2023-03-14
问题内容

我正在使用Express和Passport OpenID
Google策略,我想在每个身份验证请求上设置returnURL以便能够返回到发起该身份验证的页面。

情况是,我有带有Node.js后端的HTML5幻灯片应用程序(以及社交内容和编辑器以及Portal和扩展…
https://github.com/bubersson/humla),并且我希望能够登录用户一些幻灯片(通过幻灯片菜单…),然后我希望他轻松返回同一张幻灯片。

所以我需要这样的东西吗?

app.get('/auth/google', function(req,res) {
   var cust = "http://localhost:1338/"+req.params.xxx;
   passport.authenticate('google', returnURL:cust, function ...
}

我已经阅读过Passport的指南,但仍然不知道该怎么做。我知道这样做并不安全,但是我还能怎么做?

或者如何使应用程序返回到已启动html" target="_blank">登录的页面?还是有一种方法可以使用AJAX进行OpenID身份验证(并且仍然能够使用护照)?


问题答案:

我已经为我的应用程序Twitter身份验证弄清楚了这一点,我确信GoogleStrategy非常相似。尝试这样的变体:

假设您已经定义了来自身份验证服务的回调路由(从护照指南中),如下所示:

app.get('/auth/twitter/callback',
  passport.authenticate('twitter', {
      successRedirect: authenticationRedirect(req, '/account')
    , failureRedirect: '/'
  })
);

只需将该块更改为:

app.get('/auth/twitter/callback', function(req, res, next){
  passport.authenticate('twitter', function(err, user, info){
    // This is the default destination upon successful login.
    var redirectUrl = '/account';

    if (err) { return next(err); }
    if (!user) { return res.redirect('/'); }

    // If we have previously stored a redirectUrl, use that, 
    // otherwise, use the default.
    if (req.session.redirectUrl) {
      redirectUrl = req.session.redirectUrl;
      req.session.redirectUrl = null;
    }
    req.logIn(user, function(err){
      if (err) { return next(err); }
    });
    res.redirect(redirectUrl);
  })(req, res, next);
});

现在,为经过身份验证的路由定义中间件,以将原始URL存储在会话中,如下所示:

ensureAuthenticated = function (req, res, next) {
  if (req.isAuthenticated()) { return next(); }

  // If the user is not authenticated, then we will start the authentication
  // process.  Before we do, let's store this originally requested URL in the
  // session so we know where to return the user later.

  req.session.redirectUrl = req.url;

  // Resume normal authentication...

  logger.info('User is not authenticated.');
  req.flash("warn", "You must be logged-in to do that.");
  res.redirect('/');
}

作品!



 类似资料:
  • 用于自定义设置隐藏虚拟机、镜像菜单功能以及配置第三方回调地址。 策略定义用于定义策略的具体内容,如设置隐藏虚拟机、系统镜像菜单功能以及配置第三方回调地址等。策略配置完成后,还需要将策略分配到具体项目、域或全局,策略分配成功后将出现在策略分配列表。即策略在具体的应用范围内才会生效。当策略在不同应用范围内有冲突时,最小应用范围的策略生效。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击

  • 自定义选项将使用默认策略,即简单地覆盖已有值。如果想让自定义选项以自定义逻辑合并,可以向Vue.config.optionMergeStrategies添加一个函数: Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) { // return mergedVal } 对于大多数对象选项,可以使用meth

  • 我正在尝试使用此示例中指定的id_token_hint参数从JWT令牌传递姓氏、givenName和displayName声明:https://github.com/azure-ad-b2c/samples/tree/master/policies/invite 我遵循了与本文中指定的步骤类似的步骤:Azure Active Directory B2C自定义邀请策略-在步骤之间传递自定义声明 我的

  • 我计划使用infinispan作为我的Hibernate应用程序二级缓存。My all entities具有生命周期属性[新建- 简单地说,当实体生命周期属性状态到达已完成状态时,我想从缓存中驱逐实体。据我所知,Infinispan不支持自定义驱逐策略。处理我的情况的最佳方式是什么?

  • 问题内容: 我尝试使用Swift 4.1的新功能在JSON解码期间将蛇案转换为camelCase。 这是示例: 我需要提供习惯,因为该策略无法推断首字母缩略词或首字母缩写(例如)的大小写,但我希望该策略仍然适用。但是,解码器会引发错误(“与键CodingKeys无关的值”),看来我不能同时使用策略和自定义。我想念什么吗? 问题答案: (和)的密钥策略适用于有效负载中的所有密钥,包括您为其提供自定义

  • 从库伯内特斯v1.18开始,v2beta2 API允许通过水平Pod Autoscalar(HPA)行为字段配置缩放行为。我计划将具有自定义指标的HPA应用于StatefulSet。 我正在查看的用例是使用自定义指标(例如,我的应用程序上的用户会话数量)进行扩展,但HPA根本不会缩减。K8s SIG-Autoscaling增强功能也描述了此用例-“HPA的可配置缩放速度 用户会话可以在几分钟到几小