阅读之前:此解决方案是使用与 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_Nginx和OAuthDjangoBN_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";
好吧,如果有人遇到或将遇到同样的问题,我认为这个想法可以成为解决方案。我也相信这仍然是一个混乱。如果你撞墙了,请告诉我!