我正在设置一个Nginx反向代理,该代理基于路径将请求路由到各种后端微服务。另外,在路由请求之前,我希望Nginx验证在请求标头中传递的oauth令牌的有效性。我将Keycloak用作oauth服务器,尽管我可以从其他应用程序(和邮递员)内省令牌,但我发现很难在Nginx中实现。
nginx.conf
map $http_authorization $token {
~*^Bearer\s+([\S]+)$ $1;
}
location / {
auth_request /auth;
error_page 401 =401 /auth;
proxy_pass http://backend-api/;
}
令牌验证块
location = /auth {
# internal;
gunzip on;
proxy_method POST;
proxy_set_header Authorization "Basic base64encoded-uid-pwd";
proxy_set_header Content-Type "application/x-www-form-urlencoded";
proxy_set_body "token=$token";
proxy_pass https://keycloak-server/auth/realms/myrealm/protocol/openid-connect/token/introspect;
# proxy_cache token_responses; # Enable caching of token introspection responses
# proxy_cache_key $access_token; # Cache the response for each unique access token
# proxy_cache_lock on; # Don't allow simultaneous requests for same token
# proxy_cache_valid 200 10s; # How long to use cached introspection responses
# proxy_cache_use_stale error timeout; # Use old responses if we cannot reach the server
# proxy_ignore_headers Cache-Control Expires Set-Cookie; # Cache even when receiving these
}
Nginx将请求发送到Keycloak服务器,我已经验证了日志,但是从Keycloak得到了以下错误响应
{
"active": false
}
我发现此错误是由于令牌未正确作为请求中的主体参数传递的。脚本中我缺少什么?实际上,我只需要使用Authorization
标头中传递的auth令牌,并将其传递到body参数中的Keycloak服务器。
PS:Keycloak希望在x-www-form-urlencoded
主体中将oauth令牌作为参数作为token
。