1

早上好或下午好,甚至晚上好!

我一直在尝试使用带有 Django 的 OAuth Toolkit来实现资源服务器与身份验证服务器的分离,但我被卡住了

试过:

首先,我已经尝试过以下方法:

  1. 按照本教程的教程进行操作,它适用于使用 python manage.py runserver服务项目。

  2. 整个结构是我使用Postmen作为客户端并请求资源服务器并使用身份验证服务器检查经过身份验证的用户,因此资源和身份验证服务器之间存在自省过程

问题:

正如我所提到的,整个想法只有在我使用python manage.py runserver服务项目时才有效。当使用NginxGunicorn在Docker-Compose中部署项目来服务项目时,头痛就来了。

这是最后一个错误- 使用 url:/o/introspect/ 超出了最大重试次数

当我追踪到根时- Introspection: Failed POST to localhost:8000/o/introspect/ in token lookup

这是客户端应用程序中的错误- “未提供身份验证凭据。”

我发现当访问令牌过期撤销并且系统尝试从身份验证服务器获取对资源服务器的新访问令牌时会发生此问题。

不知何故,自省过程因我未知的原因而失败!

以前有人撞过这堵墙吗?

编辑:(2021 年 3 月 4 日,星期四)

我找到了另一个与确切问题更相关的原因!

docker compose创建服务时,每个服务都服务于一个由项目(Django)图像组成的容器。因此,每个项目都是相互隔离的!

这导致 A 项目可能更难向 B 项目请求,因为 B 项目的端口在 A 项目中无法到达

一个潜在的解决方案可能是使用 Nginx 服务器代理名称(这将与 docker compose 中的每个服务的名称相同)来发出请求。

我还在努力解决这个问题!如果有人可以提供帮助,那将不胜感激!

编辑:(台湾 2021 年 3 月 4 日星期四下午 5:07)问题已解决

解决方案已演示!

4

1 回答 1

0

阅读之前:此解决方案是使用与 Docker-Compose 一起部署的 Django OAuth Toolkit 处理项目,这会发生 Failed Introspection Request 问题

所以首先,让我演示一下 docker compose 结构:

version: "3.4"

x-service-volumes: &service-volumes
  - ./:/usr/proj/:rw,cached

services:
  ShopDjangoBN_Nginx:
    image: ${DJ_NGINX_IMAGE}
    ports:
      - 8001:8001
    volumes: *service-volumes
    environment:
      - NGINX_SHOP_HOST=${NGINX_SHOP_HOST}
    depends_on:
      - "ShopDjangoBN"

  ShopDjangoBN:
    image: ${SHOP_DJANGO_IMAGE}
    command: gunicorn -w 2 -b 0.0.0.0:8001 main.wsgi:application
    volumes: *service-volumes
    depends_on:
      - "ShopDjangoBN_Migrate"
    expose:
      - 8001

  ShopDjangoBN_CollectStatic:
    image: ${SHOP_DJANGO_IMAGE}
    command: python manage.py collectstatic --noinput
    volumes: *service-volumes

  ShopDjangoBN_Migrate:
    image: ${SHOP_DJANGO_IMAGE}
    command: python manage.py migrate
    volumes: *service-volumes


  OAuthDjangoBN_Nginx:
    image: ${DJ_NGINX_IMAGE}
    ports:
      - 8000:8000
    volumes: *service-volumes
    environment:
      - NGINX_OAUTH_HOST=${NGINX_OAUTH_HOST}
    depends_on:
      - "OAuthDjangoBN"

  OAuthDjangoBN:
    image: ${O_AUTH_DJANGO_IMAGE}
    command: gunicorn -w 2 -b 0.0.0.0:8000 main.wsgi:application
    volumes: *service-volumes
    depends_on:
      - "OAuthDjangoBN_Migrate"
    expose:
      - 8000

  OAuthDjangoBN_CollectStatic:
    image: ${O_AUTH_DJANGO_IMAGE}
    command: python manage.py collectstatic --noinput
    volumes: *service-volumes

  OAuthDjangoBN_Migrate:
    image: ${O_AUTH_DJANGO_IMAGE}
    command: python manage.py migrate
    volumes: *service-volumes

volumes:
  auth-data:
  shop-data:
  static-volume:
  media-volume:

在 docker -compose yml 文件中有两个 Nginx 服务器服务处理 Django 的网络ShopDjangoBN_NginxOAuthDjangoBN_Nginx !一般来说,如果我们为没有 docker-compose 和 nginx 的项目提供服务,你就不会遇到这个问题。但是,我认为在使用 docker 技术进行部署时,您会遇到这个问题。

要设置分离服务器的想法,您需要按照本教程进行操作,并且需要在资源服务器项目的 Django 设置文件中完成以下代码:

OAUTH2_PROVIDER = {
    ...
    'RESOURCE_SERVER_INTROSPECTION_URL': 'https://example.org/o/introspect/',
    'RESOURCE_SERVER_AUTH_TOKEN': '3yUqsWtwKYKHnfivFcJu', # OR this but not both:
    #'RESOURCE_SERVER_INTROSPECTION_CREDENTIALS' ('rs_client_id','rs_client_secret'),
    ...
}

这里的关键是“RESOURCE_SERVER_INTROSPECTION_URL”变量!此变量用于从 Resource 向 Auth 服务器请求 Introspection Request,因此,建议正确设置此 url,并且它必须是 Auth Server 中的 introspection 端点。

接下来,如果您还记得的话,处理任何对 Auth Server 的请求的OAuthDjangoBN_Nginx是一个反向代理服务!从技术上讲,OAuthDjangoBN_Nginx 将成为 Auth Server 的主机。所以......资源服务器 Django 设置文件中的自省 url 将如下所示:

'RESOURCE_SERVER_INTROSPECTION_URL': 'https://OAuthDjangoBN_Nginx:<port>/o/introspect/'

nginx.conf

upstream OAuthDjangoBN {
    server OAuthDjangoBN:8000;
}

server {
    listen 8000;

    location / {
        proxy_pass http://OAuthDjangoBN;
        # proxy_set_header Host $NGINX_SHOP_HOST;
        proxy_set_header Host "localhost:8000";
        proxy_redirect off;
    }

    location /static/ {
        alias /usr/proj/OAuthDjangoBN/static/;
    }  
}

这个proxy_set_header最好用 env 变量设置,我在互联网上找到了一些解决方案,所以不会有问题。设置也很重要,因为反向主机名将是OAuthDjangoBN_Nginx:这将不会被识别为有效的主机名,因此,设置它!

proxy_set_header Host "localhost:8000";

好吧,如果有人遇到或将遇到同样的问题,我认为这个想法可以成为解决方案。我也相信这仍然是一个混乱。如果你撞墙了,请告诉我!

于 2021-03-04T09:51:52.967 回答