我正在编写一个API,用于在Keyclope服务器中创建一个新客户端.我使用Go斗篷包与Keyclope服务器进行交互.起初,我从Go斗篷中传入了访问令牌.登录()func到Go斗篷.CreateClient()并在使用Go斗篷的访问令牌后出现403错误.LoginAdmin()成功了,它确实创建了一个新客户端.那么,是什么使得从Go斗篷返回的访问令牌.登录()失败?

代码:

func main() {

    newClientID := "new_client"

    client := gocloak.NewClient("http://localhost:8080")

    // The access token returned from Login() causes 403 error
    jwt, _ := client.Login(context.Background(), "my-go-service", "vizhhp0qnDGaiq4k0aOzzn4RaaqSwU2b", "master", "admin", "Pa55w0rd")
    _, err := client.CreateClient(context.Background(), jwt.AccessToken, "demorealm", gocloak.Client{ ClientID: &newClientID})

    if err != nil {
        fmt.Println(err.Error())
    }

    // And the access token returned from LoginAdmin() works
    jwt, _ = client.LoginAdmin(context.Background(), "admin", "Pa55w0rd", "master")
    clientID, err := client.CreateClient(context.Background(), jwt.AccessToken, "demorealm", gocloak.Client{ ClientID: &newClientID})

    if err != nil {
        fmt.Println(err.Error())
    } else {
        fmt.Printf("Client %s created", clientID)

    }

}

结果:

403 Forbidden: unknown_error
Client d869fd8d-e5f0-4567-99de-69ccc4403705 created

推荐答案

要使用Keycloak Admin API,尤其是允许创建客户端的Keycloak Admin API,您需要使用admin-cli客户端.

这就是为什么:

jwt, _ = client.LoginAdmin(context.Background(), "admin", "Pa55w0rd", "master")

因为LoginAdmin调用admin cli,而:

jwt, _ := client.Login(context.Background(), "my-go-service", "vizhhp0qnDGaiq4k0aOzzn4RaaqSwU2b", "master", "admin", "Pa55w0rd")

正在从客户端"my go service"请求令牌,该客户端不允许执行对Admin Rest API的调用.因此:

403 Forbidden: unknown_error

如果您查看LoginAdmin实现,您可以确认我所说的:

// LoginAdmin performs a login with Admin client
func (client *gocloak) LoginAdmin(ctx context.Context, username, password, realm string) (*JWT, error) {
    return client.GetToken(ctx, realm, TokenOptions{
        ClientID:  StringP(adminClientID),
        GrantType: StringP("password"),
        Username:  &username,
        Password:  &password,
    })
}

哪里

adminClientID string = "admin-cli"

Go相关问答推荐

Golang内置打印(Ln)函数&S行为怪异

Prometheus 摘要分位数错误

为什么 Go 对于长度为 100k 的切片使用的内存比长度为 100k 的数组要少?

从 wincrypt API 到 Go 的 RC2 解密

未实现的 desc = 未知服务 pb.AuthService 我的简单身份验证服务器上出现错误

Go 中的 YAML 自定义标签

Go 中的 Azure JWT 验证不起作用

动态 SQL 集 Golang

有没有办法约束(通用)类型参数?

无法使用 gocsv 读取引用字段

如何在时间范围内规范化数组的元素?

如何编写一个以字符串或错误为参数的通用函数?

Golang模板无法访问embedFS中的文件

Golang Getrlimit 返回与 ulimit 不同的值

函数超时和 goroutine 泄漏

级联调用泛型函数时的泛型类型推断

vs 代码调试 go 测试不通过标志

如何在golang中使用ozzo验证进行时间最大验证

在 Golang 中使用 OR 条件验证 struct 的两个字段

Dynamodb.ScanInput - 不能使用expr.Names()(类型 map[string]*string)作为类型 map[string]string