Golang实现Keycloak身份验证的REST API示例

Golang实现Keycloak身份验证的REST API示例 我正在尝试使用下面提到的代码访问 Keycloak 用户认证。

package main

import (
	"context"
	"fmt"

	"github.com/Nerzal/gocloak/v9"
)

func main() {
	// Keycloak 配置
	keycloak := gocloak.NewClient("http://localhost:8080/auth")
	realm := "myrealm"
	clientID := "myapp-client"
	username := "myuser"
	password := "user-password" // 用户的实际密码

	// 使用 ROPC(资源所有者密码凭证)对用户进行身份验证
	token, err := keycloak.Login(context.TODO(), clientID, clientSecret, realm, username, password)
	if err != nil {
		fmt.Println("Error authenticating:", err)
		return
	}

	// 使用获取的访问令牌进行进一步的 API 请求
	fmt.Println("Access Token:", token.AccessToken)
}

但是遇到了以下错误:

Error authenticating: 404 Not Found: RESTEASY003210: Could not find resource for full path: http://localhost:8080/auth/auth/realms/myrealm/protocol/openid-connect/token

请帮忙。


更多关于Golang实现Keycloak身份验证的REST API示例的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

非常感谢。一个curl命令和一个修改后的URL对我有效。

keycloakURL := "http://localhost:8080/realms/{realm_name}/protocol/openid-connect/token"

更多关于Golang实现Keycloak身份验证的REST API示例的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据你的错误信息,问题在于Keycloak的URL路径配置不正确。错误显示Keycloak尝试访问的路径包含重复的/auth部分。以下是修正后的代码:

package main

import (
	"context"
	"fmt"

	"github.com/Nerzal/gocloak/v13" // 建议使用最新版本
)

func main() {
	// Keycloak配置 - 注意URL结尾不要有/auth
	keycloakURL := "http://localhost:8080" // 或者 "http://localhost:8080/auth"
	client := gocloak.NewClient(keycloakURL)
	
	realm := "myrealm"
	clientID := "myapp-client"
	clientSecret := "" // 如果是public客户端,留空
	username := "myuser"
	password := "user-password"

	// 使用ROPC进行身份验证
	ctx := context.Background()
	token, err := client.Login(ctx, clientID, clientSecret, realm, username, password)
	if err != nil {
		fmt.Printf("Error authenticating: %v\n", err)
		return
	}

	fmt.Printf("Access Token: %s\n", token.AccessToken)
	fmt.Printf("Refresh Token: %s\n", token.RefreshToken)
	fmt.Printf("Expires In: %d\n", token.ExpiresIn)
}

如果你的Keycloak版本较新(v17+),可能需要调整配置:

package main

import (
	"context"
	"fmt"

	"github.com/Nerzal/gocloak/v13"
)

func main() {
	// Keycloak v17+ 配置
	keycloakURL := "http://localhost:8080"
	client := gocloak.NewClient(keycloakURL)
	
	// 对于新版本Keycloak,可能需要设置自定义的realms路径
	client.RESTClient().SetBasePath("/") // 或者 "/auth/" 根据你的配置
	
	realm := "myrealm"
	clientID := "myapp-client"
	clientSecret := "your-client-secret" // 如果是confidential客户端
	username := "myuser"
	password := "user-password"

	ctx := context.Background()
	
	// 或者使用LoginOtp方法(如果需要MFA)
	token, err := client.Login(ctx, clientID, clientSecret, realm, username, password)
	if err != nil {
		// 更详细的错误处理
		fmt.Printf("Authentication failed: %+v\n", err)
		
		// 检查Keycloak端点是否可达
		serverInfo, infoErr := client.GetServerInfo(ctx, token.AccessToken)
		if infoErr != nil {
			fmt.Printf("Cannot reach Keycloak: %v\n", infoErr)
		} else {
			fmt.Printf("Keycloak version: %s\n", serverInfo.SystemInfo.Version)
		}
		return
	}

	// 验证令牌
	_, err = client.DecodeAccessToken(ctx, token.AccessToken, realm, "")
	if err != nil {
		fmt.Printf("Token validation failed: %v\n", err)
		return
	}

	fmt.Printf("Authentication successful!\n")
	fmt.Printf("Access Token: %s\n", token.AccessToken)
}

要调试URL问题,可以添加以下代码检查实际请求的URL:

// 在调用Login之前,可以手动测试端点
testURL := fmt.Sprintf("%s/realms/%s/protocol/openid-connect/token", 
    strings.TrimSuffix(keycloakURL, "/"), realm)
fmt.Printf("Testing endpoint: %s\n", testURL)

// 或者使用gocloak的REST客户端直接测试
restyClient := client.RESTClient()
restyClient.SetDebug(true) // 启用调试模式查看实际请求

确保你的Keycloak服务器正在运行,并且realm、client配置正确。对于public客户端,clientSecret应为空字符串;对于confidential客户端,需要提供正确的clientSecret。

回到顶部