2016-05-06 3 views
2

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

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

Оказание страницы и добавление элементов в представление 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. Таким образом, некоторое объяснение в контексте библиотеки экспресс-штурма также будет полезным. ИЛИ я переусердствую это, должен ли я просто разветвить библиотеку, внести изменения в register.js и попытаться нажать вверх по течению?

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

ответ

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

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

+0

Эй, так yep - я пробовал что-то подобное, но было нехорошо ссылаться на функции в библиотеке (в частности, на библиотеку oauth напрямую, а не на документально подтвержденный API). Я попробую и посмотрю отчет. Я также разблокирую код и попробую сделать запрос с вами (не стесняйтесь снижаться, поскольку вы, вероятно, подумали о лучших способах его выполнения). Это похоже на достаточно распространенный случай использования, когда вы хотите убедиться, что ваши пользователи знают, что им не нужно регистрироваться и могут просто входить в систему напрямую с помощью социальных входов. Также спасибо! Вы, ребята, чемпионы. –

+0

Две вещи, которые мне пришлось изменить: 'oauthStateToken' вместо' oAuthStateToke' И 'app.use' вместо' app.get' - хотя я не думаю, что это имеет значение в этом случае вообще. Еще раз спасибо! –

+0

Спасибо за ответ, я исправил пример соответственно.Я рад, что вы смогли заставить его работать :) – robertjd

Смежные вопросы