Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB Stitch在Facebook登录尝试中断登录过程期间对重定向URI进行双重编码?_Node.js_Mongodb_Facebook_Oauth_Mongodb Stitch - Fatal编程技术网

Node.js MongoDB Stitch在Facebook登录尝试中断登录过程期间对重定向URI进行双重编码?

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/

我正在尝试使用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/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应用程序的链接,以便我可以在此处查看日志?谢谢