Django OAuth 工具包 - 自省请求:"Authentication credentials were not provided."
Django OAuth Toolkit - Introspection Request: "Authentication credentials were not provided."
早上好,下午好,晚上好!
我一直在尝试使用 OAuth Toolkit 和 Django 实现资源服务器与 auth 服务器的分离,我卡住了。
尝试过:
首先,我已经尝试过以下方法:
使用此 tutorial 按照教程进行操作,它 在使用 python 服务项目时有效manage.py 运行服务器.
整个结构是我使用Postmen作为客户端,请求资源服务器并检查认证用户使用 auth 服务器,因此在资源和 auth 服务器之间存在 内省过程。
伊苏斯:
正如我提到的,当我使用 python manage.py runserver 服务项目时,整个想法 仅 有效.在Docker-Compose部署项目使用Nginx和Gunicorn服务项目时,头疼来了
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 expired 或 revoked 并且系统尝试从身份验证服务器获取对资源服务器的新访问令牌。
不知何故,我的内省过程失败了未知原因!
有人撞过这堵墙吗?
编辑:(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_Nginx和OAuthDjangoBN_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";
好吧,如果有人遇到或将要遇到同样的问题,我认为这个想法可能是一个解决方案。我也相信这仍然是一个混乱。如果你撞墙了,请告诉我!
早上好,下午好,晚上好!
我一直在尝试使用 OAuth Toolkit 和 Django 实现资源服务器与 auth 服务器的分离,我卡住了。
尝试过:
首先,我已经尝试过以下方法:
使用此 tutorial 按照教程进行操作,它 在使用 python 服务项目时有效manage.py 运行服务器.
整个结构是我使用Postmen作为客户端,请求资源服务器并检查认证用户使用 auth 服务器,因此在资源和 auth 服务器之间存在 内省过程。
伊苏斯:
正如我提到的,当我使用 python manage.py runserver 服务项目时,整个想法 仅 有效.在Docker-Compose部署项目使用Nginx和Gunicorn服务项目时,头疼来了
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 expired 或 revoked 并且系统尝试从身份验证服务器获取对资源服务器的新访问令牌。
不知何故,我的内省过程失败了未知原因!
有人撞过这堵墙吗?
编辑:(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_Nginx和OAuthDjangoBN_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";
好吧,如果有人遇到或将要遇到同样的问题,我认为这个想法可能是一个解决方案。我也相信这仍然是一个混乱。如果你撞墙了,请告诉我!