Node.js MongoDB Stitch在Facebook登录尝试中断登录过程期间对重定向URI进行双重编码?
我正在尝试使用MongoDB Stitch示例教程开发基于Web的Todo应用程序。我正在Ubuntu 18.04仿生海狸Linux工作站上使用Node.JS v10.14.2 当我尝试使用Facebook登录时,登录过程失败,Facebook抱怨Stitch服务器生成的重定向URL未列入白名单,因此在尝试使用OAuth登录Facebook时被拒绝。URL是在此节点模块中找到的代码块期间生成的:Node.js MongoDB Stitch在Facebook登录尝试中断登录过程期间对重定向URI进行双重编码?,node.js,mongodb,facebook,oauth,mongodb-stitch,Node.js,Mongodb,Facebook,Oauth,Mongodb Stitch,我正在尝试使用MongoDB Stitch示例教程开发基于Web的Todo应用程序。我正在Ubuntu 18.04仿生海狸Linux工作站上使用Node.JS v10.14.2 当我尝试使用Facebook登录时,登录过程失败,Facebook抱怨Stitch服务器生成的重定向URL未列入白名单,因此在尝试使用OAuth登录Facebook时被拒绝。URL是在此节点模块中找到的代码块期间生成的: node_modules/mongodb-stitch-browser-core/dist/cjs/
node_modules/mongodb-stitch-browser-core/dist/cjs/core/auth/internal/StitchAuthImpl.js
下面是生成启动登录过程的URL的代码。它调用Stitch服务器,Stitch服务器生成正确的URL,要求Facebook登录用户。注意,我确实修改了代码,但只修改了,以显示getAuthProviderRedirectRoute()调用生成的值。没有进行其他更改
StitchAuthImpl.prototype.loginWithRedirect = function (credential) {
var _this = this;
var _a = this.prepareRedirect(credential), redirectUrl = _a.redirectUrl, state = _a.state;
this.requestClient.getBaseURL().then(function (baseUrl) {
// ROS: We want to see the URL being created - ESM.
let replaceUrl = baseUrl +
_this.browserAuthRoutes.getAuthProviderRedirectRoute(credential, redirectUrl, state, _this.deviceInfo);
_this.jsdomWindow.location.replace(replaceUrl);
});
};
以下是replaceUrl的值,显示在Facebook登录过程的初始阶段生成的URL:
replaceUrl = https://stitch.mongodb.com/api/client/v2.0/app/my_stitch_app/auth/providers/oauth2-facebook/login?redirect=http://localhost:8001/&state=<<redacted>>&device=<<redacted>>
然后我手动解码了重定向URI,因为它看起来是错误的。如果查看上面显示的redirect\u uri查询参数,您将看到OAuth回调uri已使用encodeUri()方法进行了双重编码。这会导致Facebook OAuth服务器拒绝回调URI,因为在解码后,它看起来像下面显示的“解码一次”标签旁边的URL
这会导致OAuth握手失败,因为它与下面标记为“再次解码”的URL不匹配。
根据MongoDB Stitch教程的指示,我在“有效OAuth重定向URI”部分的Facebook OAuth“客户端OAuth设置”页面中输入了该值。由于URL是双重编码的,所以在解码一次时,重定向URI与“再次解码”值不匹配,登录过程失败。显然,我可以将“DECODED ONCE”值添加到白名单URL列表中,但这只会解决问题,因为它应该看起来像“DECODED ONCE”中完全解码的值
解码一次:
redirect_uri=https%3A%2F%2Fstitch.mongodb.com%2Fapi%2Fclient%2Fv2.0%2Fauth%2Fcallback
redirect_uri=https://stitch.mongodb.com/api/client/v2.0/auth/callback
再次解码:
redirect_uri=https%3A%2F%2Fstitch.mongodb.com%2Fapi%2Fclient%2Fv2.0%2Fauth%2Fcallback
redirect_uri=https://stitch.mongodb.com/api/client/v2.0/auth/callback
综上所述,当Facebook被要求使用Stitch生成的URL登录用户时(如下所示),Facebook会失败,并显示错误消息,如下所示:
https://www.facebook.com/login.php?skip_api_login=1&api_key=<<redacted>>&kid_directed_site=0&app_id=<<redacted>>%26redirect_uri%3Dhttps%253A%252F%252Fstitch.mongodb.com%252Fapi%252Fclient%252Fv2.0%252Fauth%252Fcallback
我已经搜索了MongoDB Stitch控制面板,我没有看到任何地方我可能输入了导致回调URL被Stitch传递到Facebook的内容,并进行了双重编码。有谁能告诉我是什么导致了这种不必要的行为,以及如何解决这个问题吗?谢谢您的详细解释。我试图复制你的问题,但我能够成功登录Facebook 我还检查了Stitch服务器重定向到Facebook时生成的URL,它与您在帖子中使用的双重编码URI完全相同。这意味着此行为是预期的,不应影响登录流 如果查看完整URL,您将看到主URL(从“”开始)有一个名为“next”的查询参数。“next”参数是一个URL,因此需要对其进行URL编码。传递给“next”的这个URL具有“redirect_uri”参数,该参数也是一个URL,因此它也需要进行URL编码。由于这是一个URL中的URL,这就是为什么您会看到双重编码 我在新行中使用每个参数格式化URL,每个子URL旨在帮助演示这一点:
https://www.facebook.com/login.php
?skip_api_login=1
&api_key=<redacted>
&kid_directed_site=0
&app_id=<redacted>
&signed_next=1
&next=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Foauth
%3Faccess_type%3Doffline
%26client_id%<redacted>
// this is the double encoded URL
%26redirect_uri%3Dhttps%253A%252F%252Fstitch.mongodb.com%252Fapi%252Fclient%252Fv2.0%252Fauth%252Fcallback
%26response_type%3Dcode
%26scope%3Demail%2Bpublic_profile
%26state%3D<redacted>
%26ret%3Dlogin
%26fallback_redirect_uri%<redacted>
&cancel_url=https%3A%2F%2Fstitch.mongodb.com%2Fapi%2Fclient%2Fv2.0%2Fauth%2Fcallback
%3Ferror%3Daccess_denied
%26error_code%3D200
%26error_description%3DPermissions%2Berror
%26error_reason%3Duser_denied
%26state%3D<redacted>
&display=page&locale=en_US
查看这些步骤的更多说明
如果在完成上述步骤后仍无法使其正常工作,请告诉我,我将尝试帮助您调试此问题。嗨,Robert,我也在github上回答了您的问题,但是您是否有到Stitch应用程序的链接,以便我可以在此处查看日志?谢谢