reactjs - Google OAuth 2.0 无法在生产环境中登录/注销
问题描述
登录/注销功能在开发中完美运行。但是,在将其部署到 heroku 之后,浏览器会缓存数据并保持登录状态,而注销按钮只会刷新页面。我可以清除浏览器缓存数据,它可以让我正确登录,但同样的情况继续发生。有时反之亦然,登录按钮会刷新页面。我不确定我做错了什么。请提前帮助和感谢!
我对使用护照还是很陌生,这里是相关代码:
我的 index.js
app.use(
cookieSession({
maxAge: 24 * 60 * 60 * 1000, // cookies expire in 1 day
keys: [keys.cookieKey]
})
);
app.use(passport.initialize());
app.use(passport.session());
我的护照.js
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id).then(user => done(null, user));
});
passport.use(
new GoogleStrategy(
{
clientID: keys.googleClientID,
clientSecret: keys.googleClientSecret,
callbackURL: '/auth/google/callback',
proxy: true
},
(accessToken, refreshToken, profile, done) => {
User.findOne({ googleId: profile.id }).then(user => {
if (user) {
return done(null, user);
new User({ googleId: profile.id })
.save()
.then(user => done(null, user));
}
});
}
)
);
我的 authRoutes.js
module.exports = app => {
app.get(
'/auth/google',
passport.authenticate('google', {
scope: ['profile', 'email']
})
);
app.get(
'/auth/google/callback',
passport.authenticate('google'),
(req, res) => {
res.redirect('/');
}
);
app.get('/api/logout', (req, res) => {
req.logout();
req.session = null;
res.redirect('/');
});
app.get('/api/current_user', (req, res) => {
res.send(req.user);
});
};
解决方案
这个问题是因为与 Create-React-App 一起打包的 service worker。它拦截 /api 路由并将其发送到 React-Router,换句话说,它不会被 Express 处理。
现在这一切都假设您实际上正在使用 Create-React-App。
在您的客户端主 index.js
import { unregister } from './registerServiceWorker';
然后在 render() 之前调用该函数。
unregister();
ReactDOM.render(
<Provider store={store}>
<App/>
</Provider> ,
document.getElementById('root'));
确保清除缓存并在浏览器上硬重新加载。缓存可能会在 24 小时后失效。
希望这可以帮助!
推荐阅读
- java - 嵌入式列表 Java Spring 的问题
- python - Python - Plotly - 子图中散点图顶部的指示器
- azure - Cosmos DB:不支持可重试写入。请通过指定禁用可重试写入
- html - 在两个 div 之间添加空格
- string - 任何人都可以在这个 Assembly Risc-v 实验室中帮助我吗
- c++ - C++ 试图将地址转换为 void* 并分配给函数指针(以便我的引导加载程序可以跳转到实际的应用程序)
- javascript - 使用数组替换字符串将 JSON 数据转换为 JSON 数据
- wordpress - 用两个预先存在的块制作古腾堡块
- pytorch - 无法微调预训练的 Bert 模型
- r - 对具有 R 中条件的行的值求和