OAuth 回调 URL 与 nginx 代理服务器行为不兼容

2024-01-03

在过去的三天里,我花了很大一部分时间尝试互联网上的每一个解决方案,但感到绝望。这是问题陈述:

我有一个包含三个服务的 Dockerized 应用程序:

  • 带有gunicorn的django应用程序(web)
  • Nginx 服务器(nginx)
  • PostgreSQL (db)

我的 Web 应用程序要求用户通过相当标准的 OAuth 流程使用其 GitHub 帐户登录。这一直有效,无需nginx。用户单击“使用 github 登录”按钮,将其发送到 GitHub 来授权应用程序,并将其重定向回完成页面。

我将“授权回调 URL”填写为http://本地主机:8000 http://localhost:8000。如果没有 Nginx,我可以导航到本地主机上的应用程序,单击按钮,并在授权后重定向回本地主机上的应用程序。

使用 Nginx,我总是会失败并出现错误(控制台中的 nginx):

GET /auth/complete/github/?error=redirect_uri_mismatch&error_description=The+redirect_uri+必须+match+the+registered+callback+URL+for+this+application.&error_uri=https%3A%2F%2Fdeveloper.github.com%2Fapps %2F管理-oauth-apps%2F故障排除-授权-请求-错误%2F%23重定向-uri-不匹配&状态=nmegLb41b959su31nRU4ugFOzAqE8Cbl HTTP/1.1

这是我的 Nginx 配置:

upstream webserver {
    # docker will automatically resolve this to the correct address
    # because we use the same name as the service: "web"
    server web:8000;
}

# now we declare our main server
server {

    listen 80;
    server_name localhost;

    location / {
        # everything is passed to Gunicorn
        proxy_pass http://webserver;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect off;
    }

    location /static {
        autoindex off;
        alias /static_files/;
    }

    location /media {
        alias /opt/services/starport/media;
    }
}

这是我的 Dockerfile:

version: '3.7'
services:
  web:
    build: .
    command: sh -c "cd starport && gunicorn starport.wsgi:application --bind 0.0.0.0:8000"
    volumes:
      - static_files:/static_files # <-- bind the static volume
    networks:
      - nginx_network
  nginx:
    image: nginx
    ports:
      - 8000:80
    volumes:
      - ./config/nginx/conf.d:/etc/nginx/conf.d
      - static_files:/static_files # <-- bind the static volume
    depends_on:
      - web
    networks:
      - nginx_network

networks:
  nginx_network:
    driver: bridge

volumes:
  static_files:

我的预感是,它在没有 Nginx 的情况下工作但在 Nginx http 服务器上不起作用的原因与重定向有关,因为 Nginx 正在监听一个端口,然后将其转发到另一个端口。 GitHub 的文档明确指出,重定向 URI 需要与注册的回调 url 完全相同。我还使用了检查器工具,这些是我的请求标头:

GET /accounts/login/ HTTP/1.1
Cookie: ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Host: localhost:8000
User-Agent: Mozilla/5.0
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive

我使用 Nginx 得到的错误消息(再次强调,它就像一个魅力,没有 nginx 的情况下十有八九会出错)是:

作为附加细节,我正在使用social-auth-app-django包但这应该不重要。

进一步排除故障

经过无数个小时的探测,我在本地调试模式下运行它,这一次密切监视我的请求信息。当用户点击链接通过 OAuth 向 GitHub 授权时,这是请求以及所有标头信息:

CSRF_COOKIE             'abc'
HTTP_ACCEPT             'text/html,application/xhtml+xml'
HTTP_ACCEPT_ENCODING    'gzip, deflate'
HTTP_ACCEPT_LANGUAGE    'en-us'
HTTP_CONNECTION         'close'
HTTP_COOKIE             ('csrftoken=...; ')
HTTP_HOST               'localhost'
HTTP_REFERER            'http://localhost:8000/accounts/login/?next=/'
HTTP_USER_AGENT         ('Mozilla/5.0')
HTTP_X_FORWARDED_FOR    '172.26.0.1'
HTTP_X_FORWARDED_PROTO  'http'
PATH_INFO               '/auth/complete/github/'
SERVER_NAME             '0.0.0.0'
SERVER_PORT             '8000'

QUERY_STRING    
'error=redirect_uri_mismatch&error_description=The+redirect_uri+MUST+match+the+registered+callback+URL+for+this+application.&error_uri=https%3A%2F%2Fdeveloper.github.com%2Fapps%2Fmanaging-oauth-apps%2Ftroubleshooting-authorization-request-errors%2F%23redirect-uri-mismatch&state=NwUhVqfOCNb51zpvoFbXVvm1Cr7k3Fda'

RAW_URI 
'/auth/complete/github/?error=redirect_uri_mismatch&error_description=The+redirect_uri+MUST+match+the+registered+callback+URL+for+this+application.&error_uri=https%3A%2F%2Fdeveloper.github.com%2Fapps%2Fmanaging-oauth-apps%2Ftroubleshooting-authorization-request-errors%2F%23redirect-uri-mismatch&state=NwUhVqfOCNb51zpvoFbXVvm1Cr7k3Fda'

让我立即印象深刻的是HTTP_HOST, HTTP_REFERER and 服务器名称。我还感兴趣的是错误消息:

哪里代替http://localhost:8000它只有http://localhost,这看起来像是一个很大的暗示,表明我没有正确配置。任何线索或帮助都会有所帮助!

我尝试过的资源

StackOverflow 线程如this https://stackoverflow.com/questions/17518598/nginx-intercepting-google-oauth-redirect看起来很有希望但类似的问题像这样 https://stackoverflow.com/questions/54912724/using-oauth-in-laravel-gives-error-redirect-uri-mismatch除了解释错误之外,没有收到任何有意义的响应。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OAuth 回调 URL 与 nginx 代理服务器行为不兼容 的相关文章

随机推荐

  • 如何正确使用JVM -XX:MaxRAM选项? [复制]

    这个问题在这里已经有答案了 我使用以下参数运行 java 应用程序 bin bash export JVM OPTS XX MaxRAM 150m export JVM OPTS JVM OPTS XX UseSerialGC java J
  • 如何更改 IntelliJ 中所有模块的语言级别

    我有一个包含许多模块的项目 我们正在升级到 Java7 我希望我的编辑器能够反映这一点 现在我的所有模块都专门将语言级别设置为Java6 并且模块太多 我无法为每个模块更改此设置 如何将所有模块设置为 Java7 更好的是 如何设置所有模块
  • SharedPreferences 替换数据

    我有一个应用程序 每当我按下按钮时都会给我一些字符串 然后使用共享首选项保存该值 但是 我想限制此保存功能 因此它只会保存最后三个收到的字符串 其结构如下 字符串A 字符串 B 字符串 C 下次当我单击按钮时 它将将该值记录到字符串 A 中
  • Python:如何从列表中检查字符串中的子字符串? [复制]

    这个问题在这里已经有答案了 如何检查字符串中列表中包含的子字符串 例如检查字符串是否包含 字符串 列表中的元素 https stackoverflow com questions 500925 但是在 Python 中呢 试试这个测试 an
  • Lambda 表达式的代码覆盖率

    我在整个代码中看到一种模式 其中 lambda 表达式显示为未包含在代码覆盖范围内 调试器确实单步执行代码并且没有条件块 public CollectionModel List
  • Ocaml 变体类型

    无论我读什么教程 手册 OCaml 类型总是让我感到困惑 我需要定义一个类型 比如说测试 它包含以下形式 具有以下形式之一的类型 a b 测试 空 T t N n Seq x1 xn 我知道如何做前 3 个 但我完全不知道如何定义最后一个形
  • 从 git 标签获取版本(通过 pbr)

    I use pbr https pypi python org pypi pbr用于包装 它从 git 标签获取版本并将其应用于 setup py 现在我还想在包中提供可用的版本 例如有一个 version 属性 我可以使用pbr图书馆为此
  • Ionic 3:从 PlayStore 链接获取价值

    我有一个 Ionic 3 应用程序 我想根据 Playstore 的下载链接在其中设置一些变量 例如 http linktoplaystore com app account 4会将我的应用程序内的帐户变量设置为 4 有什么方法可以实现此目
  • CasperJS 将数据传回 PHP

    PHP 正在使用 CasperJS 调用exec 命令 CasperJS 完成检索网页部分内容等工作后 如何将检索到的数据返回给 PHP 我认为将数据从 CasperJS 传输到另一种语言 例如 PHP 的最佳方法是将 CasperJS 脚
  • 如何调试使用 Chrome/WebKit 作为远程调试器运行的 Node.js 服务器?

    如果你的节点正在运行 node debug server js 这给了我一个端口号 xxxx 我应该在启动 Chrome 时使用这个端口号吗 您是否从远程调试它Google Chrome remote debugging port xxxx
  • 如何测试使用 mechanize 的 ruby​​ 应用程序

    我编写了一个使用 Mechanize 遍历站点的小程序 我想为它编写测试 但不希望它在每次运行测试时都实际登录到该网站 我想模拟互联网 以便当它访问某个站点时 它只是返回存储的结果 这是一个小例子 假设我的代码的目的是从谷歌主页上提取链接
  • 如何制作表格超链接的单元格

    在没有 javascript 或 jquery 的情况下 如何在 html 中对整个表格单元格进行超链接 我尝试将 href 放入 td 标签本身 但至少在 chrome 18 中不起作用 td href http www m w com
  • 使用正则表达式排除某些字符

    尽我所能 我无法让正则表达式排除空格或单引号 允许使用字符串 abc 不允许 a bc abc abc 等 上例中的空格也可以替换 假定已删除尾随和前导空格 其他地方检查空字符串 目标语言是javascript 如果我使用 SQL 我会使用
  • Laravel - 雄辩的“Has”、“With”、“WhereHas” - 它们是什么意思?

    我发现这些方法背后的概念和含义有点令人困惑 有人可以向我解释一下它们之间的区别吗 has and with是 在一个例子的上下文中 如果可能的话 With with is for 急切加载 这基本上意味着 Laravel 将沿着主模型预加载
  • Facebook Graph 高分辨率照片

    我正在为 me home 执行 Facebook Graph API 调用 以获取用户的新闻源 众所周知 您在 图片 字段中获得的 URL 是低分辨率照片 在 100x100 以上的分辨率下看起来效果不佳 我知道您可以通过对 object
  • Swift:无法预加载 Coredata

    当我在 目标 构建阶段 复制捆绑资源 下包含带有 Objective C 的 SQLite 文件时 该文件将被完全复制到目标 即设备或模拟器 在目标上 我得到整个文件 表和内容 记录 行 对 Swift 进行同样的操作 表将被复制 但它们是
  • Flexslider无限循环不起作用

    我在网上到处找 Flexslider 有一个众所周知的问题 无论是滑块还是轮播 当它到达滑块中的最后一个项目时 它会飞回第一个项目 而不是保持无限循环平滑 我不敢相信没有人能解决这个问题 这是我正在使用的 flexSlider 代码 doc
  • 是什么原因导致 ClassCastException: java.util.TreeSet 无法转换为 java.lang.Comparable?

    因此 我尝试将一定长度的所有字符串从字符串集合 可以是集合或列表 移动到 TreeMap 并将每个字符串中的字符集设置为该字符串的键 但这条线map put keyRinger word word throws java lang Clas
  • 以下reinterpret_cast是否会导致未定义的行为?

    是否reinterpret cast下面的代码中会导致未定义的行为吗 如果确实如此 是否可以定义rpd以类型安全的方式 class Base public virtual Base default class Derived public
  • OAuth 回调 URL 与 nginx 代理服务器行为不兼容

    在过去的三天里 我花了很大一部分时间尝试互联网上的每一个解决方案 但感到绝望 这是问题陈述 我有一个包含三个服务的 Dockerized 应用程序 带有gunicorn的django应用程序 web Nginx 服务器 nginx Post