Социальный вход на странице регистрации для 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
}
}
}));
Надеюсь, это поможет! Это, конечно, может быть проще, это хороший запрос для библиотеки.