ForgeRock - 无效的令牌交换
ForgeRock - Invalid Token Exchange
我在 MacOS 11.5.2 (Big Sur) 上使用 Docker v3.6.0 中的 运行 ForgeRock v7.1.0。
我正在尝试交换一个 OAuth 2.0 访问令牌(主题令牌)我已经检索到一个 ID 令牌(带有 JWT 有效负载)并且每次调用它时都会给我一个错误,特别是相关的我相信 subject_token_type
参数。
我执行的步骤如下:
- 生成 OAuth2 访问令牌:
curl --location --request POST 'http://am.example.com:8080/am/oauth2/realms/root/access_token' \
--header 'Authorization: Basic c3RldmU6cGFzc3dvcmQ=' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=user1' \
--data-urlencode 'password=7fYCi0Frhcq5p3gCXGxJ2B' \
--data-urlencode 'scope=cn'
其中returns以下:
{
"access_token": "BS8vVbJ4EEygzdEE3jQH-xsKW9w",
"scope": "cn",
"token_type": "Bearer",
"expires_in": 3599
}
- 检查返回的令牌以检查其是否有效:
curl --location --request POST 'http://am.example.com:8080/am/oauth2/realms/root/introspect?token=BS8vVbJ4EEygzdEE3jQH-xsKW9w' \
--header 'Authorization: Basic c3RldmU6cGFzc3dvcmQ='
其中returns以下:
{
"active": true,
"scope": "cn",
"realm": "/",
"client_id": "steve",
"user_id": "user1",
"token_type": "Bearer",
"exp": 1629990663,
"sub": "(usr!user1)",
"subname": "user1",
"iss": "http://am.example.com:8080/am/oauth2",
"auth_level": 0,
"authGrantId": "whjnenzHCH96TyaxfuefiOcBfm8",
"auditTrackingId": "4d353b7e-6cd5-4289-884a-39c50396ed0c-116027"
}
- 现在这是我在尝试交换令牌时遇到错误的地方:
curl --location --request POST 'http://am.example.com:8080/am/oauth2/realms/root/access_token' \
--header 'Authorization: Basic c3RldmU6cGFzc3dvcmQ=' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:access_token' \
--data-urlencode 'subject_token=BS8vVbJ4EEygzdEE3jQH-xsKW9w' \
--data-urlencode 'scope=cn' \
--data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:id_token'
这给了我错误:
{
"error_description": "Invalid token exchange.",
"error": "invalid_request"
}
如果我不指定 subject_token_type
,它会给我错误:
{
"error_description": "Subject token type is required.",
"error": "invalid_request"
}
这让我相信要么我使用了错误的类型,要么在我的本地 ForgeRock 实例中设置不正确。
我已经查看了此处描述的错误响应可能性:https://backstage.forgerock.com/docs/am/7.1/oauth2-guide/token-exchange-flows.html 但它没有多大帮助。
感谢收到任何帮助!谢谢史蒂夫
呸!总是这样,发布问题后你设法解决了!
好的,这就是我需要做的:
导航到领域 > [RealmName] > 脚本
将“OAuth 2.0 May Act”Groovy 脚本修改为如下内容(酌情更改):
import org.forgerock.json.JsonValue
token.setMayAct(
JsonValue.json(JsonValue.object(
JsonValue.field("client_id", "steve"),
JsonValue.field("sub", "(usr!user1)"))))
验证并保存更改
导航到领域 > [RealmName] > 服务 > OAuth 2.0 提供者
将“核心”选项卡底部的两个“.. Token May Act Script”下拉菜单设置为新修改的“OAuth2 May Act”脚本
重新生成访问令牌并重复令牌交换调用,它应该可以正常工作
我在 MacOS 11.5.2 (Big Sur) 上使用 Docker v3.6.0 中的 运行 ForgeRock v7.1.0。
我正在尝试交换一个 OAuth 2.0 访问令牌(主题令牌)我已经检索到一个 ID 令牌(带有 JWT 有效负载)并且每次调用它时都会给我一个错误,特别是相关的我相信 subject_token_type
参数。
我执行的步骤如下:
- 生成 OAuth2 访问令牌:
curl --location --request POST 'http://am.example.com:8080/am/oauth2/realms/root/access_token' \
--header 'Authorization: Basic c3RldmU6cGFzc3dvcmQ=' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=user1' \
--data-urlencode 'password=7fYCi0Frhcq5p3gCXGxJ2B' \
--data-urlencode 'scope=cn'
其中returns以下:
{
"access_token": "BS8vVbJ4EEygzdEE3jQH-xsKW9w",
"scope": "cn",
"token_type": "Bearer",
"expires_in": 3599
}
- 检查返回的令牌以检查其是否有效:
curl --location --request POST 'http://am.example.com:8080/am/oauth2/realms/root/introspect?token=BS8vVbJ4EEygzdEE3jQH-xsKW9w' \
--header 'Authorization: Basic c3RldmU6cGFzc3dvcmQ='
其中returns以下:
{
"active": true,
"scope": "cn",
"realm": "/",
"client_id": "steve",
"user_id": "user1",
"token_type": "Bearer",
"exp": 1629990663,
"sub": "(usr!user1)",
"subname": "user1",
"iss": "http://am.example.com:8080/am/oauth2",
"auth_level": 0,
"authGrantId": "whjnenzHCH96TyaxfuefiOcBfm8",
"auditTrackingId": "4d353b7e-6cd5-4289-884a-39c50396ed0c-116027"
}
- 现在这是我在尝试交换令牌时遇到错误的地方:
curl --location --request POST 'http://am.example.com:8080/am/oauth2/realms/root/access_token' \
--header 'Authorization: Basic c3RldmU6cGFzc3dvcmQ=' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:access_token' \
--data-urlencode 'subject_token=BS8vVbJ4EEygzdEE3jQH-xsKW9w' \
--data-urlencode 'scope=cn' \
--data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:id_token'
这给了我错误:
{
"error_description": "Invalid token exchange.",
"error": "invalid_request"
}
如果我不指定 subject_token_type
,它会给我错误:
{
"error_description": "Subject token type is required.",
"error": "invalid_request"
}
这让我相信要么我使用了错误的类型,要么在我的本地 ForgeRock 实例中设置不正确。
我已经查看了此处描述的错误响应可能性:https://backstage.forgerock.com/docs/am/7.1/oauth2-guide/token-exchange-flows.html 但它没有多大帮助。
感谢收到任何帮助!谢谢史蒂夫
呸!总是这样,发布问题后你设法解决了!
好的,这就是我需要做的:
导航到领域 > [RealmName] > 脚本
将“OAuth 2.0 May Act”Groovy 脚本修改为如下内容(酌情更改):
import org.forgerock.json.JsonValue
token.setMayAct(
JsonValue.json(JsonValue.object(
JsonValue.field("client_id", "steve"),
JsonValue.field("sub", "(usr!user1)"))))
验证并保存更改
导航到领域 > [RealmName] > 服务 > OAuth 2.0 提供者
将“核心”选项卡底部的两个“.. Token May Act Script”下拉菜单设置为新修改的“OAuth2 May Act”脚本
重新生成访问令牌并重复令牌交换调用,它应该可以正常工作