Django OAuth Toolkit自省请求:“未提供身份验证凭据。”

2024-05-14 22:57:44 发布

您现在位置:Python中文网/ 问答频道 /正文

早上好,下午好,晚上好

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

尝试:

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

  1. 按照本tutorial教程进行操作,在使用python manage.py runserver为项目提供服务时,会起作用

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

Isuss:

正如我所提到的,只有当我使用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."

我发现当访问令牌过期或被撤销时,系统尝试从auth server获取到资源服务器的新访问令牌时,就会发生此问题

不知何故,内省过程因未知原因而失败

以前有人撞过这堵墙吗

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

我发现了另一个与确切问题相关的原因

作为docker compose创建服务,每个服务为一个包含项目图像(Django)的容器提供服务。因此,每个项目都是相互隔离的

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

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

我还在努力处理这件事!如果有人能帮上忙,我将不胜感激

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

解决方案已演示


Tags: the项目djangopy服务器auth身份验证manage
1条回答
网友
1楼 · 发布于 2024-05-14 22:57:44

在阅读之前:此解决方案是使用与Docker Compose一起部署的Django OAuth Toolkit来处理项目,这是由于内省请求失败而发生的

首先,让我演示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技术进行部署时,您可能会遇到这个问题

要设置独立服务器的概念,您需要遵循此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\u SERVER\u INTROSPECTION\u URL'变量!此变量用于从资源向Auth服务器请求内省请求,因此,建议正确设置此url,并且它必须是Auth服务器中的内省端点

接下来,如果您还记得的话,OAuthDjangoBN\u Nginx是一个反向代理服务,它处理对Auth Server的任何请求!从技术上讲,OAuthDjangoBN_Nginx将是我们的Auth服务器主机。所以资源服务器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/;
    }  
}

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

proxy_set_header Host "localhost:8000";

好的,我认为如果有人遇到或将遇到相同的问题,这个想法可以是一个解决方案。我也相信这仍然是一种困惑。如果你撞到墙了就告诉我

相关问题 更多 >

    热门问题