首页 > 解决方案 > 无法通过 Python 在 Keycloak 中创建 usr

问题描述

我正在尝试创建一个简单的类来包装 Keycloak REST API(比如说创建一个用户),它在使用时工作正常,curl但在使用 Python Requests 库时不起作用。它可以很好地获取令牌,但是在尝试访问 createUser 端点时出现 400“unknown_error”。我最初的想法是这与我在 requests.post 中关闭 SSL 验证有关,但我不确定。谢谢!

这是成功的shell脚本:

#!/bin/bash

TOKEN=$(curl --location --request POST 'https://www.<KEYCLOAK_SERVER>.com/auth/realms/kaizo/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=client_credentials' \
    --data-urlencode 'client_id=admin-cli' \
    --data-urlencode 'client_secret=<SECRET>')

ACCESS_TOKEN=$(echo $TOKEN | jq -j '.access_token')

RESPONSE=$(curl --location --request POST 'https://www.titancloak.com/auth/admin/realms/kaizo/users' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer '${ACCESS_TOKEN} \
    --data-raw '{"firstName":"Bloodhound", "lastName":"Gang", "email":"u2jds7d@ase.edu", "username":"tra.la.la"}')

echo $RESPONSE

这是不起作用的 Python 代码。

#!/usr/bin/python3

import requests

BASE_URL = "https://www.<KEYCLOAK_SERVER>.com"
def get_token():
    url = BASE_URL + "/auth/realms/kaizo/protocol/openid-connect/token"
    data = {
       "grant_type": "client_credentials",
       "client_id": "admin-cli",
       "client_secret": "<SECRET>"
    }
    response = requests.post(
        url,
        data,
        verify=False
    ).json()
    return response.get('access_token')

def create_user(token: str):
    url = BASE_URL + "/auth/admin/realms/kaizo/users"
    data = {
        "firstName":"jon",
        "lastName":"Snow",
        "email":"mkm29@case.edu",
        "username":"jon.snow"
    }
    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json",
        'Accept': 'application/json'
    }

    response = requests.post(
        url,
        data=data,
        verify=False,
        headers=headers
    ) # cert=("/Users/mitchellmurphy/Developer/ans/flaskql/app/authentication/titancloak.crt")
    return response

if __name__ == '__main__':
    token = get_token()
    print(token[:25])
    user = create_user(token)
    print('Response[%s]: %s ' % (user.status_code, user.json()))

标签: sslpython-requestskeycloakpython-3.8

解决方案


解决方案是更改发送到 Keyloak 的数据格式,如下所示:data=json.dumps(data)


推荐阅读