问题描述
我有一个运行Keycloak的身份验证服务器,以及一个具有mod_auth_openidc的Apache2 Web服务器来进行OAuth2授权。
使用浏览器,我可以成功拦截对受保护资源的访问,以将用户重定向到Keycloak登录页面。成功登录后,用户将被重定向到资源链接。
使用Postman,我还可以使用密码授予流检索访问令牌JWT,然后使用访问令牌来访问受保护的资源。邮递员提供的cURL代码表明还需要mod_auth_openidc_session cookie。
接下来,我尝试在Linux CLI中执行两阶段cURL命令。
首先,我使用如下所示的密码授予流程检索访问令牌。我启动了cookie引擎来捕获由mod_auth_openidc给出的会话cookie。
# RETRIEVE ACCESS TOKEN JSON
curl -L -b ./cookie.jar -c ./cookie.jar -d 'client_id=CLIENT_ID' -d 'client_secret=368127b1-1ee0-4f3f-8429-29e9a93daf9a' -d 'username=USERNAME' -d 'password=PASSWORD' -d 'grant_type=password' 'https://AUTH_SERVER:PORT/auth/realms/REALM/protocol/openid-connect/token
# PARSE ACCESS TOKEN
access_token=`echo $response|jq '.access_token'|cut -d\" -f2`
接下来,在标头和cookie jar文件中使用访问令牌承载,我尝试访问受保护的资源。
curl -b ./cookie.jar -c ./cookie.jar --insecure -L -X GET 'https://RESOURCE_SERVER:PORT/protected_content' --header "'Authorization: Bearer "$access_token"'"
但是,我仍然重定向到Keycloak登录页面,并且会话cookie没有记录在cookie jar文件中。
这是已记录的cookie jar文件,其中已删除/替换了敏感信息。
# netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
#HttpOnly_[AUTH_SERVER] FALSE /auth/realms/master/ TRUE 0 KC_RESTART eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI2Y2ZiNjYwOC1kMTlhLTQwZGUtOWJiYS04NzcxOTkzZTIwMWUifQ.eyJjaWQi[REDACTED]4aHhkVDBGZmhBZEVTSm8iLCJub25jZSI6IndTYXNYOWhGeGIxd1hKakNrS2FLMXVadVRGX3ZOZzRGVUZnMTJyYXFWbVkifX0.53645krpwlFnJ09cHAcZhNCci-DhGigu4soN5CVsZQ0
#HttpOnly_[AUTH_SERVER] FALSE /auth/realms/master/ TRUE 0 AUTH_SESSION_ID_LEGACY 6a23b139-05ba-4d22-b9e3-9ae857074814.[AUTH_SERVER]
#HttpOnly_[AUTH_SERVER] FALSE /auth/realms/master/ TRUE 0 AUTH_SESSION_ID 6a23b139-05ba-4d22-b9e3-9ae857074814.[AUTH_SERVER]
#HttpOnly_[RESOURCE_SERVER] FALSE / TRUE 0 mod_auth_openidc_state_XGEq0YKJAwSt8hxdT0FfhAdESJo NVc9Mk1FmN[REDACTED]lydKVtOw0iL-Y9iZMjzcUinutFPn74rmVvI_ERV3C8Wn1Euio8pID0jEAmu9NEfY_MEeuzOzqe6w7I20HZUNQHX0uh_vXR8
谁能告诉我在两阶段cURL身份验证/授权过程中我做错了什么?
解决方法
设置Authorization
标头时,双引号内有单引号。这意味着不是期望Authorization: Bearer token
服务器正在获得'Authorization: Bearer token'
。您可以使用详细的-v
选项来检查标题的内容。
以下命令应该可以正常工作:
curl --header "Authorization: Bearer $access_token" -b ./cookie.jar -c ./cookie.jar --insecure -L -X GET https://RESOURCE_SERVER:PORT/protected_content'
(可选)如果您需要围绕令牌使用两次qoutes,请执行以下操作:
--header "Authorization: Bearer \"$access_token\""
旁注:为了不覆盖cookie.jar
中的现有cookie,请使用其他文件名来存储从请求到授权文件的cookie。