Nach weiteren Nachforschungen habe ich es tatsächlich falsch kodiert.
Hier ist, was ich am Ende für die Nachwelt hatte:
return_payload = base64.b64encode(parse.urlencode(kwargs).encode("utf-8"))
h = hmac.new(secret.encode("utf-8"), return_payload, digestmod=hashlib.sha256)
resp = requests.post(
".../admin/users/sync_sso",
data={"sso": return_payload, "sig": h.hexdigest()}
headers={...}
)
Und wenn Sie die Weiterleitung durchführen, stellen Sie sicher, dass Sie diese {“sso”…} mit parse.urlencode kodieren.