1

我有一个运行 Keycloak 的身份验证服务器,以及一个带有 mod_auth_openidc 的 Apache2 网络服务器来进行 OAuth2 授权。

使用浏览器,我可以成功拦截对受保护资源的访问,以将用户重定向到 Keycloak 登录页面。成功登录后,用户将被重定向到资源链接。

使用 Postman,我还可以通过密码授予流程检索访问令牌 JWT,然后使用访问令牌访问受保护的资源。postman 提供的 cURL 代码表明 mod_auth_openidc_session cookie 也是必需的。

接下来,我尝试在 Linux CLI 中执行 2 阶段 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

谁能告诉我我在 2 阶段 cURL 身份验证/授权过程中做错了什么?

4

1 回答 1

2

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' 

或者,如果您需要围绕令牌使用双引号,请使用以下命令:

--header "Authorization: Bearer \"$access_token\""

旁注:为了不覆盖现有的 cookie cookie.jar,请使用不同的文件名来存储从请求到授权文件的 cookie。

于 2020-10-27T09:17:19.360 回答