不同港口的本地护照授权

时间:2016-06-06 08:05:35

标签: express angular passport.js express-session

我有一个在端口5000上运行的node.js应用程序,我使用passport.js作为授权。我通过帖子请求授权用户,我使用自定义回调:

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未定义。我使用快速会话来存储授权用户。

当我部署时,我将两个应用程序捆绑在一起,所以一切正常。

对于这个问题,有没有人有一个好的和简单的解决方案?再次,它只是在开发中我有这个问题。

3 个答案:

答案 0 :(得分:4)

您可以隐藏代理服务器后面的两个服务,例如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 :(得分:0)

我认为您有跨域问题,因为您在不同的端口上运行。

此问题已经讨论过,我相信您可以在此处找到解决方案:Passport js fails to maintain session in cross-domain

简而言之,您需要将服务器配置为发送重新标准的标头,以允许跨域共享访问标头。

答案 2 :(得分:0)

如果您的Web应用程序和API在不同的端口上运行,那么使用护照进行身份验证,我们可以尝试这种方法

  • 从网络应用(localhost:300)上单击socialAuth Button,使用window.open函数直接调用护照API(localhost:5000 / auth / google)
  • 完成身份验证后,回调URL将再次访问API端口(localhost:5000 / auth / google / callback)
  • 现在在回调中,我们有必须发送到Web应用程序(端口3000)的用户信息,请使用套接字编程来实现。
  • refer this with example