Django OAuth 工具包 - 自省请求:"Authentication credentials were not provided."

Django OAuth Toolkit - Introspection Request: "Authentication credentials were not provided."

早上好,下午好,晚上好!

我一直在尝试使用 OAuth Toolkit 和 Django 实现资源服务器与 auth 服务器的分离,我卡住了

尝试过:

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

  1. 使用此 tutorial 按照教程进行操作,它 在使用 python 服务项目时有效manage.py 运行服务器.

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

伊苏斯:

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

This was the final error - Max retries exceeded with url: /o/introspect/

When I tracked back to the root - Introspection: Failed POST to localhost:8000/o/introspect/ in token lookup

This is error in the client app - "Authentication credentials were not provided."

我发现当 access token expiredrevoked 并且系统尝试从身份验证服务器获取对资源服务器的新访问令牌。

不知何故,我的内省过程失败了未知原因

有人撞过这堵墙吗?

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

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

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

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

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

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

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

解决方案已演示!

阅读之前:此解决方案用于处理使用 Django OAuth 工具包部署的项目 Docker-Compose 发生失败的内省请求问题

首先,让我向您演示 docker 组合结构:

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:

[=]中有两个处理Django网络的Nginx服务器服务ShopDjangoBN_NginxOAuthDjangoBN_Nginx 59=]-编写yml文件!一般来说,如果我们服务的项目没有 docker-compose 和 nginx,你就不会遇到这个问题。 但是当涉及到使用docker技术的部署时,我假设你会遇到这个问题。

要设置独立服务器的想法,您需要遵循此tutorial并且您需要在资源服务器项目的 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'变量!此变量用于请求从资源到 Auth 服务器的内省请求,因此,非常建议正确设置此 url,它必须是 Auth 服务器中的内省端点。

接下来,如果你还记得的话,处理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";

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