Facebook 未在 "Valid OAuth redirect URIs" 的列表中查找 "cancel_url"
Facebook doesn't lookup "cancel_url" in the list of "Valid OAuth redirect URIs"
初始设置:
我的应用程序使用 facebook oauth 系统并且有 3 个不同的环境:生产、测试和开发。我已经在 Facebook 应用程序的高级设置中列出了所有 3 个有效的重定向 URL(就像人们做的那样 here and here):
Valid OAuth redirect URIs:
http://myapp-pro.herokuapp.com,
http://myapp-tst.herokuapp.com,
http://myapp-dev.herokuapp.com
此外,在基本设置上,该应用具有:
App domains: myapp-pro.herokuapp.com
Site URL: http://myapp-pro.herokuapp.com
到目前为止发生了什么:
使用生产环境时,一切正常
在测试或开发时(两者都不位于 App domains
或 Site URL
):
一个。当用户登录到我的站点并且他已经登录到 facebook 时,一切正常。
b.当用户登录到我的网站,但他还没有登录到 facebook 时,facebook 抱怨说:
Given URL is not allowed by the Application configuration
One or more of the given URLs is not allowed by the App's settings. It must match the Website URL or Canvas URL, or the domain must be a subdomain of one of the App's domains.
有关后一种情况的更多详细信息:
当时浏览器中的 URL 是(不完全是,为了清楚起见,我已经解码了 next
和 cancel_url
部分):
https://www.facebook.com/login.php?
skip_api_login=1&
api_key=...&
signed_next=1&
next=https://www.facebook.com/v2.0/dialog/oauth?
redirect_uri=http://myapp-dev.herokuapp.com?
scope=public_profile&
email&
user_birthday&
response_type=code&
client_id=...&
ret=login&
cancel_url=http://myapp-dev.herokuapp.com?
error=access_denied&
error_code=200&
error_description=Permissions+error&
error_reason=user_denied#_=_&
display=page
您可能已经注意到 redirect_uri
和 cancel_url
域完全相等,并且此值 (http://myapp-dev.herokuapp.com
) 存在于 [=23= 的列表中].
如果我手动将此处cancel_url
更改为生产域,facebook 的错误将消失。
如果我手动完全删除cancel_url
参数,错误也会消失。
如果我只是忽略该消息,输入我的凭据并按登录按钮,我将被重定向到 https://www.facebook.com/login.php?login_attempt=1
并且不会发生其他任何事情。
想法:
Facebook 似乎根本不检查 cancel_url
是否存在于 Valid OAuth redirect URIs
的列表中。
已经提到的手动破解对于普通用户来说显然是不可接受的,所以我呼吁另一种想法。
针对不同的环境使用不同的facebook app,从思想上来说也不是一个好主意,恕我直言
解决方法:
- 正如@CBRoe 在评论中提到的那样:尝试使用自己的顶级域而不是
herokuapp.com
(将其用作 App domains
和 Site URL
值)并且有效。这并没有解决最初的问题,但却是一个很好的解决方法。
Facebook 应用程序域似乎可以在子域上 - Facebook 不检查它是否存在,它只查找顶级域,这允许我们设置一个假的子域。并允许我们在假的子域上托管我们的本地开发环境。
不过,如果您或您的客户没有有效的顶级域,这将不起作用。
编辑主机文件 /etc/hosts mac 和 /windows/system32/drivers/etc/hosts windows
192.168.10.10 dev.theclientsdomain.com
然后将dev.theclientsdomain.com放入app域。
希望对您有所帮助。
初始设置:
我的应用程序使用 facebook oauth 系统并且有 3 个不同的环境:生产、测试和开发。我已经在 Facebook 应用程序的高级设置中列出了所有 3 个有效的重定向 URL(就像人们做的那样 here and here):
Valid OAuth redirect URIs:
http://myapp-pro.herokuapp.com,
http://myapp-tst.herokuapp.com,
http://myapp-dev.herokuapp.com
此外,在基本设置上,该应用具有:
App domains: myapp-pro.herokuapp.com
Site URL: http://myapp-pro.herokuapp.com
到目前为止发生了什么:
使用生产环境时,一切正常
在测试或开发时(两者都不位于
App domains
或Site URL
):一个。当用户登录到我的站点并且他已经登录到 facebook 时,一切正常。
b.当用户登录到我的网站,但他还没有登录到 facebook 时,facebook 抱怨说:
Given URL is not allowed by the Application configuration One or more of the given URLs is not allowed by the App's settings. It must match the Website URL or Canvas URL, or the domain must be a subdomain of one of the App's domains.
有关后一种情况的更多详细信息:
当时浏览器中的 URL 是(不完全是,为了清楚起见,我已经解码了
next
和cancel_url
部分):https://www.facebook.com/login.php? skip_api_login=1& api_key=...& signed_next=1& next=https://www.facebook.com/v2.0/dialog/oauth? redirect_uri=http://myapp-dev.herokuapp.com? scope=public_profile& email& user_birthday& response_type=code& client_id=...& ret=login& cancel_url=http://myapp-dev.herokuapp.com? error=access_denied& error_code=200& error_description=Permissions+error& error_reason=user_denied#_=_& display=page
您可能已经注意到
redirect_uri
和cancel_url
域完全相等,并且此值 (http://myapp-dev.herokuapp.com
) 存在于 [=23= 的列表中].如果我手动将此处
cancel_url
更改为生产域,facebook 的错误将消失。如果我手动完全删除
cancel_url
参数,错误也会消失。如果我只是忽略该消息,输入我的凭据并按登录按钮,我将被重定向到
https://www.facebook.com/login.php?login_attempt=1
并且不会发生其他任何事情。
想法:
Facebook 似乎根本不检查
cancel_url
是否存在于Valid OAuth redirect URIs
的列表中。已经提到的手动破解对于普通用户来说显然是不可接受的,所以我呼吁另一种想法。
针对不同的环境使用不同的facebook app,从思想上来说也不是一个好主意,恕我直言
解决方法:
- 正如@CBRoe 在评论中提到的那样:尝试使用自己的顶级域而不是
herokuapp.com
(将其用作App domains
和Site URL
值)并且有效。这并没有解决最初的问题,但却是一个很好的解决方法。
Facebook 应用程序域似乎可以在子域上 - Facebook 不检查它是否存在,它只查找顶级域,这允许我们设置一个假的子域。并允许我们在假的子域上托管我们的本地开发环境。
不过,如果您或您的客户没有有效的顶级域,这将不起作用。
编辑主机文件 /etc/hosts mac 和 /windows/system32/drivers/etc/hosts windows
192.168.10.10 dev.theclientsdomain.com
然后将dev.theclientsdomain.com放入app域。
希望对您有所帮助。