通过会话(React + Express)在不同应用程序之间进行身份验证?
Authentication between different applications through sessions (React + Express)?
我正在开发一个 React + Express 网站,我对如何实现登录功能有疑问,因为它依赖于另一个应用程序。让我解释一下:
- 有一个系统(应用程序 1),用户可以在其中创建自己的帐户
- 用户登录系统后,他们可以单击将他们重定向到网站的按钮
- 当在系统(app 1)中点击按钮时,它会向网站后端(app 2)发出 POST 请求,将加密的用户凭据发送到端点
我设法从网站后端的系统中获取了发布的数据,但现在我不确定如何pass/get将这些数据传送到前端。我正在考虑这样做:
- 一旦后端(app 2)从系统(app 1)接收到用户数据,它就会创建一个隐藏用户数据(仍然加密)的会话
- 创建会话后,后端重定向到前端(应用程序 3)
- 前端(app 3)向后端(app 2)发出请求,以获取存储在会话中的所需数据(基本上是用户名)
我是后端主题的新手,所以虽然我认为这种方法可行,但我不确定这是否是一个好方法。
感谢任何可以提供反馈和想法的人,如有必要,我愿意提供更多信息。
在创建用户后端时,您可以创建一个 auth
路由器,负责让用户登录和创建用户。
authRouter.post('/signup', async (req, res, next) => {
const { username, email, password: plainTextPassword } = req.body;
然后在创建 login/signup 时,您将创建一个 token
,它将所有用户信息存储在字母和数字的组合中。这是由名为 jsonwebtoken 的包创建的。示例如下:
const newUser = await User.create(user)
token = jwt.sign(
{
_id: newUser._id,
username: newUser.username,
email: newUser.email,
type: 'user',
},
process.env.SECRET,
{ expiresIn: '24h' }
);
return res.status(201).send({ token, newUser })
注意我没有发送他们的密码。
然后当您收到回复时,我假设您使用的是 axios,您可以在 localStorage
中设置令牌。
const storeUser = ({ userObj: user, token }) => {
localStorage.setItem('user', JSON.stringify(user));
localStorage.setItem('token', token);
};
const login = (credentials) => {
axios
.post('/auth/login', credentials)
.then((response) => {
storeUser(response.data);
}.catch (error) { console.error(error) }
}
这就是它的基础知识。查看 jsonwebtoken,如果您正在寻找额外的安全性 bcrypt 来保护密码。
根据您的描述,您应该能够通过一个额外的步骤完成上述所有操作,查看 socket.io 应该可以让您开始实施我刚才描述的内容,但是有两个应用程序,它们只需要能够沟通。只需创建令牌,然后将其发送到您的第二个应用程序。 Socket.io 是您的解决方案。
从尝试应用@Dylan 的建议开始,我一直在搜索并了解到我是从错误的角度看问题。我在考虑我的前端和后端是两个独立的东西。
我的后端运行宁在端口 5000 上,前端在端口 3000 上,所以每当我尝试将一些授权 header 或 cookie 从我的后端传递到我的前端时,它们都会被擦除,因为域正在更改。
socket.io 方法也不起作用,因为我没有在不同的地方同时打开“应用程序 1”和“应用程序 3”(我确定可能有socket.io 的方法,但我没有设法做到)。
所以,一旦我了解了 HTTP 请求的那些基本概念,我做的第一件事就是 运行 网站的前端和后端都在同一个端口(我将在这里分享教程一旦我找到它)。有了这个,我就可以从后到前传递令牌和 cookie,反之亦然。
最终我在 Next.js 重建了我的网站并使用 cookies 来保持登录!
我正在开发一个 React + Express 网站,我对如何实现登录功能有疑问,因为它依赖于另一个应用程序。让我解释一下:
- 有一个系统(应用程序 1),用户可以在其中创建自己的帐户
- 用户登录系统后,他们可以单击将他们重定向到网站的按钮
- 当在系统(app 1)中点击按钮时,它会向网站后端(app 2)发出 POST 请求,将加密的用户凭据发送到端点
我设法从网站后端的系统中获取了发布的数据,但现在我不确定如何pass/get将这些数据传送到前端。我正在考虑这样做:
- 一旦后端(app 2)从系统(app 1)接收到用户数据,它就会创建一个隐藏用户数据(仍然加密)的会话
- 创建会话后,后端重定向到前端(应用程序 3)
- 前端(app 3)向后端(app 2)发出请求,以获取存储在会话中的所需数据(基本上是用户名)
我是后端主题的新手,所以虽然我认为这种方法可行,但我不确定这是否是一个好方法。
感谢任何可以提供反馈和想法的人,如有必要,我愿意提供更多信息。
在创建用户后端时,您可以创建一个 auth
路由器,负责让用户登录和创建用户。
authRouter.post('/signup', async (req, res, next) => {
const { username, email, password: plainTextPassword } = req.body;
然后在创建 login/signup 时,您将创建一个 token
,它将所有用户信息存储在字母和数字的组合中。这是由名为 jsonwebtoken 的包创建的。示例如下:
const newUser = await User.create(user)
token = jwt.sign(
{
_id: newUser._id,
username: newUser.username,
email: newUser.email,
type: 'user',
},
process.env.SECRET,
{ expiresIn: '24h' }
);
return res.status(201).send({ token, newUser })
注意我没有发送他们的密码。
然后当您收到回复时,我假设您使用的是 axios,您可以在 localStorage
中设置令牌。
const storeUser = ({ userObj: user, token }) => {
localStorage.setItem('user', JSON.stringify(user));
localStorage.setItem('token', token);
};
const login = (credentials) => {
axios
.post('/auth/login', credentials)
.then((response) => {
storeUser(response.data);
}.catch (error) { console.error(error) }
}
这就是它的基础知识。查看 jsonwebtoken,如果您正在寻找额外的安全性 bcrypt 来保护密码。
根据您的描述,您应该能够通过一个额外的步骤完成上述所有操作,查看 socket.io 应该可以让您开始实施我刚才描述的内容,但是有两个应用程序,它们只需要能够沟通。只需创建令牌,然后将其发送到您的第二个应用程序。 Socket.io 是您的解决方案。
从尝试应用@Dylan 的建议开始,我一直在搜索并了解到我是从错误的角度看问题。我在考虑我的前端和后端是两个独立的东西。
我的后端运行宁在端口 5000 上,前端在端口 3000 上,所以每当我尝试将一些授权 header 或 cookie 从我的后端传递到我的前端时,它们都会被擦除,因为域正在更改。
socket.io 方法也不起作用,因为我没有在不同的地方同时打开“应用程序 1”和“应用程序 3”(我确定可能有socket.io 的方法,但我没有设法做到)。
所以,一旦我了解了 HTTP 请求的那些基本概念,我做的第一件事就是 运行 网站的前端和后端都在同一个端口(我将在这里分享教程一旦我找到它)。有了这个,我就可以从后到前传递令牌和 cookie,反之亦然。
最终我在 Next.js 重建了我的网站并使用 cookies 来保持登录!