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 参数。

我执行的步骤如下:

  1. 生成 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
}
  1. 检查返回的令牌以检查其是否有效:
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"
}
  1. 现在这是我在尝试交换令牌时遇到错误的地方:
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 但它没有多大帮助。

感谢收到任何帮助!谢谢史蒂夫

呸!总是这样,发布问题后你设法解决了!

好的,这就是我需要做的:

  1. 导航到领域 > [RealmName] > 脚本

  2. 将“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)"))))
  1. 验证并保存更改

  2. 导航到领域 > [RealmName] > 服务 > OAuth 2.0 提供者

  3. 将“核心”选项卡底部的两个“.. Token May Act Script”下拉菜单设置为新修改的“OAuth2 May Act”脚本

  4. 重新生成访问令牌并重复令牌交换调用,它应该可以正常工作