我一直在我的服务器上使用Passport进行用户身份验证.当用户登录本地(使用用户名和密码),服务器就给他们一个JWT存储在本地存储,并且被发送回服务器,每个API调用需要用户身份验证.
现在我也想支持Facebook和Google登录.自从我开始使用Passport后,我认为最好继续使用Passport策略,使用passport-facebook和passport-google-oauth.
我将参考Facebook,但两种策略的行为都相同.它们都需要重定向到服务器路由('/ auth/facebook'和'/ auth/facebook/callback').该过程是成功的,以保存用户,包括他们的Facebook \谷歌ID和令牌上的令牌.
在服务器上创建用户时,会创建一个JWT(不依赖于从facebook\google收到的令牌).
... // Passport facebook startegy
var newUser = new User();
newUser.facebook = {};
newUser.facebook.id = profile.id;
newUser.facebook.token = token; // token received from facebook
newUser.facebook.name = profile.displayName;
newUser.save(function(err) {
if (err)
throw err;
// if successful, return the new user
newUser.jwtoken = newUser.generateJwt(); // JWT CREATION!
return done(null, newUser);
});
Run Code Online (Sandbox Code Playgroud)
问题是,在创建之后,我找不到将JWT发送到客户端的正确方法,因为我还应该重定向到我的应用程序.
app.get('/auth/facebook/callback',
passport.authenticate('facebook', {
session: false,
successRedirect …Run Code Online (Sandbox Code Playgroud) 我正在使用react-redux,并向我的redux状态添加了一个“过滤器”字段,其中包含我想要用于从数据库接收数据的所有过滤器。
我的目标是在添加过滤器后立即使用更新的过滤器从数据库接收数据。这是我到目前为止得到的:
--- actions.js ---
...
export function addFilter(filter, value) {
return {
type: 'ADD_FILTER',
filter: filter,
value: value
}
}
...
Run Code Online (Sandbox Code Playgroud)
---reducer.js ---
...
case 'ADD_FILTER':
return update(state, {
filters: {
$merge: {
[action.filter]: action.value
}
}
});
...
Run Code Online (Sandbox Code Playgroud)
---过滤组件.js ---
...
addFilterAndUpdateData(filter, value) {
this.props.addFilter(filter, value);
this.props.getData(this.props.filters);
// this.props.filters is connected to state.filters.
// it DOES update, but not right away. so when getData is dispatched
// this.props.filters holds the old object and not the updated …Run Code Online (Sandbox Code Playgroud)