Социальный вход на странице регистрации для Stormpath

Я действительно надеюсь, что это мой последний вопрос по API Stormpath. Переход от 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-токен, который я сохраняю в виде cookie-файла, используя JWT, но мне трудно собрать его в рабочий код без репликации большого количества кода, уже существующего в библиотеке.

Я даже могу заставить его работать, используя REST API, но я бы хотел использовать его в библиотеке express-stormpath. Таким образом, некоторое объяснение в контексте библиотеки express-stormpath также будет полезным. ИЛИ Я обдумываю это, я должен просто разветвлять библиотеку, вносить изменения в register.js и пробовать push upstream?

Еще раз спасибо, ребята,

1 ответ

Спасибо за вопрос!

Я нашел способ обойти это в вашем приложении, не изменяя библиотеку express-stormpath. Вам нужно будет добавить обработчик маршрута для вашего регистрационного маршрута, и в этом обработчике маршрута вам придется вручную выполнить работу, чтобы получить oAuthStateToken настройте, затем позвоните next() позволить express-stormpath продолжить обработку запроса на страницу регистрации. Вот как это выглядит:

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
    }
  }
}));

Надеюсь, это поможет! Это, конечно, может быть проще, это хороший запрос для библиотеки.

Другие вопросы по тегам