首页 文章

使用Passport进行身份验证Facebook Express create-react-app React-Router代理

提问于
浏览
16

TLDR:如何从我的React应用程序中的页面启动Facebook Auth进程?

我发现很多帖子都涉及我在这篇文章 Headers 中列出的大部分内容,但不是全部内容 . 而且我非常接近让这个工作,但必须有一些我缺少的东西 .

我的应用程序包含一个使用react-router进行路由的create-react-app前端 . 我在开发环境中运行端口51000 . 在package.json中,我使用“proxy”将其他路由重定向到我的快速服务器,在端口51001上运行 . 这通常用于在我的React组件中发出命中服务器的请求 . 例如:

axios.get('/api/some-stuff')

在我的React组件中调用时,这将成功命中我的Express服务器 .

我想确保我的后端路由经过身份验证,我选择通过passport-facebook使用Facebook身份验证 . 我设置它就像我见过的许多在线教程一样 . 例如,我在我的快速服务器上有一个名为'/ auth / facebook'的路由 . 如果我去localhost:51001 / auth / facebook,它会将我重定向到facebook登录,然后将我重定向回我给它的路线 . 所以流程按预期工作 .

我遇到的具体问题是让React成功启动并完成触发auth的api调用 . 我尝试了两种方法 .

Approach 1: Calling the route via ajax

我在componentDidMount中调用了以下内容:

axios.get('/auth/facebook')

这成功点击我的快速服务器,但随后立即在浏览器控制台中生成以下错误:

XMLHttpRequest无法加载https://www.facebook.com/dialog/oauth?response_type=code&redirect_uri=http%...2Flocalhost%3A51000%2Fauth%2Ffacebook%2Fcallback&client_id=XYZ . 从'https://www.facebook.com/dialog/oauth?response_type=code&redirect_uri=http%...2Flocalhost%3A51000%2Fauth%2Ffacebook%2Fcallback&client_id=XYZ'重定向到'https://www.facebook.com/login . php?skip_api_login = 1&api_key = XYZ ... _&display = page&locale = en_US&logger_id = 7f30b5a1-2ad1-dc31-f08b-70d3cfdd55fa'已被CORS策略阻止:请求的资源上没有“Access-Control-Allow-Origin”标头 . 因此不允许Origin'http:// localhost:51000'访问 .

方法2:在浏览器中转到路线

我在所有教程中看到的另一件事是添加一个链接到我的一个页面,它只是导航到身份验证路径 . 例如:

<a href="/auth/facebook">Login with Facebook</a>

但是,当我点击这个时,我只是在http://localhost:51000/auth/facebook,或者只是我的React应用程序中的空白页面 . 当我在浏览器中访问此路由时,我没有看到我的Express服务器上的任何活动,即使它在react-router中定义了's not a Route I' .

所以我有点卡在这里 . 单击该标记是否已触发针对我的Express服务器触发的路由?有没有办法让react-router忽略某些路由,以便将它们重定向到我的快速服务器?这似乎在进行AJAX调用时工作正常,但如果我转到localhost:51000 / not / a / route,这不会导致请求被重定向到Express . 它只加载没有内容的反应页面 .

任何帮助表示赞赏 .

谢谢,

-担

EDIT

所以我现在有点工作,虽然我完全不相信这是“正确”的做事方式 .

在我的反应应用程序(召回在端口51000上运行),我有以下链接:

<a href="http://localhost:51001/auth/facebook">Facebook Login</a>

请注意,这直接指向我的API服务器,而不是反应路由 . 导航到此链接会点击快速服务器,并立即重定向到Facebook . 登录重定向回我的Express facebook回调,它本身重定向到http://localhost:51000/somePage,现在回到我的反应应用程序 .

理想情况下,该标签将转到/ api / auth / facebook,而不是硬编码转到不同的URL /端口 . 如果/当我弄清楚如何让react-router通过它而不是将其视为需要加载的页面时,我将更新此问题 .

EDIT 2

我对那些告诉我的人开放,但我认为我目前的方法实际上非常好 . 我考虑了 生产环境 过程中的表现 . 我将在www.example.com上找到我的反应网站,我的快速服务器可通过api.example.com访问 . 我登录Facebook的链接将是“api.example.com/auth/facebook” . 假设成功验证,回调将重定向到“www.example.com/some/route” . 我认为跳转到“api”URL来执行登录是合理的 . 最终,试图让react-router忽略某些路由是没有意义的,因为我所有的api调用都将是一条明确的路由 .

我意识到我没有为他人提供完整有用的解决方案 . 一旦我将它们放在一起,我将包含一个指向我的repo的链接,其中包含此登录流程,以防其他人发现它有用 .

**编辑3 **

这是我的项目的链接 . 让整个项目运行并不是一件容易的事,但只有少数与auth流相关的文件 .

您可以在这里查看回购:https://github.com/dan-goyette/Portfolio

Express服务器路由器的位置如下:

https://github.com/dan-goyette/Portfolio/blob/master/portfolio-server/src/Routing/auth.js

在UI中,我使用此组件触发对Express服务器的调用:

https://github.com/dan-goyette/Portfolio/blob/75ca9326e6227d0601cdfa4c0cece672bd347302/portfolio-ui/src/Components/SocialMenuButton/SocialMenuButton.js

你可以看到它在https://www.dan-goyette.com/home工作,右上角的按钮 .

5 回答

  • 1

    我也遇到了这个问题 - 更改CRA代理配置似乎可以解决这个问题:

    "proxy": {
       "/api": {
          "target": "http://localhost:3001/"
       }
    }
    

    OAuth链接位于 /api/auth/foo ,CRA应用位于 localhost:3000 ,快递应用位于 localhost:3001

  • 0

    我今天遇到了同样的问题并且通过不使用 create-react-app 的代理解决了它,而是在我的后端设置代理到 create-react-app .

    在我的快递应用程序结束时,我有

    // all routes above
    
     if (env.isDevelopment()) {
       const proxy = require('express-http-proxy')
       app.use('/*', proxy('http://localhost:3000'))
     } else {
       // probably serve up build version in production
     }
    

    只需记住关闭客户端软件包json中的代理,否则最终会出现无限代理循环或其他问题 .

  • 0

    EDIT: 我以前的回答与这个问题无关,也没有解决 . 在我的情况下,整个事情是由CLI生成的index.js中的registerServiceWorker引起的 . 只需删除它,一切都按照它应有的方式工作 .

    //Remove this lines from index.js
    import registerServiceWorker from './registerServiceWorker'
    
    registerServiceWorker();
    
  • 0

    您可以将create react app localhost server添加到web api . 转到console.developers.google.com并将create-react-app localhost添加到“Authorized JavaScript origin”和“Authorized redirect URIs” .

  • 2

    我通过在Facebook登录产品部分的Facebook开发人员设置中使用"Valid OAuth redirect URIs"字段修复了此问题,例如 http://your-domain.loc:5000/auth/facebook .

    Facebook Auth按钮应该是:

    <a href="http://your-domain.loc:5000/auth/facebook">Login with Facebook</a>
    

    你应该把你的Facebook重定向网址放在那里 . 我的例子还有一件事:我在我的应用程序上使用3000端口用于本地节点服务器,5000用于API请求 .

    我使用 /etc/hosts 来使用我的域名,而不是 localhost .

    127.0.0.1   your-domain.loc
    

    适合我 .

    此外,GitHub资源的其他讨论正在发生 - https://github.com/facebook/create-react-app/issues/3502

相关问题