📜  使用接收到的访问令牌检索 Keycloak 用户数据 (1)

📅  最后修改于: 2023-12-03 15:22:24.190000             🧑  作者: Mango

使用接收到的访问令牌检索 Keycloak 用户数据

若你正在使用 Keycloak 来管理用户身份验证和授权,那么你可能需要从数据库或 API 中检索到已认证用户的数据。本文将介绍如何使用接收到的访问令牌来检索 Keycloak 用户数据。

在接入 Keycloak API 前,请确保你已经完成身份验证并获得一个有效的访问令牌。访问令牌以 JWT 格式存储,其中包含了用户的身份信息以及一些访问权限。

首先,你需要将访问令牌解码并读取其中的信息。可以使用下面的代码片段来解码 JWT:

import jwt

def decode_token(token):
    decoded = jwt.decode(token, verify=False)
    return decoded

解码过后,你应该能够得到如下格式的数据:

{
  "jti": "f1b3cb12-9c8e-426b-8651-8703e7d1a974",
  "exp": 1630668517,
  "iat": 1630664917,
  "iss": "http://localhost:8080/auth/realms/demo",
  "aud": "account",
  "sub": "1a5e6b6c-b416-44db-9270-03770db770a9",
  "typ": "Bearer",
  "azp": "demo-app",
  "session_state": "c8bc2494-2b91-4f1f-b77b-0edc70e50e10",
  "acr": "1",
  "allowed-origins": [
    "http://localhost:8080"
  ],
  "realm_access": {
    "roles": [
      "offline_access",
      "uma_authorization"
    ]
  },
  "resource_access": {
    "account": {
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    }
  },
  "scope": "openid email profile"
}

其中,sub 字段保存了用户的唯一标识,可以用来从数据库中检索出用户数据。接下来,你可以使用 Keycloak 的 REST API 来检索用户数据。这需要你了解 Keycloak API 的使用方式,在此不再阐述。

在 API 的调用过程中,你需要将访问令牌传递给 Keycloak 以验证用户的身份。下面是一个示例代码:

import requests

def get_user_data(token, user_id):
    headers = {'Authorization': f'Bearer {token}'}
    url = f'http://localhost:8080/auth/realms/demo/users/{user_id}'
    response = requests.get(url, headers=headers)
    return response.json()

此代码会向 Keycloak 的 /users API 发送一个 GET 请求,其中包括了访问令牌以及要检索的用户 ID。注意到我们在 headers 中传递了访问令牌,因此可以通过 API 获得访问鉴权。

如果一切正常,在 API 的响应中,你可以获得用户的详细信息,例如用户名、电子邮件和角色列表等:

{
  "id": "1a5e6b6c-b416-44db-9270-03770db770a9",
  "createdTimestamp": 1630664917605,
  "username": "john",
  "enabled": true,
  "totp": false,
  "emailVerified": false,
  "firstName": "John",
  "lastName": "Doe",
  "email": "john@example.com",
  "attributes": {},
  "disableableCredentialTypes": [
    "password"
  ],
  "requiredActions": [],
  "notBefore": 0,
  "access": {
    "manageGroupMembership": true,
    "view": true,
    "mapRoles": true,
    "impersonate": false,
    "manage": false
  }
}

这样,你就可以通过接收到的访问令牌,从 Keycloak 中检索出已认证用户的数据了。

结论

使用接收到的访问令牌,可以方便地实现对 Keycloak 数据库或 API 的访问,以获取已认证用户的数据。我们在本文中介绍了如何解码 JWT、使用 API 以及传递访问令牌以获取 Keycloak 用户数据。如果你正在进行 Keycloak 的开发,希望对本文中的代码片段进行修改或扩展,以满足你的需求。