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

Я действительно надеюсь, что это мой последний вопрос об API Stormpath на какое-то время. Переход с C# и PHP на Node был довольно сложным.

Я пытаюсь реализовать социальный вход на странице регистрации. Предварительно созданный вариант размещает его только на странице входа.

Отображение страницы и добавление элементов в представление 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 и попытаться выполнить толчок вверх по течению?

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


person Omar Mir    schedule 06.05.2016    source источник


Ответы (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
    }
  }
}));

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

person robertjd    schedule 06.05.2016
comment
Эй, да, я пробовал что-то подобное, но мне показалось не очень хорошей идеей ссылаться на такие функции в библиотеке (в частности, на библиотеку oauth напрямую, а не через документированный API). Я попробую и посмотрю отчет. Я также разветвлю код и попробую сделать запрос на вытягивание вместе с вами, ребята (не стесняйтесь отказываться, так как вы, вероятно, думали о лучших способах сделать это). Это кажется достаточно распространенным случаем использования, когда вы хотите, чтобы ваши пользователи знали, что им не нужно регистрироваться, и они могут просто войти в систему напрямую с социальными логинами. Также спасибо! Вы, ребята, чемпионы. - person Omar Mir; 06.05.2016
comment
Две вещи, которые мне пришлось изменить: oauthStateToken вместо oAuthStateToke и app.use вместо app.get - хотя я не думаю, что в данном случае это вообще имеет значение. Спасибо еще раз! - person Omar Mir; 07.05.2016
comment
Спасибо за ответ, я исправил пример соответствующим образом. Я рад, что вы смогли заставить его работать :) - person robertjd; 07.05.2016
comment
Почти работает - если вы посещаете страницу регистрации, используете социальный вход, а затем посещаете страницу входа, тогда страница входа перестает работать с Invalid state token provided. - поэтому я сравнил ее с моей более ранней модификацией ветки основных файлов, которая не работала - так что, может быть, что-то о том, чтобы установить его как templateContext? - person Omar Mir; 07.05.2016