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://www.dan-goyette.com/home工作,右上角的按钮 .
5 回答
我也遇到了这个问题 - 更改CRA代理配置似乎可以解决这个问题:
OAuth链接位于
/api/auth/foo
,CRA应用位于localhost:3000
,快递应用位于localhost:3001
我今天遇到了同样的问题并且通过不使用
create-react-app
的代理解决了它,而是在我的后端设置代理到create-react-app
.在我的快递应用程序结束时,我有
只需记住关闭客户端软件包json中的代理,否则最终会出现无限代理循环或其他问题 .
EDIT: 我以前的回答与这个问题无关,也没有解决 . 在我的情况下,整个事情是由CLI生成的index.js中的registerServiceWorker引起的 . 只需删除它,一切都按照它应有的方式工作 .
您可以将create react app localhost server添加到web api . 转到console.developers.google.com并将create-react-app localhost添加到“Authorized JavaScript origin”和“Authorized redirect URIs” .
我通过在Facebook登录产品部分的Facebook开发人员设置中使用"Valid OAuth redirect URIs"字段修复了此问题,例如
http://your-domain.loc:5000/auth/facebook
.Facebook Auth按钮应该是:
你应该把你的Facebook重定向网址放在那里 . 我的例子还有一件事:我在我的应用程序上使用3000端口用于本地节点服务器,5000用于API请求 .
我使用
/etc/hosts
来使用我的域名,而不是localhost
.适合我 .
此外,GitHub资源的其他讨论正在发生 - https://github.com/facebook/create-react-app/issues/3502