如何更改 moziila_django_oidc 中的 redirect_uri?
How to change the redirect_uri in moziila_django_oidc?
我想将 Keycloak 集成到 Django 项目中,我正在使用 mozilla_django_oidc 来实现。
我遇到的问题是,当我向 keycloak 的授权端点发送请求时,redirect_uri
被设置为:redirect_uri=http%3A%2F%2Fdjango%3A8000%2Foidc%2Fcallback%2F
,但应该是 django
我的应用程序的 IP。不知道为什么用django作为域名
我在 settings.py
中的配置如下所示:
OIDC_RP_CLIENT_ID = os.environ['OIDC_RP_CLIENT_ID']
OIDC_RP_CLIENT_SECRET = os.environ['OIDC_RP_CLIENT_SECRET']
OIDC_OP_AUTHORIZATION_ENDPOINT = 'http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/auth'
OIDC_OP_TOKEN_ENDPOINT = 'http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/token'
OIDC_OP_USER_ENDPOINT = 'http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/userinfo'
OIDC_OP_JWKS_ENDPOINT = 'http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/certs'
LOGIN_REDIRECT_URL = 'http://172.20.159.83/test'
LOGOUT_REDIRECT_URL = 'http://172.20.159.83/'
而在 urls.py
中是:
path('oidc/', include('mozilla_django_oidc.urls')),
向授权端点请求所有参数:
http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/auth?response_type=code&scope=openid+email&client_id=MyApplication&redirect_uri=http%3A%2F%2Fdjango%3A8000%2Foidc%2Fcallback%2F&state=3YxLAg8kX1bC1yTDMqKh8L05bIP5z9cB&nonce=jZ6KEZhk9tWOwdXRSqTUoF8lzg7aLU70
所以,正如标题所说,我怎样才能将 redirect
uri 的 django
部分更改为指向我的应用程序的 IP?这个参数是怎么设置的?
我一直在查看mozilla_django_oidc
的源代码,似乎无法手动设置此参数。相反,它将始终使用发送请求的主机名(在我的例子中确实发生在 django 上)。
这里的代码被剪掉了,对任何想知道的人负责:
reverse_url = self.get_settings('OIDC_AUTHENTICATION_CALLBACK_URL',
'oidc_authentication_callback')
token_payload = {
'client_id': self.OIDC_RP_CLIENT_ID,
'client_secret': self.OIDC_RP_CLIENT_SECRET,
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': absolutify(
self.request,
reverse(reverse_url)
),
}
absolutify 是一个函数,定义为:
def absolutify(request, path):
"""Return the absolute URL of a path."""
return request.build_absolute_uri(path)
据我所知,目前,mozilla_django_oidc 不使用主机名,而是主机 header 的值;并重定向到 IP——因为重定向 URI (http://django:8000/oidc/callback/
) 中的端口也不同于 8080,我猜你使用的是反向代理,它不会将主机 header 传递给后端服务器。
对于 nginx,proxy_set_header Host $host ;
可能有帮助,其他反向代理可能有类似的设置。
我想将 Keycloak 集成到 Django 项目中,我正在使用 mozilla_django_oidc 来实现。
我遇到的问题是,当我向 keycloak 的授权端点发送请求时,redirect_uri
被设置为:redirect_uri=http%3A%2F%2Fdjango%3A8000%2Foidc%2Fcallback%2F
,但应该是 django
我的应用程序的 IP。不知道为什么用django作为域名
我在 settings.py
中的配置如下所示:
OIDC_RP_CLIENT_ID = os.environ['OIDC_RP_CLIENT_ID']
OIDC_RP_CLIENT_SECRET = os.environ['OIDC_RP_CLIENT_SECRET']
OIDC_OP_AUTHORIZATION_ENDPOINT = 'http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/auth'
OIDC_OP_TOKEN_ENDPOINT = 'http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/token'
OIDC_OP_USER_ENDPOINT = 'http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/userinfo'
OIDC_OP_JWKS_ENDPOINT = 'http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/certs'
LOGIN_REDIRECT_URL = 'http://172.20.159.83/test'
LOGOUT_REDIRECT_URL = 'http://172.20.159.83/'
而在 urls.py
中是:
path('oidc/', include('mozilla_django_oidc.urls')),
向授权端点请求所有参数:
http://172.20.159.83:8080/auth/realms/Test/protocol/openid-connect/auth?response_type=code&scope=openid+email&client_id=MyApplication&redirect_uri=http%3A%2F%2Fdjango%3A8000%2Foidc%2Fcallback%2F&state=3YxLAg8kX1bC1yTDMqKh8L05bIP5z9cB&nonce=jZ6KEZhk9tWOwdXRSqTUoF8lzg7aLU70
所以,正如标题所说,我怎样才能将 redirect
uri 的 django
部分更改为指向我的应用程序的 IP?这个参数是怎么设置的?
我一直在查看mozilla_django_oidc
的源代码,似乎无法手动设置此参数。相反,它将始终使用发送请求的主机名(在我的例子中确实发生在 django 上)。
这里的代码被剪掉了,对任何想知道的人负责:
reverse_url = self.get_settings('OIDC_AUTHENTICATION_CALLBACK_URL',
'oidc_authentication_callback')
token_payload = {
'client_id': self.OIDC_RP_CLIENT_ID,
'client_secret': self.OIDC_RP_CLIENT_SECRET,
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': absolutify(
self.request,
reverse(reverse_url)
),
}
absolutify 是一个函数,定义为:
def absolutify(request, path):
"""Return the absolute URL of a path."""
return request.build_absolute_uri(path)
据我所知,目前,mozilla_django_oidc 不使用主机名,而是主机 header 的值;并重定向到 IP——因为重定向 URI (http://django:8000/oidc/callback/
) 中的端口也不同于 8080,我猜你使用的是反向代理,它不会将主机 header 传递给后端服务器。
对于 nginx,proxy_set_header Host $host ;
可能有帮助,其他反向代理可能有类似的设置。