如何强制 redirect_uri 在 python-social-app 中使用 HTTPS?

Zho*_*ndr 3 django google-login oauth-2.0 facebook-login python-social-auth

我正在使用带有 python-social-app 的 django 框架,并且在尝试使用 Facebook 登录按钮登录时出错。

我的应用程序由三个 docker 容器组成:

  1. 姜戈应用程序。
  2. 数据库。
  3. NGINX + SSL 证书。

这是我的错误:

身份验证过程已取消:URL 已阻止:此重定向失败,因为重定向 URI 未在应用程序的客户端 OAuth 设置中列入白名单。确保客户端和 Web OAuth 登录已打开,并将您的所有应用程序域添加为有效的 OAuth 重定向 URI。块引用

这是我在尝试登录时可以看到的 URL

https://www.facebook.com/v2.9/dialog/oauth?client_id=247739632734206&redirect_uri=http%3A%2F%2Fwww.DOMAN_NAME.com%2Fcomplete%2Ffacebook%2F&state=7AySpKwDWAKtiIxP75LBIP3scopesqwy=

正如我所看到的,问题是 redirect_uri 以 HTTP 而不是 HTTPS 开头。

Django==2.2
social-auth-app-django==3.1.0
social-auth-core==3.1.0
Run Code Online (Sandbox Code Playgroud)

我对这个问题的最佳猜测是 Django 应用程序不“知道”它在 NGINX+SSL 后面运行,并使用 HTTP 协议而不是 HTTPS 生成 redirect_uri。

Facebook 设置具有以 HTTPS 开头的正确重定向 URI。这个问题不是 Facebook 特有的,Google 的 redirect_uri 也有同样的问题。

如何强制 python-social 使用 HTTPS?

小智 10

您应该寻找的是在 Django 应用程序的 settings.py 中添加以下行。

SOCIAL_AUTH_REDIRECT_IS_HTTPS = True
Run Code Online (Sandbox Code Playgroud)

这种方式由 django social 创建的 redirect_uri 包含 https。

根据上面的答案,您所做的是将 http 流量重定向到 https,如果您尝试创建仅限 https 的服务器,这仍然是一个问题。


Zho*_*ndr 1

这是对我有帮助的设置:

Django 设置:

# settings.py
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
Run Code Online (Sandbox Code Playgroud)

nginx 设置:

location / {
    # ... 
    proxy_set_header X-Forwarded-Proto $scheme;
}
Run Code Online (Sandbox Code Playgroud)

来源:如何使用 Django/nginx 部署仅支持 HTTPS 的站点?