不同口岸的本地护照授权
Local passport authorization on different ports
我在端口 5000 上有一个 node.js 应用程序 运行,我在其中使用 passport.js 作为授权。我通过 post 请求授权用户,我在其中使用自定义回调:
this.router.post('/member/login', (req, res, next) => {
passport.authenticate('local', (err, member, info) => {
if (err) res.json(400).json({message: "An error ocurred"});
if (!member) {
console.log("No member found!");
return res.status(409).json({message: "No member found!"})
}
req.logIn(member, (err) => {
if (err) {
console.log(err);
return res.status(400).json({message: "An error ocurred"});
}
return res.json(member);
});
})(req, res, next);
});
这很好用,但是当我在本地开发时,我有一个前端 Angular2 应用程序,它在不同的端口 (4200) 上运行,所以在我的开发中我无法获得授权用户:req.user未定义。我用express-session来存储授权用户。
部署时,我将两个应用程序捆绑在一起,因此一切正常。
有没有人有解决此问题的简单好方法?同样,它只是在开发中我遇到了这个问题。
您可以将这两个服务隐藏在代理之后,例如 Nginx。您的两个服务都将使用 1 个地址。
NGINX 配置示例
server {
listen 80;
server_name example.com;
proxy_set_header Host $http_host;
proxy_pass_header Server;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
location / {
proxy_pass http://frontend_address:port;
proxy_redirect default;
}
location ~ /api {
proxy_pass http://backend_address:port;
proxy_redirect default;
}
}
因此所有请求 http://example.com will go to frontend service, and all requests http://example.com/api/ 都转到后端服务。
我认为您遇到了 cross-domain 问题,因为您 运行 在不同的端口上。
这个问题已经讨论过了,相信你可以在这里找到解决办法:Passport js fails to maintain session in cross-domain
简而言之,您需要配置服务器以发送适当的 headers 以允许 cross-domain 共享访问权限 headers。
如果您的网络应用程序和 API 运行 在不同的端口,那么为了使用 passport 进行身份验证,我们可以尝试这种方法
- onClick of socialAuth Button from web app (localhost:300) 使用 window.open 函数直接调用 passport API (localhost:5000/auth/google)
- 身份验证完成后,回调 URL 将再次命中 API 端口 (localhost:5000/auth/google/callback)
- 现在在回调中,我们有必须发送到网络应用程序(端口 3000)的用户信息,使用套接字编程来实现。
- refer this with example
我在端口 5000 上有一个 node.js 应用程序 运行,我在其中使用 passport.js 作为授权。我通过 post 请求授权用户,我在其中使用自定义回调:
this.router.post('/member/login', (req, res, next) => {
passport.authenticate('local', (err, member, info) => {
if (err) res.json(400).json({message: "An error ocurred"});
if (!member) {
console.log("No member found!");
return res.status(409).json({message: "No member found!"})
}
req.logIn(member, (err) => {
if (err) {
console.log(err);
return res.status(400).json({message: "An error ocurred"});
}
return res.json(member);
});
})(req, res, next);
});
这很好用,但是当我在本地开发时,我有一个前端 Angular2 应用程序,它在不同的端口 (4200) 上运行,所以在我的开发中我无法获得授权用户:req.user未定义。我用express-session来存储授权用户。
部署时,我将两个应用程序捆绑在一起,因此一切正常。
有没有人有解决此问题的简单好方法?同样,它只是在开发中我遇到了这个问题。
您可以将这两个服务隐藏在代理之后,例如 Nginx。您的两个服务都将使用 1 个地址。
NGINX 配置示例
server {
listen 80;
server_name example.com;
proxy_set_header Host $http_host;
proxy_pass_header Server;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
location / {
proxy_pass http://frontend_address:port;
proxy_redirect default;
}
location ~ /api {
proxy_pass http://backend_address:port;
proxy_redirect default;
}
}
因此所有请求 http://example.com will go to frontend service, and all requests http://example.com/api/ 都转到后端服务。
我认为您遇到了 cross-domain 问题,因为您 运行 在不同的端口上。
这个问题已经讨论过了,相信你可以在这里找到解决办法:Passport js fails to maintain session in cross-domain
简而言之,您需要配置服务器以发送适当的 headers 以允许 cross-domain 共享访问权限 headers。
如果您的网络应用程序和 API 运行 在不同的端口,那么为了使用 passport 进行身份验证,我们可以尝试这种方法
- onClick of socialAuth Button from web app (localhost:300) 使用 window.open 函数直接调用 passport API (localhost:5000/auth/google)
- 身份验证完成后,回调 URL 将再次命中 API 端口 (localhost:5000/auth/google/callback)
- 现在在回调中,我们有必须发送到网络应用程序(端口 3000)的用户信息,使用套接字编程来实现。
- refer this with example