NiFi单用户认证下如何通过REST API登录(Java客户端)
解决NiFi 1.20.0单用户认证下Swagger客户端调用API的问题
NiFi的单用户模式既不支持基础认证,也不支持OAuth,所以直接调用setUsername()/setPassword()或者setAccessToken()肯定行不通。要搞定认证,得先通过NiFi的专属登录接口获取有效凭证,再把凭证附加到后续API请求里。
核心思路
单用户模式下有两种可行的认证方式:
- 调用
/nifi-api/access/token获取Bearer Token,后续请求带上Authorization: Bearer <token>头(推荐,NiFi 1.10+版本支持,实现更简洁) - 调用
/login接口获取Session Cookie,后续请求带上Cookie头
Java实现示例
方式1:Bearer Token认证
先用HTTP客户端获取Token,再配置Swagger的ApiClient:
import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; // 1. 获取Bearer Token String nifiBaseUrl = "http://your-nifi-host:port"; String username = "your-single-user-username"; String password = "your-single-user-password"; OkHttpClient loginClient = new OkHttpClient(); RequestBody formBody = new FormBody.Builder() .add("username", username) .add("password", password) .build(); Request loginRequest = new Request.Builder() .url(nifiBaseUrl + "/nifi-api/access/token") .post(formBody) .build(); Response loginResponse = loginClient.newCall(loginRequest).execute(); String authToken = loginResponse.body().string().trim(); // 2. 配置Swagger ApiClient ApiClient client = Configuration.getDefaultApiClient() .setBasePath(nifiBaseUrl) .setVerifyingSsl(false); // 添加Authorization头 client.addDefaultHeader("Authorization", "Bearer " + authToken); // 调用API示例:获取所有处理器 ProcessorsApi processorsApi = new ProcessorsApi(client); ProcessorsEntity processors = processorsApi.getProcessors();
方式2:Session Cookie认证
import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; // 1. 登录获取Session Cookie String nifiBaseUrl = "http://your-nifi-host:port"; String username = "your-single-user-username"; String password = "your-single-user-password"; HttpURLConnection connection = (HttpURLConnection) new URL(nifiBaseUrl + "/login").openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); String postData = "username=" + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8"); try (OutputStream os = connection.getOutputStream()) { byte[] input = postData.getBytes("utf-8"); os.write(input, 0, input.length); } // 提取Session Cookie String sessionCookie = connection.getHeaderField("Set-Cookie"); // 2. 配置Swagger ApiClient ApiClient client = Configuration.getDefaultApiClient() .setBasePath(nifiBaseUrl) .setVerifyingSsl(false); client.addDefaultHeader("Cookie", sessionCookie); // 后续API调用同Token方式
Python示例
import requests from swagger_client import Configuration, ApiClient, ProcessorsApi nifi_base_url = "http://your-nifi-host:port" username = "your-single-user-username" password = "your-single-user-password" # 获取Bearer Token token_response = requests.post( f"{nifi_base_url}/nifi-api/access/token", data={"username": username, "password": password} ) auth_token = token_response.text.strip() # 配置Swagger客户端 config = Configuration() config.host = nifi_base_url config.verify_ssl = False config.api_key["Authorization"] = f"Bearer {auth_token}" config.api_key_prefix["Authorization"] = "" client = ApiClient(config) processors_api = ProcessorsApi(client) processors = processors_api.get_processors()
Go示例
package main import ( "bytes" "fmt" "net/http" "net/http/cookiejar" nifiClient "your-swagger-go-client-package" // 替换为实际生成的Go客户端包路径 ) func main() { nifiBaseUrl := "http://your-nifi-host:port" username := "your-single-user-username" password := "your-single-user-password" // 创建带CookieJar的客户端获取Session Cookie jar, _ := cookiejar.New(nil) httpClient := &http.Client{Jar: jar} loginData := bytes.NewBufferString(fmt.Sprintf("username=%s&password=%s", username, password)) loginReq, _ := http.NewRequest("POST", fmt.Sprintf("%s/login", nifiBaseUrl), loginData) loginReq.Header.Set("Content-Type", "application/x-www-form-urlencoded") httpClient.Do(loginReq) // 配置Swagger客户端 swaggerConfig := nifiClient.NewConfiguration() swaggerConfig.Host = nifiBaseUrl[7:] // 去掉http://前缀,根据实际情况调整 swaggerClient := nifiClient.NewAPIClient(swaggerConfig) // 附加Cookie到默认请求头 sessionCookie := jar.Cookies(loginReq.URL)[0] swaggerClient.DefaultHeader["Cookie"] = fmt.Sprintf("%s=%s", sessionCookie.Name, sessionCookie.Value) // 调用API示例 processors, _, err := swaggerClient.ProcessorsApi.GetProcessors(nil) if err != nil { fmt.Println(err) return } fmt.Println(processors) }
内容的提问来源于stack exchange,提问作者Alain B.
相关产品推荐
相关产品推荐

