不同端口的本地通行证授权

11

我有一个运行在端口号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存储授权用户。

当我部署时,将两个应用程序捆绑在一起,所有内容都可以正常工作。

有人对此问题有好的简单解决方案吗?再次强调,这只是在开发过程中我遇到的问题。


为什么这些东西在你的开发环境中不能“一起运行”? - m02ph3u5
我正在使用Angular 2 cli,不知道是否可以使用自己的节点作为服务器,并如何设置它。 - DNRN
3个回答

7
你可以用代理隐藏两个服务,例如使用 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将会被发送到前端服务,而所有请求http://example.com/api/将会被发送到后端服务。


1
一个小例子会提升你答案的质量。 - m02ph3u5
这正是我在寻找的!谢谢! - DNRN

2
如果您的Web应用程序和API运行在不同的端口上,那么在使用Passport进行身份验证时,我们可以尝试以下方法:
  • 在Web应用程序(localhost:3000)中单击socialAuth按钮时,使用window.open函数直接调用Passport API(localhost:5000/auth/google)
  • 一旦完成身份验证,回调URL将再次命中API端口(localhost:5000/auth/google/callback)
  • 现在,在回调中,我们有用户信息必须发送到Web应用程序(端口3000),使用socket编程来实现这一点。
  • 请参考此示例

0

我认为你遇到了跨域问题,因为你在不同的端口运行。

这个问题已经被讨论过了,我相信你可以在这里找到解决方案:Passport js fails to maintain session in cross-domain

简而言之,你需要配置你的服务器发送适当的头文件,以允许跨域共享访问头文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接