Stormpath注册页面上的社交登录

时间:2016-05-06 14:06:29

标签: javascript node.js express stormpath express-stormpath

我真的希望这是关于Stormpath API的最后一个问题。从C#和PHP切换到节点有点挑战。

我正在尝试在注册页面上实现社交登录。预建选项仅将其放在“登录”页面上。

渲染页面并向Jade视图添加元素很简单,但我需要获得oauthStateToken。现在我看一下login.js代码如何做到这一点:

        var oauth = require('../oauth');        
        var oauthStateToken = oauth.common.resolveStateToken(req, res);
        var formActionUri = (config.web.login.uri + (nextUri ? ('?next=' + nextUri) : ''));

        var hasSocialProviders = _.some(config.web.social, function (socialProvider) {
          return socialProvider.enabled;
        });

        extend(options, {
          form: form,
          formActionUri: formActionUri,
          oauthStateToken: oauthStateToken,
          hasSocialProviders: hasSocialProviders
        });

所以基本上它调用了誓言文件并通过代码,理论上,我可以在register.js上做类似的事情 - 本质上(只是示例代码):

    var oauth = require('../oauth');
    var _ = require('lodash');
    var hasSocialProviders = _.some(config.web.social, function (socialProvider) {
          return socialProvider.enabled;
    });
    var oauthStateToken = '';
    if (hasSocialProviders) {
          oauthStateToken = oauth.common.resolveStateToken(req, res);
    }

    helpers.render(req, res, view, {
        form: helpers.sanitizeFormData(req.body),
        formModel: viewModel.form
        oauthStateToken : oauthStateToken,
        hasSocialProviders: hasSocialProviders
    });

但是我当然不想干涉核心文件,并且正在考虑创建一个类似app.use('/register', callFunction, router);的中间件函数,但我在构思它的工作原理时遇到了一些困难。我似乎理解stormpath如何让我生成一个oauth令牌,我使用JWT将其存储为cookie,但我很难将它们整合到工作代码中,而无需复制库中已存在的大量代码。

我甚至可以通过使用REST API来实现它,但我想在express-stormpath库中使用它。因此,在express-stormpath库的上下文中的一些解释也将具有启发性。或者我是否过度思考这个问题,我是否只需要对库进行分叉,对register.js进行更改并尝试向上游推送?

再次感谢大家,

1 个答案:

答案 0 :(得分:1)

感谢您的提问!

我找到了一种在您的应用程序中解决此问题的方法,而无需修改express-stormpath库。您需要为注册路由添加路由处理程序,并且在该路由处理程序中,您必须手动执行工作以获取oAuthStateToken设置,然后调用next()以使快速存储继续处理注册页面的请求。这是看起来像:

var cookieParser = require('cookie-parser');
var oauth = require('express-stormpath/lib/oauth');

// create your express server, 'app'

app.use('/register', cookieParser(), function (req, res, next) {
  var oauthStateToken = oauth.common.resolveStateToken(req, res);
  req.app.get('stormpathConfig').templateContext = {
    oauthStateToken: oauthStateToken
  };
  next();
});

app.use(stormpath.init(app, {
  // .. other config options
  web: {
    register: {
      view: 'views/register.jade'  // path to your custom registration file
    }
  }
}));

我希望这有帮助!这当然可以更容易,这是对库的一个很好的功能请求。