ユーザーは1つ以上のグループに追加することができます。Yellowfin内のグループは主に、コンテンツへのアクセスを定義したり、コンテンツのブロードキャストをするために使用されます。グループを使用することで、個々のユーザーを扱うよりも便利になります。
グループ定義は、コンポーネントにより定義されます。これは、個々のユーザーであったり、他のグループやLDAPグループ、ロールなどの複数のユーザーを表すコンポーネントであったりします。
REST APIは、グループコンポーネントを管理し、拡張されたグループコンポーネントの結果となるグループメンバーを取得できます。
プログラムで新しいユーザーをオンボーディングする場合、外部基準に基づいて特定のコンテンツへのアクセス権を新しいユーザーに付与する必要がある場合があります。ユーザーは、Yellowfinが接続されているホストアプリケーションのモジュールにアクセスできます。このモジュールにアクセスすることで、特定のドメインに関連するレポートにアクセスできます。例えば、財務モジュールへのアクセス権を持つユーザーを「財務ユーザー」グループに追加し、そのグループに財務に関連するすべてのレポートやダッシュボードへのアクセス権を付与できます。
グループメンバーシップは、ユーザーのオンボーディング時に実装することができますが、ユーザーのアクセスが任意に変更される可能性がある場合、グループメンバーシップを定期的に更新する必要があります。これを実装するには、様々な方法があります。遅延パラダイムでは、ユーザーがYellowfinにアクセスしようとすると、グループメンバーシップが更新されます。これは、SSO ログインプロセスの一部とすることができます。または、ホストアプリケーションでユーザーの権限が変更されたときに、グループメンバーを直接更新することもできます。
グループの一覧化
グループの一覧は、GET /api/user-groups エンドポイント User Groups から取得できます。これは、グループが既に存在するかどうかを確認したり、名前のような別の識別子でグループを検索したりするためにも使用できます。
以下の例では、様々なプログラミング言語でユーザーのグループ一覧を取得する方法を示しています。
package rest.code.examples; import java.io.IOException; import java.util.Random; import org.apache.hc.client5.http.fluent.Content; import org.apache.hc.client5.http.fluent.Request; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; /** * Create a user using the Yellowfin REST API */ public class ListUserGroups { public static void main(String[] args) throws Exception { System.out.println(""List Groups""); String host = ""http://localhost:8080/Yellowfin""; String restUsername = ""admin@yellowfin.com.au""; String restPassword = ""test""; String token = generateToken(host, restUsername, restPassword); Content c = Request.get(host + ""/api/user-groups"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement groupList = jsonObject.get(""items""); JsonArray groups = groupList.getAsJsonArray(); System.out.println(groups.size() + "" groups retrieved.""); for (int i=0; i < groups.size(); i++ ) { JsonObject group = groups.getAsJsonArray().get(i).getAsJsonObject(); System.out.println(""Group "" + group.get(""userGroupId"").getAsInt() + "": "" + group.get(""shortDescription"").getAsString()); } } /* * This function generates an access token for a user that will grant them access to * call REST API endpoints. */ public static String generateToken(String host, String username, String password) throws IOException { Content c = Request.post(host + ""/api/refresh-tokens"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong()) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .bodyString(""{ \""userName\"": \""""+ username + ""\"",\""password\"": \""""+ password + ""\""}"", null) .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement accessToken = jsonObject.getAsJsonObject(""_embedded"").getAsJsonObject(""accessToken"").get(""securityToken""); if (accessToken!=null) { System.out.println(""Access Token: "" + accessToken); } else { System.out.println(""Token not retrieved successfully""); System.exit(-1); } return accessToken.getAsString(); } }
using System.Net.Http.Headers; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace YellowfinAPIExamples { public class ListUserGroups { static async Task Main(string[] args) { Console.WriteLine(""List Groups""); string host = ""http://localhost:8080/Yellowfin""; string restUsername = ""admin@yellowfin.com.au""; string restPassword = ""test""; string token = await GenerateToken(host, restUsername, restPassword); using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", ""ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "" , nonce="" + new Random().NextInt64() + "", token="" + token); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await httpClient.GetAsync(host + ""/api/user-groups""); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseBody); JArray groups = (JArray)jsonObject[""items""]; Console.WriteLine(groups.Count + "" groups retrieved.""); foreach (JObject group in groups) { Console.WriteLine(""Group "" + group[""userGroupId""] + "": "" + group[""shortDescription""]); } } else { Console.WriteLine(""Failed to retrieve user groups. Status code: "" + response.StatusCode); } } } static async Task<string> GenerateToken(string host, string restUsername, string restPassword) { using (var httpClient = new HttpClient()) { // Generate nonce long nonce = new Random().NextInt64(); // Create HTTP request var request = new HttpRequestMessage(HttpMethod.Post, host + ""/api/refresh-tokens""); request.Headers.Add(""Authorization"", ""YELLOWFIN ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "", nonce="" + nonce); request.Headers.Add(""Accept"", ""application/vnd.yellowfin.api-v1+json""); request.Content = new StringContent( JsonConvert.SerializeObject(new { userName = restUsername, password = restPassword }), System.Text.Encoding.UTF8, ""application/json"" ); // Send request and get response HttpResponseMessage response = await httpClient.SendAsync(request); if (response.IsSuccessStatusCode) { string responseContent = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseContent); string accessToken = jsonObject[""_embedded""][""accessToken""][""securityToken""].ToString(); if (!string.IsNullOrEmpty(accessToken)) { Console.WriteLine(""Access Token: "" + accessToken); return accessToken; } } else { Console.WriteLine(""Token not retrieved successfully. Status code: "" + response.StatusCode); } Environment.Exit(-1); return null; // Just to satisfy compiler, this won't be reached. } } } }
package main import ( ""bytes"" ""encoding/json"" ""fmt"" ""io/ioutil"" ""math/rand"" ""net/http"" ""time"" ) func main() { host := ""http://localhost:8080/Yellowfin"" restUsername := ""admin@yellowfin.com.au"" restPassword := ""test"" token, err := generateToken(host, restUsername, restPassword) if err != nil { fmt.Println(""Error generating token:"", err) return } fmt.Println(""List Groups"") client := &http.Client{} req, err := http.NewRequest(""GET"", host+""/api/user-groups"", nil) if err != nil { fmt.Println(""Error creating request:"", err) return } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { fmt.Println(""Error sending request:"", err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(""Error reading response body:"", err) return } var jsonResponse map[string]interface{} err = json.Unmarshal(body, &jsonResponse) if err != nil { fmt.Println(""Error parsing JSON response:"", err) return } groupList := jsonResponse[""items""].([]interface{}) groups := make([]map[string]interface{}, len(groupList)) for i, v := range groupList { groups[i] = v.(map[string]interface{}) } fmt.Printf(""%d groups retrieved.\n"", len(groups)) for _, group := range groups { fmt.Printf(""Group %v: %v\n"", group[""userGroupId""], group[""shortDescription""]) } } func generateToken(host, username, password string) (string, error) { nonce := rand.Int63() requestBody, err := json.Marshal(map[string]string{ ""userName"": username, ""password"": password, }) if err != nil { return """", err } client := &http.Client{} req, err := http.NewRequest(""POST"", host+""/api/refresh-tokens"", bytes.NewBuffer(requestBody)) if err != nil { return """", err } req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d"", time.Now().UnixMilli(), nonce)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return """", err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return """", err } var jsonResponse map[string]interface{} err = json.Unmarshal(body, &jsonResponse) if err != nil { return """", err } accessToken, ok := jsonResponse[""_embedded""].(map[string]interface{})[""accessToken""].(map[string]interface{})[""securityToken""].(string) if !ok { return """", fmt.Errorf(""Token not retrieved successfully"") } return accessToken, nil }
const fetch = require(""node-fetch""); async function main() { console.log(""List Groups""); const host = ""http://localhost:8080/Yellowfin""; const restUsername = ""admin@yellowfin.com.au""; const restPassword = ""test""; const token = await generateToken(host, restUsername, restPassword); const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups`, { headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const responseBody = await response.json(); const groups = responseBody.items; console.log(`${groups.length} groups retrieved.`); groups.forEach(group => { console.log(`Group ${group.userGroupId}: ${group.shortDescription}`); }); } catch (error) { console.error(""Error:"", error.message); } } async function generateToken(host, username, password) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; const body = JSON.stringify({ userName: username, password: password }); try { const response = await fetch(`${host}/api/refresh-tokens`, { method: 'POST', headers: headers, body: body }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonResponse = await response.json(); const accessToken = jsonResponse._embedded.accessToken.securityToken; if (accessToken) { console.log(`Access Token: ${accessToken}`); return accessToken; } else { console.log(""Token not retrieved successfully""); process.exit(-1); } } catch (error) { console.error(""Error:"", error.message); } return null; } main();
<?php function main() { echo ""List Groups\n""; $host = ""http://localhost:8080/Yellowfin""; $restUsername = ""admin@yellowfin.com.au""; $restPassword = ""test""; try { $token = generateToken($host, $restUsername, $restPassword); } catch (Exception $e) { echo ""Error generating token: "" . $e->getMessage(); return; } $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); try { $response = httpRequest('GET', ""$host/api/user-groups"", $headers); $jsonResponse = json_decode($response, true); $groups = $jsonResponse[""items""]; echo count($groups) . "" groups retrieved.\n""; foreach ($groups as $group) { echo ""Group "" . $group[""userGroupId""] . "": "" . $group[""shortDescription""] . ""\n""; } } catch (Exception $e) { echo ""Error sending request: "" . $e->getMessage(); } } function generateToken($host, $restUsername, $restPassword) { $nonce = mt_rand(); $requestBody = json_encode(array( ""userName"" => $restUsername, ""password"" => $restPassword )); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('POST', ""$host/api/refresh-tokens"", $headers, $requestBody); $jsonResponse = json_decode($response, true); if (isset($jsonResponse[""_embedded""][""accessToken""][""securityToken""])) { $accessToken = $jsonResponse[""_embedded""][""accessToken""][""securityToken""]; echo ""Access Token: "" . $accessToken; return $accessToken; } else { throw new Exception(""Token not retrieved successfully""); } } function httpRequest($method, $url, $headers, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($data !== null) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception('Error: ' . curl_error($ch)); } curl_close($ch); return $response; } main(); ?>
import json import random import time import requests def main(): print(""List Groups"") host = ""http://localhost:8080/Yellowfin"" rest_username = ""admin@yellowfin.com.au"" rest_password = ""test"" try: token = generate_token(host, rest_username, rest_password) # Create headers nonce = random.randint(0, 2 ** 63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } # Send request to get user groups response = requests.get(host + ""/api/user-groups"", headers=headers) response.raise_for_status() # Parse response groups = response.json()[""items""] print(f""{len(groups)} groups retrieved."") # Print group details for group in groups: print(f""Group {group['userGroupId']}: {group['shortDescription']}"") except Exception as e: print(f""Error: {e}"") def generate_token(host, rest_username, rest_password): # Generate nonce nonce = random.randint(0, 2 ** 63 - 1) # Create request body request_body = json.dumps({ ""userName"": rest_username, ""password"": rest_password }) # Create request headers headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } # Send HTTP request response = requests.post(host + ""/api/refresh-tokens"", headers=headers, data=request_body) response.raise_for_status() # Parse JSON response json_response = response.json() access_token = json_response[""_embedded""][""accessToken""][""securityToken""] print(""Access Token:"", access_token) return access_token if __name__ == ""__main__"": main()
ユーザーグループの作成
グループは、POST /api/user-groups エンドポイント Create User Group を使用して作成されます。ユーザーグループ作成のモデルは、以下の通りです。
{ "groupName": "New Group", "groupDescription": "This a new group", "groupStatus": "OPEN", "isSecureGroup": "false" }
グループの作成に成功すると、サービスは新しいグループの一意なuserGroupId を含むユーザーグループモデルを返します。userGroupId は、他のサービスでグループを識別するために使用することができます。このサービスは空のグループを作成します。グループメンバーコンポーネントは、POST /api/user-groups/{groupId}/members エンドポイントで追加する必要があります。
以下の例では、様々なプログラミング言語でユーザーグループを作成する方法を示しています。
package rest.code.examples; import java.io.IOException; import java.util.Random; import org.apache.hc.client5.http.fluent.Content; import org.apache.hc.client5.http.fluent.Request; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; /** * Create a user using the Yellowfin REST API */ public class CreateUserGroup { public static void main(String[] args) throws Exception { String host = ""http://localhost:8080/Yellowfin""; String restUsername = ""admin@yellowfin.com.au""; String restPassword = ""test""; String newGroupName = ""New Group""; String newGroupDescription = ""This is a new group""; String token = generateToken(host, restUsername, restPassword); String createGroupPayload = ""{"" + "" \""groupName\"": \"""" + newGroupName + ""\"","" + "" \""groupDescription\"": \"""" + newGroupDescription + ""\"","" + "" \""groupStatus\"": \""OPEN\"","" + "" \""isSecureGroup\"": \""false\"" "" + ""}""; System.out.println(""Payload: "" + createGroupPayload); Content c = Request.post(host + ""/api/user-groups"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .bodyString(createGroupPayload, null) .execute().returnContent(); System.out.print(c.asString()); } /* * This function generates an access token for a user that will grant them access to * call REST API endpoints. */ public static String generateToken(String host, String username, String password) throws IOException { Content c = Request.post(host + ""/api/refresh-tokens"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong()) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .bodyString(""{ \""userName\"": \""""+ username + ""\"",\""password\"": \""""+ password + ""\""}"", null) .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement accessToken = jsonObject.getAsJsonObject(""_embedded"").getAsJsonObject(""accessToken"").get(""securityToken""); if (accessToken!=null) { System.out.println(""Access Token: "" + accessToken); } else { System.out.println(""Token not retrieved successfully""); System.exit(-1); } return accessToken.getAsString(); } }
using System.Net.Http.Headers; using Newtonsoft.Json.Linq; namespace rest.code.examples { public class CreateUserGroup { static async Task Main(string[] args) { string host = ""http://localhost:8080/Yellowfin""; string restUsername = ""admin@yellowfin.com.au""; string restPassword = ""test""; string newGroupName = ""New Group""; string newGroupDescription = ""This is a new group""; string token = await GenerateToken(host, restUsername, restPassword); string createGroupPayload = ""{"" + "" \""groupName\"": \"""" + newGroupName + ""\"","" + "" \""groupDescription\"": \"""" + newGroupDescription + ""\"","" + "" \""groupStatus\"": \""OPEN\"","" + "" \""isSecureGroup\"": \""false\"" "" + ""}""; Console.WriteLine(""Payload: "" + createGroupPayload); using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", ""ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "" , nonce="" + new Random().NextInt64() + "", token="" + token); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); var content = new StringContent(createGroupPayload); content.Headers.ContentType = new MediaTypeHeaderValue(""application/json""); var response = await httpClient.PostAsync(host + ""/api/user-groups"", content); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseBody); } else { Console.WriteLine(""Failed to create user group. Status code: "" + response.StatusCode); } } } static async Task<string> GenerateToken(string host, string restUsername, string restPassword) { using (var client = new HttpClient()) { // Generate nonce long nonce = new Random().NextInt64(); // Create HTTP request var request = new HttpRequestMessage(HttpMethod.Post, host + ""/api/refresh-tokens""); request.Headers.Add(""Authorization"", ""YELLOWFIN ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "", nonce="" + nonce); request.Headers.Add(""Accept"", ""application/vnd.yellowfin.api-v1+json""); request.Content = new StringContent( $""{{\""userName\"": \""{restUsername}\"", \""password\"": \""{restPassword}\""}}"", System.Text.Encoding.UTF8, ""application/json"" ); // Send request and get response HttpResponseMessage response = await client.SendAsync(request); string responseContent = await response.Content.ReadAsStringAsync(); // Parse JSON response JObject jsonObject = JObject.Parse(responseContent); string accessToken = jsonObject[""_embedded""][""accessToken""][""securityToken""].ToString(); if (!string.IsNullOrEmpty(accessToken)) { Console.WriteLine(""Access Token: "" + accessToken); } else { Console.WriteLine(""Token not retrieved successfully""); Environment.Exit(-1); } return accessToken; } } } }
package main import ( ""bytes"" ""encoding/json"" ""fmt"" ""io/ioutil"" ""math/rand"" ""net/http"" ""time"" ) func main() { host := ""http://localhost:8080/Yellowfin"" restUsername := ""admin@yellowfin.com.au"" restPassword := ""test"" newGroupName := ""New Group"" newGroupDescription := ""This is a new group"" token, err := generateToken(host, restUsername, restPassword) if err != nil { fmt.Println(""Error generating token:"", err) return } createGroupPayload := fmt.Sprintf(`{ ""groupName"": ""%s"", ""groupDescription"": ""%s"", ""groupStatus"": ""OPEN"", ""isSecureGroup"": ""false"" }`, newGroupName, newGroupDescription) fmt.Println(""Payload:"", createGroupPayload) client := &http.Client{} req, err := http.NewRequest(""POST"", host+""/api/user-groups"", bytes.NewBufferString(createGroupPayload)) if err != nil { fmt.Println(""Error creating request:"", err) return } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { fmt.Println(""Error sending request:"", err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(""Error reading response body:"", err) return } fmt.Println(string(body)) } func generateToken(host, restUsername, restPassword string) (string, error) { // Generate nonce nonce := rand.Int63() // Create request body requestBody, err := json.Marshal(map[string]string{ ""userName"": restUsername, ""password"": restPassword, }) if err != nil { fmt.Println(""Error marshaling request body:"", err) return """", err } // Create HTTP client client := &http.Client{} // Create HTTP request request, err := http.NewRequest(""POST"", host+""/api/refresh-tokens"", bytes.NewBuffer(requestBody)) if err != nil { fmt.Println(""Error creating request:"", err) return """", err } // Add request headers request.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d"", time.Now().UnixMilli(), nonce)) request.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") request.Header.Set(""Content-Type"", ""application/json"") // Send HTTP request response, err := client.Do(request) if err != nil { fmt.Println(""Error sending request:"", err) return """", err } defer response.Body.Close() // Read response body responseBody, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Println(""Error reading response body:"", err) return """", err } // Parse JSON response var jsonResponse map[string]interface{} err = json.Unmarshal(responseBody, &jsonResponse) if err != nil { fmt.Println(""Error parsing JSON response:"", err) return """", err } // Get access token from response accessToken, ok := jsonResponse[""_embedded""].(map[string]interface{})[""accessToken""].(map[string]interface{})[""securityToken""].(string) if !ok { fmt.Println(""Token not retrieved"") return """", fmt.Errorf(""Token not retrieved successfully"") } return accessToken, nil }
const fetch = require(""node-fetch""); async function main() { const host = ""http://localhost:8080/Yellowfin""; const restUsername = ""admin@yellowfin.com.au""; const restPassword = ""test""; const newGroupName = ""New Group""; const newGroupDescription = ""This is a new group""; const token = await generateToken(host, restUsername, restPassword); if (token === null) { console.error(""Failed to retrieve access token""); return; } const createGroupPayload = `{ ""groupName"": ""${newGroupName}"", ""groupDescription"": ""${newGroupDescription}"", ""groupStatus"": ""OPEN"", ""isSecureGroup"": ""false"" }`; console.log(""Payload:"", createGroupPayload); const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups`, { method: 'POST', headers: headers, body: createGroupPayload }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const responseBody = await response.text(); console.log(responseBody); } catch (error) { console.error(""Error:"", error.message); } } async function generateToken(host, restUsername, restPassword) { // Generate nonce const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); // Create request headers const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; // Create request body const body = `{ ""userName"": ""${restUsername}"", ""password"": ""${restPassword}"" }`; try { // Make POST request const response = await fetch(`${host}/api/refresh-tokens`, { method: 'POST', headers: headers, body: body }); // Check if request was successful if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } // Parse JSON response const jsonResponse = await response.json(); const accessToken = jsonResponse._embedded.accessToken.securityToken; if (accessToken) { console.log(`Access Token: ${accessToken}`); } else { console.log(""Token not retrieved""); } return accessToken; } catch (error) { console.error(""Error:"", error.message); } return null; } main();
<?php function main() { $host = ""http://localhost:8080/Yellowfin""; $restUsername = ""admin@yellowfin.com.au""; $restPassword = ""test""; $newGroupName = ""New Group""; $newGroupDescription = ""This is a new group""; try { $token = generateToken($host, $restUsername, $restPassword); } catch (Exception $e) { echo ""Error generating token: "" . $e->getMessage(); return; } $createGroupPayload = '{""groupName"":""' . $newGroupName . '"",""groupDescription"":""' . $newGroupDescription . '"",""groupStatus"":""OPEN"",""isSecureGroup"":""false""}'; echo ""Payload: "" . $createGroupPayload . ""\n""; $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); try { $response = httpRequest('POST', ""$host/api/user-groups"", $headers, $createGroupPayload); echo $response; } catch (Exception $e) { echo ""Error sending request: "" . $e->getMessage(); } } function generateToken($host, $restUsername, $restPassword) { // Generate nonce $nonce = mt_rand(); // Create request body $requestBody = '{""userName"":""' . $restUsername . '"",""password"":""' . $restPassword . '""}'; // Create request headers $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('POST', ""$host/api/refresh-tokens"", $headers, $requestBody); // Parse JSON response $jsonResponse = json_decode($response, true); // Get access token from response if (isset($jsonResponse[""_embedded""][""accessToken""][""securityToken""])) { $accessToken = $jsonResponse[""_embedded""][""accessToken""][""securityToken""]; echo ""Access Token: "" . $accessToken; return $accessToken; } else { throw new Exception(""Token not retrieved successfully""); } } function httpRequest($method, $url, $headers, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($data !== null) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception('Error: ' . curl_error($ch)); } curl_close($ch); return $response; } main() ?>
import json import random import time import requests def main(): host = ""http://localhost:8080/Yellowfin"" rest_username = ""admin@yellowfin.com.au"" rest_password = ""test"" new_group_name = ""New Group"" new_group_description = ""This is a new group"" try: token = generate_token(host, rest_username, rest_password) create_group_payload = ( ""{"" f"" \""groupName\"": \""{new_group_name}\"","" f"" \""groupDescription\"": \""{new_group_description}\"","" "" \""groupStatus\"": \""OPEN\"","" "" \""isSecureGroup\"": \""false\"""" ""}"" ) print(""Payload:"", create_group_payload) nonce = random.randint(0, 2 ** 63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.post(host + ""/api/user-groups"", headers=headers, data=create_group_payload) response.raise_for_status() print(response.text) except Exception as e: print(f""Error: {e}"") def generate_token(host, rest_username, rest_password): nonce = random.randint(0, 2 ** 63 - 1) request_body = json.dumps({ ""userName"": rest_username, ""password"": rest_password }) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.post(host + ""/api/refresh-tokens"", headers=headers, data=request_body) response.raise_for_status() json_response = response.json() access_token = json_response[""_embedded""][""accessToken""][""securityToken""] print(""Access Token:"", access_token) return access_token if __name__ == ""__main__"": main()
グループへのメンバーの追加
メンバーは、POST /api/user-groups/{groupId}/members エンドポイント Bulk-add User Group Members を使用してグループに追加されます。
新しいメンバーの一覧は、このエンドポイントを使用して投稿できます。グループメンバーを表すモデルは、以下の通りです。
{ "entityType": "PERSON", "entityCode": "", "entityId": 13235, "membershipType": "INCLUDED" }
EntityTypeには、PERSON, GROUP, LDAP, ROLEのいずれかを指定します。
EntityCodeには、Role CodeまたはLDAPグループDNを入力する必要があります。
EntityIdには、ユーザーのIpIdまたは、グループのIpId (IpIdはメンバーの整数識別子) を入力する必要があります。
MembershipTypeは、INCLUDEDまたはEXCLUDEDのいずれかです。これにより、グループメンバーをグループに含めるか、グループから明示的に除外するかが決まります。
以下の例では、(ユーザー名で識別される) ユーザーを、様々なプログラミング言語で (グループ名で識別される) グループに追加する方法を示しています。
package rest.code.examples; import java.io.IOException; import java.util.Random; import org.apache.hc.client5.http.fluent.Content; import org.apache.hc.client5.http.fluent.Request; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; /** * Create a user using the Yellowfin REST API */ public class AddMemberToGroup { public static void main(String[] args) throws Exception { String host = ""http://localhost:8080/Yellowfin""; String restUsername = ""admin@yellowfin.com.au""; String restPassword = ""test""; String userGroupToAddUserTo = ""New Group""; String usernameOfUserToAdd = ""user1@yellowfin.com.au""; String token = generateToken(host, restUsername, restPassword); Integer userIpId = retrieveUserIpIdForUsername(host, token, usernameOfUserToAdd); Integer groupId = retrieveGroupIpIdForGroupName(host, token, userGroupToAddUserTo); String groupMembersPayload = ""[\n"" + "" {\n"" + "" \""entityType\"": \""PERSON\"",\n"" + "" \""entityId\"": "" + userIpId + "",\n"" + "" \""membershipType\"": \""INCLUDED\""\n"" + "" }\n"" + ""]""; System.out.println(""UserIpId: "" + userIpId); System.out.println(""GroupId: "" + groupId); System.out.println(""Payload: "" + groupMembersPayload); Content c = Request.post(host + ""/api/user-groups/"" + groupId + ""/members"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .bodyString(groupMembersPayload, null) .execute().returnContent(); System.out.println(""User "" + usernameOfUserToAdd + "" added to group "" + userGroupToAddUserTo + "" successfully""); System.out.println(""Response: "" + c.asString()); } public static Integer retrieveGroupIpIdForGroupName(String host, String token, String groupName) throws IOException { Content c = Request.get(host + ""/api/user-groups"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement groupList = jsonObject.get(""items""); JsonArray groups = groupList.getAsJsonArray(); for (int i=0; i < groups.size(); i++ ) { JsonObject group = groups.getAsJsonArray().get(i).getAsJsonObject(); if (groupName.equals(group.get(""shortDescription"").getAsString())) return group.get(""userGroupId"").getAsInt(); } System.out.println(""Group could not be found for name:"" + groupName); System.exit(-1); return null; } public static Integer retrieveUserIpIdForUsername(String host, String token, String userName) throws IOException { Content c = Request.get(host + ""/api/rpc/users/user-details-by-username/"" + userName) .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong()+ "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement userIpJsonAttribute = jsonObject.get(""userId""); Integer userIpId = userIpJsonAttribute.getAsInt(); return userIpId; } /* * This function generates an access token for a user that will grant them access to * call REST API endpoints. */ public static String generateToken(String host, String username, String password) throws IOException { Content c = Request.post(host + ""/api/refresh-tokens"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong()) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .bodyString(""{ \""userName\"": \""""+ username + ""\"",\""password\"": \""""+ password + ""\""}"", null) .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement accessToken = jsonObject.getAsJsonObject(""_embedded"").getAsJsonObject(""accessToken"").get(""securityToken""); if (accessToken!=null) { System.out.println(""Access Token: "" + accessToken); } else { System.out.println(""Token not retrieved successfully""); System.exit(-1); } return accessToken.getAsString(); } }
using System.Net.Http.Headers; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace rest.code.examples { public class AddMemberToGroup { static async Task Main(string[] args) { string host = ""http://localhost:8080/Yellowfin""; string restUsername = ""admin@yellowfin.com.au""; string restPassword = ""test""; string userGroupToAddUserTo = ""New Group""; string usernameOfUserToAdd = ""user1@yellowfin.com.au""; string token = await GenerateToken(host, restUsername, restPassword); int userIpId = await RetrieveUserIpIdForUsername(host, token, usernameOfUserToAdd); int groupId = await RetrieveGroupIpIdForGroupName(host, token, userGroupToAddUserTo); string groupMembersPayload = ""[{\""entityType\"": \""PERSON\"",\""entityId\"": "" + userIpId + "",\""membershipType\"": \""INCLUDED\""}]""; Console.WriteLine(""UserIpId: "" + userIpId); Console.WriteLine(""GroupId: "" + groupId); Console.WriteLine(""Payload: "" + groupMembersPayload); using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", ""ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "" , nonce="" + new Random().NextInt64() + "", token="" + token); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); var content = new StringContent(groupMembersPayload); content.Headers.ContentType = new MediaTypeHeaderValue(""application/json""); var response = await httpClient.PostAsync(host + ""/api/user-groups/"" + groupId + ""/members"", content); if (response.IsSuccessStatusCode) { Console.WriteLine(""User "" + usernameOfUserToAdd + "" added to group "" + userGroupToAddUserTo + "" successfully""); string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(""Response: "" + responseBody); } else { Console.WriteLine(""Failed to add user to group. Status code: "" + response.StatusCode); } } } static async Task<int> RetrieveGroupIpIdForGroupName(string host, string token, string groupName) { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", ""ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "" , nonce="" + new Random().NextInt64() + "", token="" + token); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); var response = await httpClient.GetAsync(host + ""/api/user-groups""); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); JObject jsonObject = JObject.Parse(responseBody); JArray groupList = (JArray)jsonObject[""items""]; foreach (var group in groupList) { if (groupName.Equals(group[""shortDescription""].ToString())) { return Convert.ToInt32(group[""userGroupId""]); } } Console.WriteLine(""Group could not be found for name: "" + groupName); Environment.Exit(-1); } else { Console.WriteLine(""Failed to retrieve groups. Status code: "" + response.StatusCode); } } return -1; } static async Task<int> RetrieveUserIpIdForUsername(string host, string token, string userName) { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", ""ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "" , nonce="" + new Random().NextInt64() + "", token="" + token); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); var response = await httpClient.GetAsync(host + ""/api/rpc/users/user-details-by-username/"" + userName); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); JObject jsonObject = JObject.Parse(responseBody); return Convert.ToInt32(jsonObject[""userId""]); } else { Console.WriteLine(""Failed to retrieve user. Status code: "" + response.StatusCode); } } return -1; } static async Task<string> GenerateToken(string host, string username, string password) { using (var client = new HttpClient()) { // Generate nonce long nonce = new Random().NextInt64(); // Create HTTP request var request = new HttpRequestMessage(HttpMethod.Post, host + ""/api/refresh-tokens""); request.Headers.Add(""Authorization"", ""YELLOWFIN ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "", nonce="" + nonce); request.Headers.Add(""Accept"", ""application/vnd.yellowfin.api-v1+json""); request.Content = new StringContent( JsonConvert.SerializeObject(new { userName = username, password = password }), MediaTypeHeaderValue.Parse(""application/json"") ); // Send request and get response HttpResponseMessage response = await client.SendAsync(request); string responseContent = await response.Content.ReadAsStringAsync(); // Parse JSON response JObject jsonObject = JObject.Parse(responseContent); string accessToken = jsonObject[""_embedded""][""accessToken""][""securityToken""].ToString(); if (!string.IsNullOrEmpty(accessToken)) { Console.WriteLine(""Access Token: "" + accessToken); } else { Console.WriteLine(""Token not retrieved successfully""); Environment.Exit(-1); } return accessToken; } } } }
package main import ( ""bytes"" ""encoding/json"" ""fmt"" ""io/ioutil"" ""math/rand"" ""net/http"" ""time"" ) func main() { host := ""http://localhost:8080/Yellowfin"" restUsername := ""admin@yellowfin.com.au"" restPassword := ""test"" userGroupToAddUserTo := ""New Group"" usernameOfUserToAdd := ""user1@yellowfin.com.au"" token, err := generateToken(host, restUsername, restPassword) if err != nil { fmt.Println(""Error generating token:"", err) return } userIpId, err := retrieveUserIpIdForUsername(host, token, usernameOfUserToAdd) if err != nil { fmt.Println(""Error retrieving user IP ID:"", err) return } groupId, err := retrieveGroupIpIdForGroupName(host, token, userGroupToAddUserTo) if err != nil { fmt.Println(""Error retrieving group IP ID:"", err) return } groupMembersPayload := fmt.Sprintf(`[ { ""entityType"": ""PERSON"", ""entityId"": %d, ""membershipType"": ""INCLUDED"" } ]`, userIpId) fmt.Println(""UserIpId:"", userIpId) fmt.Println(""GroupId:"", groupId) fmt.Println(""Payload:"", groupMembersPayload) client := &http.Client{} req, err := http.NewRequest(""POST"", fmt.Sprintf(""%s/api/user-groups/%d/members"", host, groupId), bytes.NewBufferString(groupMembersPayload)) if err != nil { fmt.Println(""Error creating request:"", err) return } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { fmt.Println(""Error sending request:"", err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(""Error reading response body:"", err) return } fmt.Printf(""User %s added to group %s successfully\n"", usernameOfUserToAdd, userGroupToAddUserTo) fmt.Println(""Response:"", string(body)) } func retrieveGroupIpIdForGroupName(host, token, groupName string) (int, error) { client := &http.Client{} req, err := http.NewRequest(""GET"", host+""/api/user-groups"", nil) if err != nil { return 0, err } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return 0, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return 0, err } var data map[string]interface{} err = json.Unmarshal(body, &data) if err != nil { return 0, err } groups := data[""items""].([]interface{}) for _, g := range groups { group := g.(map[string]interface{}) if groupName == group[""shortDescription""].(string) { return int(group[""userGroupId""].(float64)), nil } } return 0, fmt.Errorf(""Group could not be found for name: %s"", groupName) } func retrieveUserIpIdForUsername(host, token, userName string) (int, error) { client := &http.Client{} req, err := http.NewRequest(""GET"", host+""/api/rpc/users/user-details-by-username/""+userName, nil) if err != nil { return 0, err } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return 0, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return 0, err } var data map[string]interface{} err = json.Unmarshal(body, &data) if err != nil { return 0, err } return int(data[""userId""].(float64)), nil } func generateToken(host, username, password string) (string, error) { nonce := rand.Int63() requestBody, err := json.Marshal(map[string]string{ ""userName"": username, ""password"": password, }) if err != nil { return """", err } client := &http.Client{} req, err := http.NewRequest(""POST"", host+""/api/refresh-tokens"", bytes.NewBuffer(requestBody)) if err != nil { return """", err } req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d"", time.Now().UnixMilli(), nonce)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return """", err } defer resp.Body.Close() responseBody, err := ioutil.ReadAll(resp.Body) if err != nil { return """", err } var jsonResponse map[string]interface{} err = json.Unmarshal(responseBody, &jsonResponse) if err != nil { return """", err } accessToken := jsonResponse[""_embedded""].(map[string]interface{})[""accessToken""].(map[string]interface{})[""securityToken""].(string) return accessToken, nil }
const fetch = require(""node-fetch""); async function main() { const host = ""http://localhost:8080/Yellowfin""; const restUsername = ""admin@yellowfin.com.au""; const restPassword = ""test""; const userGroupToAddUserTo = ""New Group""; const usernameOfUserToAdd = ""user1@yellowfin.com.au""; const token = await generateToken(host, restUsername, restPassword); if (token === null) { console.error(""Failed to retrieve access token""); return; } const userIpId = await retrieveUserIpIdForUsername(host, token, usernameOfUserToAdd); const groupId = await retrieveGroupIpIdForGroupName(host, token, userGroupToAddUserTo); const groupMembersPayload = JSON.stringify([ { entityType: ""PERSON"", entityId: userIpId, membershipType: ""INCLUDED"" } ]); console.log(""UserIpId:"", userIpId); console.log(""GroupId:"", groupId); console.log(""Payload:"", groupMembersPayload); const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups/${groupId}/members`, { method: 'POST', headers: headers, body: groupMembersPayload }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const responseBody = await response.text(); console.log(`User ${usernameOfUserToAdd} added to group ${userGroupToAddUserTo} successfully`); console.log(""Response:"", responseBody); } catch (error) { console.error(""Error:"", error.message); } } async function retrieveGroupIpIdForGroupName(host, token, groupName) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups`, { method: 'GET', headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonResponse = await response.json(); const groups = jsonResponse.items; for (const group of groups) { if (group.shortDescription === groupName) { return group.userGroupId; } } console.log(`Group could not be found for name: ${groupName}`); process.exit(-1); } catch (error) { console.error(""Error:"", error.message); } return null; } async function retrieveUserIpIdForUsername(host, token, userName) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/rpc/users/user-details-by-username/${userName}`, { method: 'GET', headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonResponse = await response.json(); return jsonResponse.userId; } catch (error) { console.error(""Error:"", error.message); } return null; } async function generateToken(host, username, password) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; const body = JSON.stringify({ userName: username, password: password }); try { const response = await fetch(`${host}/api/refresh-tokens`, { method: 'POST', headers: headers, body: body }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonResponse = await response.json(); const accessToken = jsonResponse._embedded.accessToken.securityToken; if (accessToken) { console.log(`Access Token: ${accessToken}`); } else { console.log(""Token not retrieved""); } return accessToken; } catch (error) { console.error(""Error:"", error.message); } return null; } main();
<?php function main() { $host = ""http://localhost:8080/Yellowfin""; $restUsername = ""admin@yellowfin.com.au""; $restPassword = ""test""; $userGroupToAddUserTo = ""New Group""; $usernameOfUserToAdd = ""user1@yellowfin.com.au""; try { $token = generateToken($host, $restUsername, $restPassword); } catch (Exception $e) { echo ""Error generating token: "" . $e->getMessage(); return; } try { $userIpId = retrieveUserIpIdForUsername($host, $token, $usernameOfUserToAdd); $groupId = retrieveGroupIpIdForGroupName($host, $token, $userGroupToAddUserTo); } catch (Exception $e) { echo ""Error: "" . $e->getMessage(); return; } $groupMembersPayload = '[{""entityType"": ""PERSON"",""entityId"": ' . $userIpId . ',""membershipType"": ""INCLUDED""}]'; echo ""UserIpId: "" . $userIpId . ""\n""; echo ""GroupId: "" . $groupId . ""\n""; echo ""Payload: "" . $groupMembersPayload . ""\n""; $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); try { $response = httpRequest('POST', $host . ""/api/user-groups/"" . $groupId . ""/members"", $headers, $groupMembersPayload); echo $response; } catch (Exception $e) { echo ""Error sending request: "" . $e->getMessage(); } } function generateToken($host, $restUsername, $restPassword) { // Generate nonce $nonce = mt_rand(); // Create request body $requestBody = json_encode(array( ""userName"" => $restUsername, ""password"" => $restPassword )); // Create request headers $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('POST', $host . ""/api/refresh-tokens"", $headers, $requestBody); // Parse JSON response $jsonResponse = json_decode($response, true); // Get access token from response if (isset($jsonResponse[""_embedded""][""accessToken""][""securityToken""])) { $accessToken = $jsonResponse[""_embedded""][""accessToken""][""securityToken""]; echo ""Access Token: "" . $accessToken; return $accessToken; } else { throw new Exception(""Token not retrieved successfully""); } } function retrieveGroupIpIdForGroupName($host, $token, $groupName) { $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('GET', $host . ""/api/user-groups"", $headers); // Parse JSON response $jsonResponse = json_decode($response, true); $groups = $jsonResponse[""items""]; foreach ($groups as $group) { if ($group[""shortDescription""] === $groupName) { return $group[""userGroupId""]; } } echo ""Group could not be found for name:"" . $groupName; exit(-1); } function retrieveUserIpIdForUsername($host, $token, $userName) { $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('GET', $host . ""/api/rpc/users/user-details-by-username/"" . $userName, $headers); // Parse JSON response $jsonResponse = json_decode($response, true); return $jsonResponse[""userId""]; } function httpRequest($method, $url, $headers, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($data !== null) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception('Error: ' . curl_error($ch)); } curl_close($ch); return $response; } main(); ?>
import json import random import time import requests def main(): host = ""http://localhost:8080/Yellowfin"" rest_username = ""admin@yellowfin.com.au"" rest_password = ""test"" user_group_to_add_user_to = ""New Group"" username_of_user_to_add = ""user1@yellowfin.com.au"" try: token = generate_token(host, rest_username, rest_password) except Exception as e: print(f""Error generating token: {e}"") return try: user_ip_id = retrieve_user_ip_id_for_username(host, token, username_of_user_to_add) group_id = retrieve_group_ip_id_for_group_name(host, token, user_group_to_add_user_to) except Exception as e: print(f""Error: {e}"") return group_members_payload = f""[{{\""entityType\"": \""PERSON\"", \""entityId\"": {user_ip_id}, \""membershipType\"": \""INCLUDED\""}}]"" print(f""UserIpId: {user_ip_id}"") print(f""GroupId: {group_id}"") print(f""Payload: {group_members_payload}"") nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } try: response = requests.post(f""{host}/api/user-groups/{group_id}/members"", headers=headers, data=group_members_payload) response.raise_for_status() print(response.text) except requests.RequestException as e: print(f""Error sending request: {e}"") def generate_token(host, rest_username, rest_password): nonce = random.randint(0, 2**63 - 1) request_body = json.dumps({ ""userName"": rest_username, ""password"": rest_password }) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.post(f""{host}/api/refresh-tokens"", headers=headers, data=request_body) if response.status_code == 200: json_response = response.json() access_token = json_response[""_embedded""][""accessToken""][""securityToken""] print(""Access Token:"", access_token) return access_token else: raise Exception(""Token not retrieved successfully"") def retrieve_group_ip_id_for_group_name(host, token, group_name): nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.get(f""{host}/api/user-groups"", headers=headers) if response.status_code == 200: json_response = response.json() groups = json_response[""items""] for group in groups: if group[""shortDescription""] == group_name: return group[""userGroupId""] print(f""Group could not be found for name: {group_name}"") exit(-1) else: raise Exception(""Error retrieving group"") def retrieve_user_ip_id_for_username(host, token, username): nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.get(f""{host}/api/rpc/users/user-details-by-username/{username}"", headers=headers) if response.status_code == 200: json_response = response.json() return json_response[""userId""] else: raise Exception(""Error retrieving user ID"") if __name__ == ""__main__"": main()
グループからのメンバーの削除
メンバーは、DELETE /api/user-groups/{groupId}/members エンドポイント Bulk-Delete User Group Members を使用してユーザーグループから削除することができます。
メンバーを削除するには、削除するmemberIdsの一覧を含むクエリーパラメーターを指定します。これは、以下のようになります。
memberIds=['ROLE|YFADMIN','PERSON|13235']
以下の例では、(名前で識別される) グループから、(ユーザー名で識別される) ユーザーを削除する方法を示しています。
package rest.code.examples; import java.io.IOException; import java.util.Random; import org.apache.hc.client5.http.fluent.Content; import org.apache.hc.client5.http.fluent.Request; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; /** * Remove users from a User Group using the Yellowfin REST API */ public class RemoveMemberFromGroup { public static void main(String[] args) throws Exception { System.out.println(""Remove User from Group""); String host = ""http://localhost:8080/Yellowfin""; String restUsername = ""admin@yellowfin.com.au""; String restPassword = ""test""; String userGroupToAddRemoveUserFrom = ""New Group""; String usernameOfUserToRemove = ""user1@yellowfin.com.au""; String token = generateToken(host, restUsername, restPassword); Integer userIpId = retrieveUserIpIdForUsername(host, token, usernameOfUserToRemove); Integer groupId = retrieveGroupIpIdForGroupName(host, token, userGroupToAddRemoveUserFrom); // The pipe ""|"" symbol is URL escaped in the following line. String groupMembersPayload = ""memberIds=%5B'PERSON%7C""+ userIpId + ""'%5D""; System.out.println(""UserIpId: "" + userIpId); System.out.println(""GroupId: "" + groupId); System.out.println(""Payload: "" + groupMembersPayload); Content c = Request.delete(host + ""/api/user-groups/"" + groupId + ""/members/?"" + groupMembersPayload) .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); System.out.println(""User "" + usernameOfUserToRemove + "" removed from group "" + userGroupToAddRemoveUserFrom + "" successfully""); System.out.println(""Response: "" + c.asString()); } public static Integer retrieveGroupIpIdForGroupName(String host, String token, String groupName) throws IOException { Content c = Request.get(host + ""/api/user-groups"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement groupList = jsonObject.get(""items""); JsonArray groups = groupList.getAsJsonArray(); for (int i=0; i < groups.size(); i++ ) { JsonObject group = groups.getAsJsonArray().get(i).getAsJsonObject(); if (groupName.equals(group.get(""shortDescription"").getAsString())) return group.get(""userGroupId"").getAsInt(); } System.out.println(""Group could not be found for name:"" + groupName); System.exit(-1); return null; } public static Integer retrieveUserIpIdForUsername(String host, String token, String userName) throws IOException { Content c = Request.get(host + ""/api/rpc/users/user-details-by-username/"" + userName) .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong()+ "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement userIpJsonAttribute = jsonObject.get(""userId""); Integer userIpId = userIpJsonAttribute.getAsInt(); return userIpId; } /* * This function generates an access token for a user that will grant them access to * call REST API endpoints. */ public static String generateToken(String host, String username, String password) throws IOException { Content c = Request.post(host + ""/api/refresh-tokens"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong()) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .bodyString(""{ \""userName\"": \""""+ username + ""\"",\""password\"": \""""+ password + ""\""}"", null) .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement accessToken = jsonObject.getAsJsonObject(""_embedded"").getAsJsonObject(""accessToken"").get(""securityToken""); if (accessToken!=null) { System.out.println(""Access Token: "" + accessToken); } else { System.out.println(""Token not retrieved successfully""); System.exit(-1); } return accessToken.getAsString(); } }
using System.Net.Http.Headers; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace YellowfinAPIExamples { public class RemoveMemberFromGroup { public static async Task Main(string[] args) { Console.WriteLine(""Remove User from Group""); string host = ""http://localhost:8080/Yellowfin""; string restUsername = ""admin@yellowfin.com.au""; string restPassword = ""test""; string userGroupToAddRemoveUserFrom = ""New Group""; string usernameOfUserToRemove = ""user1@yellowfin.com.au""; string token = await GenerateToken(host, restUsername, restPassword); int userIpId = await RetrieveUserIpIdForUsername(host, token, usernameOfUserToRemove); int groupId = await RetrieveGroupIpIdForGroupName(host, token, userGroupToAddRemoveUserFrom); string groupMembersPayload = $""memberIds=%5B'PERSON%7C{userIpId}'%5D""; Console.WriteLine(""UserIpId: "" + userIpId); Console.WriteLine(""GroupId: "" + groupId); Console.WriteLine(""Payload: "" + groupMembersPayload); using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", $""ts={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}, nonce={new Random().NextInt64()}, token={token}""); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await httpClient.DeleteAsync($""{host}/api/user-groups/{groupId}/members/?{groupMembersPayload}""); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine($""User {usernameOfUserToRemove} removed from group {userGroupToAddRemoveUserFrom} successfully""); Console.WriteLine(""Response: "" + responseBody); } else { Console.WriteLine(""Failed to remove user from group. Status code: "" + response.StatusCode); } } } public static async Task<int> RetrieveGroupIpIdForGroupName(string host, string token, string groupName) { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", $""ts={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}, nonce={new Random().NextInt64()}, token={token}""); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await httpClient.GetAsync($""{host}/api/user-groups""); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseBody); JArray groups = (JArray)jsonObject[""items""]; foreach (var group in groups) { if (group[""shortDescription""].ToString() == groupName) { return group[""userGroupId""].Value<int>(); } } Console.WriteLine(""Group could not be found for name:"" + groupName); Environment.Exit(-1); } else { Console.WriteLine(""Failed to retrieve group list. Status code: "" + response.StatusCode); Environment.Exit(-1); } return -1; } } public static async Task<int> RetrieveUserIpIdForUsername(string host, string token, string userName) { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", $""ts={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}, nonce={new Random().NextInt64()}, token={token}""); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await httpClient.GetAsync($""{host}/api/rpc/users/user-details-by-username/{userName}""); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseBody); int userIpId = jsonObject[""userId""].Value<int>(); return userIpId; } else { Console.WriteLine(""Failed to retrieve user IP ID. Status code: "" + response.StatusCode); Environment.Exit(-1); } return -1; } } public static async Task<string> GenerateToken(string host, string username, string password) { using (var client = new HttpClient()) { var request = new HttpRequestMessage(HttpMethod.Post, $""{host}/api/refresh-tokens""); request.Headers.Add(""Authorization"", $""YELLOWFIN ts={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}, nonce={new Random().NextInt64()}""); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); request.Content = new StringContent( JsonConvert.SerializeObject(new { userName = username, password = password }), System.Text.Encoding.UTF8, ""application/json"" ); HttpResponseMessage response = await client.SendAsync(request); string responseContent = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseContent); string accessToken = jsonObject[""_embedded""][""accessToken""][""securityToken""].ToString(); if (!string.IsNullOrEmpty(accessToken)) { Console.WriteLine(""Access Token: "" + accessToken); } else { Console.WriteLine(""Token not retrieved successfully""); Environment.Exit(-1); } return accessToken; } } } }
package main import ( ""bytes"" ""encoding/json"" ""fmt"" ""io/ioutil"" ""math/rand"" ""net/http"" ""time"" ) func main() { fmt.Println(""Remove User from Group"") host := ""http://localhost:8080/Yellowfin"" restUsername := ""admin@yellowfin.com.au"" restPassword := ""test"" userGroupToAddRemoveUserFrom := ""New Group"" usernameOfUserToRemove := ""user1@yellowfin.com.au"" token, err := generateToken(host, restUsername, restPassword) if err != nil { fmt.Println(""Error generating token:"", err) return } userIpId, err := retrieveUserIpIdForUsername(host, token, usernameOfUserToRemove) if err != nil { fmt.Println(""Error retrieving user IP ID:"", err) return } groupId, err := retrieveGroupIpIdForGroupName(host, token, userGroupToAddRemoveUserFrom) if err != nil { fmt.Println(""Error retrieving group ID:"", err) return } groupMembersPayload := fmt.Sprintf(""memberIds=%%5B'PERSON%%7C%d'%%5D"", userIpId) fmt.Println(""UserIpId:"", userIpId) fmt.Println(""GroupId:"", groupId) fmt.Println(""Payload:"", groupMembersPayload) client := &http.Client{} req, err := http.NewRequest(""DELETE"", host+""/api/user-groups/""+fmt.Sprint(groupId)+""/members/?""+groupMembersPayload, nil) if err != nil { fmt.Println(""Error creating request:"", err) return } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { fmt.Println(""Error sending request:"", err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(""Error reading response body:"", err) return } fmt.Printf(""User %s removed from group %s successfully\n"", usernameOfUserToRemove, userGroupToAddRemoveUserFrom) fmt.Println(""Response:"", string(body)) } func retrieveGroupIpIdForGroupName(host, token, groupName string) (int, error) { client := &http.Client{} req, err := http.NewRequest(""GET"", host+""/api/user-groups"", nil) if err != nil { return 0, err } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return 0, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return 0, err } var jsonObject map[string]interface{} err = json.Unmarshal(body, &jsonObject) if err != nil { return 0, err } groups := jsonObject[""items""].([]interface{}) for _, group := range groups { groupMap := group.(map[string]interface{}) if groupMap[""shortDescription""] == groupName { return int(groupMap[""userGroupId""].(float64)), nil } } fmt.Println(""Group could not be found for name:"", groupName) return 0, fmt.Errorf(""group not found"") } func retrieveUserIpIdForUsername(host, token, userName string) (int, error) { client := &http.Client{} req, err := http.NewRequest(""GET"", host+""/api/rpc/users/user-details-by-username/""+userName, nil) if err != nil { return 0, err } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return 0, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return 0, err } var jsonObject map[string]interface{} err = json.Unmarshal(body, &jsonObject) if err != nil { return 0, err } return int(jsonObject[""userId""].(float64)), nil } func generateToken(host, restUsername, restPassword string) (string, error) { nonce := rand.Int63() requestBody, err := json.Marshal(map[string]string{ ""userName"": restUsername, ""password"": restPassword, }) if err != nil { return """", err } client := &http.Client{} request, err := http.NewRequest(""POST"", host+""/api/refresh-tokens"", bytes.NewBuffer(requestBody)) if err != nil { return """", err } request.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d"", time.Now().UnixMilli(), nonce)) request.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") request.Header.Set(""Content-Type"", ""application/json"") response, err := client.Do(request) if err != nil { return """", err } defer response.Body.Close() responseBody, err := ioutil.ReadAll(response.Body) if err != nil { return """", err } var jsonResponse map[string]interface{} err = json.Unmarshal(responseBody, &jsonResponse) if err != nil { return """", err } accessToken, ok := jsonResponse[""_embedded""].(map[string]interface{})[""accessToken""].(map[string]interface{})[""securityToken""].(string) if !ok { return """", fmt.Errorf(""Token not retrieved successfully"") } return accessToken, nil }
const fetch = require(""node-fetch""); async function main() { console.log(""Remove User from Group""); const host = ""http://localhost:8080/Yellowfin""; const restUsername = ""admin@yellowfin.com.au""; const restPassword = ""test""; const userGroupToAddRemoveUserFrom = ""New Group""; const usernameOfUserToRemove = ""user1@yellowfin.com.au""; const token = await generateToken(host, restUsername, restPassword); if (!token) { console.error(""Failed to retrieve access token""); return; } const userIpId = await retrieveUserIpIdForUsername(host, token, usernameOfUserToRemove); if (userIpId === null) { console.error(""Failed to retrieve user IP ID""); return; } const groupId = await retrieveGroupIpIdForGroupName(host, token, userGroupToAddRemoveUserFrom); if (groupId === null) { console.error(""Failed to retrieve group ID""); return; } const groupMembersPayload = `memberIds=%5B'PERSON%7C${userIpId}'%5D`; console.log(""UserIpId:"", userIpId); console.log(""GroupId:"", groupId); console.log(""Payload:"", groupMembersPayload); const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups/${groupId}/members/?${groupMembersPayload}`, { method: 'DELETE', headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const responseBody = await response.text(); console.log(`User ${usernameOfUserToRemove} removed from group ${userGroupToAddRemoveUserFrom} successfully`); console.log(""Response:"", responseBody); } catch (error) { console.error(""Error:"", error.message); } } async function retrieveGroupIpIdForGroupName(host, token, groupName) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups`, { method: 'GET', headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonObject = await response.json(); const groups = jsonObject.items; for (let group of groups) { if (group.shortDescription === groupName) { return group.userGroupId; } } console.error(""Group could not be found for name:"", groupName); return null; } catch (error) { console.error(""Error:"", error.message); return null; } } async function retrieveUserIpIdForUsername(host, token, userName) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/rpc/users/user-details-by-username/${userName}`, { method: 'GET', headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonObject = await response.json(); return jsonObject.userId; } catch (error) { console.error(""Error:"", error.message); return null; } } async function generateToken(host, restUsername, restPassword) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; const body = JSON.stringify({ userName: restUsername, password: restPassword }); try { const response = await fetch(`${host}/api/refresh-tokens`, { method: 'POST', headers: headers, body: body }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonResponse = await response.json(); const accessToken = jsonResponse._embedded.accessToken.securityToken; if (accessToken) { console.log(`Access Token: ${accessToken}`); return accessToken; } else { console.log(""Token not retrieved""); return null; } } catch (error) { console.error(""Error:"", error.message); return null; } } main();
<?php function main() { echo ""Remove User from Group\n""; $host = ""http://localhost:8080/Yellowfin""; $restUsername = ""admin@yellowfin.com.au""; $restPassword = ""test""; $userGroupToAddRemoveUserFrom = ""New Group""; $usernameOfUserToRemove = ""user1@yellowfin.com.au""; try { $token = generateToken($host, $restUsername, $restPassword); } catch (Exception $e) { echo ""Error generating token: "" . $e->getMessage(); return; } try { $userIpId = retrieveUserIpIdForUsername($host, $token, $usernameOfUserToRemove); $groupId = retrieveGroupIpIdForGroupName($host, $token, $userGroupToAddRemoveUserFrom); } catch (Exception $e) { echo ""Error retrieving IDs: "" . $e->getMessage(); return; } // The pipe ""|"" symbol is URL escaped in the following line. $groupMembersPayload = ""memberIds=%5B'PERSON%7C"" . $userIpId . ""'%5D""; echo ""UserIpId: "" . $userIpId . ""\n""; echo ""GroupId: "" . $groupId . ""\n""; echo ""Payload: "" . $groupMembersPayload . ""\n""; $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); try { $response = httpRequest('DELETE', ""$host/api/user-groups/$groupId/members/?$groupMembersPayload"", $headers); echo ""User $usernameOfUserToRemove removed from group $userGroupToAddRemoveUserFrom successfully\n""; echo ""Response: "" . $response; } catch (Exception $e) { echo ""Error sending request: "" . $e->getMessage(); } } function retrieveGroupIpIdForGroupName($host, $token, $groupName) { $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('GET', ""$host/api/user-groups"", $headers); $jsonObject = json_decode($response, true); $groups = $jsonObject['items']; foreach ($groups as $group) { if ($group['shortDescription'] === $groupName) { return $group['userGroupId']; } } echo ""Group could not be found for name: "" . $groupName . ""\n""; exit(-1); } function retrieveUserIpIdForUsername($host, $token, $userName) { $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('GET', ""$host/api/rpc/users/user-details-by-username/$userName"", $headers); $jsonObject = json_decode($response, true); return $jsonObject['userId']; } function generateToken($host, $restUsername, $restPassword) { $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $requestBody = json_encode(array( ""userName"" => $restUsername, ""password"" => $restPassword )); $response = httpRequest('POST', ""$host/api/refresh-tokens"", $headers, $requestBody); $jsonResponse = json_decode($response, true); if (isset($jsonResponse[""_embedded""][""accessToken""][""securityToken""])) { $accessToken = $jsonResponse[""_embedded""][""accessToken""][""securityToken""]; echo ""Access Token: "" . $accessToken . ""\n""; return $accessToken; } else { throw new Exception(""Token not retrieved successfully""); } } function httpRequest($method, $url, $headers, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($data !== null) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception('Error: ' . curl_error($ch)); } curl_close($ch); return $response; } main(); ?>
import json import random import time import requests def main(): print(""Remove User from Group"") host = ""http://localhost:8080/Yellowfin"" rest_username = ""admin@yellowfin.com.au"" rest_password = ""test"" user_group_to_add_remove_user_from = ""New Group"" username_of_user_to_remove = ""user1@yellowfin.com.au"" try: token = generate_token(host, rest_username, rest_password) except Exception as e: print(f""Error generating token: {e}"") return try: user_ip_id = retrieve_user_ip_id_for_username(host, token, username_of_user_to_remove) group_id = retrieve_group_ip_id_for_group_name(host, token, user_group_to_add_remove_user_from) except Exception as e: print(f""Error retrieving IDs: {e}"") return # The pipe ""|"" symbol is URL escaped in the following line. group_members_payload = f""memberIds=%5B'PERSON%7C{user_ip_id}'%5D"" print(""UserIpId:"", user_ip_id) print(""GroupId:"", group_id) print(""Payload:"", group_members_payload) nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } try: response = requests.delete(f""{host}/api/user-groups/{group_id}/members/?{group_members_payload}"", headers=headers) response.raise_for_status() print(f""User {username_of_user_to_remove} removed from group {user_group_to_add_remove_user_from} successfully"") print(""Response:"", response.text) except requests.RequestException as e: print(f""Error sending request: {e}"") def retrieve_group_ip_id_for_group_name(host, token, group_name): nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.get(f""{host}/api/user-groups"", headers=headers) response.raise_for_status() json_object = response.json() groups = json_object['items'] for group in groups: if group['shortDescription'] == group_name: return group['userGroupId'] print(f""Group could not be found for name: {group_name}"") exit(-1) def retrieve_user_ip_id_for_username(host, token, user_name): nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.get(f""{host}/api/rpc/users/user-details-by-username/{user_name}"", headers=headers) response.raise_for_status() json_object = response.json() return json_object['userId'] def generate_token(host, rest_username, rest_password): nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } request_body = json.dumps({ ""userName"": rest_username, ""password"": rest_password }) response = requests.post(f""{host}/api/refresh-tokens"", headers=headers, data=request_body) response.raise_for_status() json_response = response.json() access_token = json_response[""_embedded""][""accessToken""][""securityToken""] print(""Access Token:"", access_token) return access_token if __name__ == ""__main__"": main()
グループメンバーコンポーネントの一覧化
既存のグループのメンバーは、GET /api/user-groups/{groupId}/members エンドポイント Get User Group Member List を使用して返すことができます。こちらのサービスは、グループのコンポーネントを返します。例えば、これはグループまたはロールをメンバーとして返し、これらのコンポーネントが表すユーザーを返しません。最終的な平滑化されたメンバー一覧を取得するエンドポイントは別にあり、そこではグループやロール内の個々のユーザーが取得されます。
以下の例では、様々なプログラミング言語でグループメンバーのコンポーネントの一覧を表すJSON ペイロードを返します。
package rest.code.examples; import java.io.IOException; import java.util.Random; import org.apache.hc.client5.http.fluent.Content; import org.apache.hc.client5.http.fluent.Request; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; /** * Create a user using the Yellowfin REST API */ public class ListGroupMembers { public static void main(String[] args) throws Exception { System.out.println(""List Group Member Components""); String host = ""http://localhost:8080/Yellowfin""; String restUsername = ""admin@yellowfin.com.au""; String restPassword = ""test""; String groupName = ""New Group""; String token = generateToken(host, restUsername, restPassword); Integer groupId = retrieveGroupIpIdForGroupName(host, token, groupName); Content c = Request.get(host + ""/api/user-groups/"" + groupId + ""/members"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); System.out.println(c.toString()); } public static Integer retrieveGroupIpIdForGroupName(String host, String token, String groupName) throws IOException { Content c = Request.get(host + ""/api/user-groups"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement groupList = jsonObject.get(""items""); JsonArray groups = groupList.getAsJsonArray(); for (int i=0; i < groups.size(); i++ ) { JsonObject group = groups.getAsJsonArray().get(i).getAsJsonObject(); if (groupName.equals(group.get(""shortDescription"").getAsString())) return group.get(""userGroupId"").getAsInt(); } System.out.println(""Group could not be found for name:"" + groupName); System.exit(-1); return null; } /* * This function generates an access token for a user that will grant them access to * call REST API endpoints. */ public static String generateToken(String host, String username, String password) throws IOException { Content c = Request.post(host + ""/api/refresh-tokens"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong()) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .bodyString(""{ \""userName\"": \""""+ username + ""\"",\""password\"": \""""+ password + ""\""}"", null) .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement accessToken = jsonObject.getAsJsonObject(""_embedded"").getAsJsonObject(""accessToken"").get(""securityToken""); if (accessToken!=null) { System.out.println(""Access Token: "" + accessToken); } else { System.out.println(""Token not retrieved successfully""); System.exit(-1); } return accessToken.getAsString(); } }
using System.Net.Http.Headers; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace YellowfinAPIExamples { public class ListGroupMembers { static async Task Main(string[] args) { Console.WriteLine(""List Group Member Components""); string host = ""http://localhost:8080/Yellowfin""; string restUsername = ""admin@yellowfin.com.au""; string restPassword = ""test""; string groupName = ""New Group""; string token = await GenerateToken(host, restUsername, restPassword); int groupId = await RetrieveGroupIpIdForGroupName(host, token, groupName); using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", ""ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "", nonce="" + new Random().NextInt64() + "", token="" + token); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await httpClient.GetAsync(host + ""/api/user-groups/"" + groupId + ""/members""); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseBody); } else { Console.WriteLine(""Failed to retrieve group members. Status code: "" + response.StatusCode); } } } static async Task<int> RetrieveGroupIpIdForGroupName(string host, string token, string groupName) { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", ""ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "", nonce="" + new Random().NextInt64() + "", token="" + token); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await httpClient.GetAsync(host + ""/api/user-groups""); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseBody); JArray groups = (JArray)jsonObject[""items""]; foreach (var group in groups) { if (groupName == group[""shortDescription""].ToString()) { return (int)group[""userGroupId""]; } } Console.WriteLine(""Group could not be found for name:"" + groupName); Environment.Exit(-1); } else { Console.WriteLine(""Failed to retrieve group list. Status code: "" + response.StatusCode); Environment.Exit(-1); } } return -1; // Should not reach here due to Environment.Exit } static async Task<string> GenerateToken(string host, string restUsername, string restPassword) { using (var client = new HttpClient()) { long nonce = new Random().NextInt64(); var request = new HttpRequestMessage(HttpMethod.Post, host + ""/api/refresh-tokens""); request.Headers.Add(""Authorization"", ""YELLOWFIN ts="" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + "", nonce="" + nonce); request.Headers.Add(""Accept"", ""application/vnd.yellowfin.api-v1+json""); request.Content = new StringContent( JsonConvert.SerializeObject(new { userName = restUsername, password = restPassword }), System.Text.Encoding.UTF8, ""application/json"" ); HttpResponseMessage response = await client.SendAsync(request); string responseContent = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseContent); string accessToken = jsonObject[""_embedded""][""accessToken""][""securityToken""].ToString(); if (!string.IsNullOrEmpty(accessToken)) { Console.WriteLine(""Access Token: "" + accessToken); return accessToken; } else { Console.WriteLine(""Token not retrieved successfully""); Environment.Exit(-1); } } return null; // Should not reach here due to Environment.Exit } } }
package main import ( ""bytes"" ""encoding/json"" ""fmt"" ""io/ioutil"" ""math/rand"" ""net/http"" ""time"" ) func main() { fmt.Println(""List Group Member Components"") host := ""http://localhost:8080/Yellowfin"" restUsername := ""admin@yellowfin.com.au"" restPassword := ""test"" groupName := ""New Group"" token, err := generateToken(host, restUsername, restPassword) if err != nil { fmt.Println(""Error generating token:"", err) return } groupId, err := retrieveGroupIpIdForGroupName(host, token, groupName) if err != nil { fmt.Println(""Error retrieving group ID:"", err) return } err = listGroupMembers(host, token, groupId) if err != nil { fmt.Println(""Error listing group members:"", err) } } func retrieveGroupIpIdForGroupName(host, token, groupName string) (int, error) { client := &http.Client{} nonce := rand.Int63() req, err := http.NewRequest(""GET"", fmt.Sprintf(""%s/api/user-groups"", host), nil) if err != nil { return 0, fmt.Errorf(""error creating request: %v"", err) } req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return 0, fmt.Errorf(""error sending request: %v"", err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return 0, fmt.Errorf(""error reading response body: %v"", err) } var jsonResponse map[string]interface{} err = json.Unmarshal(body, &jsonResponse) if err != nil { return 0, fmt.Errorf(""error parsing JSON response: %v"", err) } items, ok := jsonResponse[""items""].([]interface{}) if !ok { return 0, fmt.Errorf(""error parsing group list from response"") } for _, item := range items { group := item.(map[string]interface{}) if group[""shortDescription""] == groupName { groupId, ok := group[""userGroupId""].(float64) if !ok { return 0, fmt.Errorf(""error parsing group ID from response"") } return int(groupId), nil } } fmt.Println(""Group could not be found for name:"", groupName) return 0, fmt.Errorf(""group not found"") } func listGroupMembers(host, token string, groupId int) error { client := &http.Client{} nonce := rand.Int63() req, err := http.NewRequest(""GET"", fmt.Sprintf(""%s/api/user-groups/%d/members"", host, groupId), nil) if err != nil { return fmt.Errorf(""error creating request: %v"", err) } req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return fmt.Errorf(""error sending request: %v"", err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return fmt.Errorf(""error reading response body: %v"", err) } fmt.Println(string(body)) return nil } func generateToken(host, restUsername, restPassword string) (string, error) { nonce := rand.Int63() requestBody, err := json.Marshal(map[string]string{ ""userName"": restUsername, ""password"": restPassword, }) if err != nil { return """", fmt.Errorf(""error marshaling request body: %v"", err) } client := &http.Client{} req, err := http.NewRequest(""POST"", fmt.Sprintf(""%s/api/refresh-tokens"", host), bytes.NewBuffer(requestBody)) if err != nil { return """", fmt.Errorf(""error creating request: %v"", err) } req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d"", time.Now().UnixMilli(), nonce)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return """", fmt.Errorf(""error sending request: %v"", err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return """", fmt.Errorf(""error reading response body: %v"", err) } var jsonResponse map[string]interface{} err = json.Unmarshal(body, &jsonResponse) if err != nil { return """", fmt.Errorf(""error parsing JSON response: %v"", err) } accessToken, ok := jsonResponse[""_embedded""].(map[string]interface{})[""accessToken""].(map[string]interface{})[""securityToken""].(string) if !ok { return """", fmt.Errorf(""token not retrieved successfully"") } fmt.Println(""Access Token:"", accessToken) return accessToken, nil }
const fetch = require(""node-fetch""); async function main() { console.log(""List Group Member Components""); const host = ""http://localhost:8080/Yellowfin""; const restUsername = ""admin@yellowfin.com.au""; const restPassword = ""test""; const groupName = ""New Group""; const token = await generateToken(host, restUsername, restPassword); if (token === null) { console.error(""Failed to retrieve access token""); return; } try { const groupId = await retrieveGroupIpIdForGroupName(host, token, groupName); await listGroupMembers(host, token, groupId); } catch (error) { console.error(""Error:"", error.message); } } async function retrieveGroupIpIdForGroupName(host, token, groupName) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups`, { method: 'GET', headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonResponse = await response.json(); const groups = jsonResponse.items; for (let group of groups) { if (group.shortDescription === groupName) { return group.userGroupId; } } console.log(`Group could not be found for name: ${groupName}`); process.exit(-1); } catch (error) { console.error(""Error:"", error.message); throw error; } } async function listGroupMembers(host, token, groupId) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups/${groupId}/members`, { method: 'GET', headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const responseBody = await response.text(); console.log(responseBody); } catch (error) { console.error(""Error:"", error.message); } } async function generateToken(host, restUsername, restPassword) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; const body = JSON.stringify({ userName: restUsername, password: restPassword }); try { const response = await fetch(`${host}/api/refresh-tokens`, { method: 'POST', headers: headers, body: body }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonResponse = await response.json(); const accessToken = jsonResponse._embedded.accessToken.securityToken; if (accessToken) { console.log(`Access Token: ${accessToken}`); return accessToken; } else { console.log(""Token not retrieved""); } } catch (error) { console.error(""Error:"", error.message); } return null; } main();
<?php function main() { echo ""List Group Member Components\n""; $host = ""http://localhost:8080/Yellowfin""; $restUsername = ""admin@yellowfin.com.au""; $restPassword = ""test""; $groupName = ""New Group""; try { $token = generateToken($host, $restUsername, $restPassword); } catch (Exception $e) { echo ""Error generating token: "" . $e->getMessage(); return; } try { $groupId = retrieveGroupIpIdForGroupName($host, $token, $groupName); } catch (Exception $e) { echo ""Error retrieving group ID: "" . $e->getMessage(); return; } $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); try { $response = httpRequest('GET', ""$host/api/user-groups/$groupId/members"", $headers); echo $response; } catch (Exception $e) { echo ""Error sending request: "" . $e->getMessage(); } } function generateToken($host, $restUsername, $restPassword) { $nonce = mt_rand(); $requestBody = json_encode(array( ""userName"" => $restUsername, ""password"" => $restPassword )); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('POST', ""$host/api/refresh-tokens"", $headers, $requestBody); $jsonResponse = json_decode($response, true); if (isset($jsonResponse[""_embedded""][""accessToken""][""securityToken""])) { $accessToken = $jsonResponse[""_embedded""][""accessToken""][""securityToken""]; echo ""Access Token: "" . $accessToken . ""\n""; return $accessToken; } else { throw new Exception(""Token not retrieved successfully""); } } function retrieveGroupIpIdForGroupName($host, $token, $groupName) { $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('GET', ""$host/api/user-groups"", $headers); $jsonResponse = json_decode($response, true); $groups = $jsonResponse[""items""]; foreach ($groups as $group) { if ($group[""shortDescription""] === $groupName) { return $group[""userGroupId""]; } } echo ""Group could not be found for name: $groupName\n""; exit(-1); } function httpRequest($method, $url, $headers, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($data !== null) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception('Error: ' . curl_error($ch)); } curl_close($ch); return $response; } main(); ?>
import json import random import time import requests def main(): print(""List Group Member Components"") host = ""http://localhost:8080/Yellowfin"" rest_username = ""admin@yellowfin.com.au"" rest_password = ""test"" group_name = ""New Group"" try: token = generate_token(host, rest_username, rest_password) except Exception as e: print(f""Error generating token: {e}"") return try: group_id = retrieve_group_ip_id_for_group_name(host, token, group_name) except Exception as e: print(f""Error retrieving group ID: {e}"") return nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } try: response = requests.get(f""{host}/api/user-groups/{group_id}/members"", headers=headers) response.raise_for_status() print(response.text) except requests.RequestException as e: print(f""Error sending request: {e}"") def generate_token(host, rest_username, rest_password): nonce = random.randint(0, 2**63 - 1) request_body = json.dumps({ ""userName"": rest_username, ""password"": rest_password }) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.post(f""{host}/api/refresh-tokens"", headers=headers, data=request_body) if response.status_code == 200: json_response = response.json() access_token = json_response[""_embedded""][""accessToken""][""securityToken""] print(""Access Token:"", access_token) return access_token else: raise Exception(""Token not retrieved successfully"") def retrieve_group_ip_id_for_group_name(host, token, group_name): nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.get(f""{host}/api/user-groups"", headers=headers) if response.status_code == 200: json_response = response.json() groups = json_response[""items""] for group in groups: if group[""shortDescription""] == group_name: return group[""userGroupId""] print(f""Group could not be found for name: {group_name}"") exit(-1) else: raise Exception(""Error retrieving group"") if __name__ == ""__main__"": main()
グループメンバーの一覧化 (平滑化)
既存のグループのメンバーは、GET /api/user-groups/{groupId}/flat-users エンドポイント Get User Group Flat User List を使用して返すことができます。こちらのサービスは、グループの個々のユーザーメンバーを返します。こちらのサービスは、他のグループ、ロール、LDAPグループなど、複数のユーザーを表すグループメンバーコンポーネントに含まれている可能性のあるユーザーの拡張一覧を返します。
以下の例では、グループメンバーコンポーネントの一覧を表すJSON ペイロードを返します。
こちらのJava コードの例では、REST 呼び出しとJSON シリアル化の処理に、Apache HTTP クライアントとGSONを使用しています。
package rest.code.examples; import java.io.IOException; import java.util.Random; import org.apache.hc.client5.http.fluent.Content; import org.apache.hc.client5.http.fluent.Request; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; /** * List the flattened group members from a User Group using the Yellowfin REST API */ public class ListGroupMembersFlattened { public static void main(String[] args) throws Exception { System.out.println(""List Group Member Flattened""); String host = ""http://localhost:8080/Yellowfin""; String restUsername = ""admin@yellowfin.com.au""; String restPassword = ""test""; String groupName = ""New Group""; String token = generateToken(host, restUsername, restPassword); Integer groupId = retrieveGroupIpIdForGroupName(host, token, groupName); Content c = Request.get(host + ""/api/user-groups/"" + groupId + ""/flat-users"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); System.out.println(c.toString()); } public static Integer retrieveGroupIpIdForGroupName(String host, String token, String groupName) throws IOException { Content c = Request.get(host + ""/api/user-groups"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong() + "", token="" + token) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement groupList = jsonObject.get(""items""); JsonArray groups = groupList.getAsJsonArray(); for (int i=0; i < groups.size(); i++ ) { JsonObject group = groups.getAsJsonArray().get(i).getAsJsonObject(); if (groupName.equals(group.get(""shortDescription"").getAsString())) return group.get(""userGroupId"").getAsInt(); } System.out.println(""Group could not be found for name:"" + groupName); System.exit(-1); return null; } /* * This function generates an access token for a user that will grant them access to * call REST API endpoints. */ public static String generateToken(String host, String username, String password) throws IOException { Content c = Request.post(host + ""/api/refresh-tokens"") .addHeader(""Authorization"", ""YELLOWFIN ts="" + System.currentTimeMillis() + "" , nonce="" + new Random().nextLong()) .addHeader(""Accept"", ""application/vnd.yellowfin.api-v1+json"") .addHeader(""Content-Type"", ""application/json"") .bodyString(""{ \""userName\"": \""""+ username + ""\"",\""password\"": \""""+ password + ""\""}"", null) .execute().returnContent(); JsonObject jsonObject = new JsonParser().parse(c.asString()).getAsJsonObject(); JsonElement accessToken = jsonObject.getAsJsonObject(""_embedded"").getAsJsonObject(""accessToken"").get(""securityToken""); if (accessToken!=null) { System.out.println(""Access Token: "" + accessToken); } else { System.out.println(""Token not retrieved successfully""); System.exit(-1); } return accessToken.getAsString(); } }
using System.Net.Http.Headers; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace YellowfinAPIExamples { public class ListGroupMembersFlattened { static async Task Main(string[] args) { Console.WriteLine(""List Group Member Flattened""); string host = ""http://localhost:8080/Yellowfin""; string restUsername = ""admin@yellowfin.com.au""; string restPassword = ""test""; string groupName = ""New Group""; string token = await GenerateToken(host, restUsername, restPassword); int groupId = await RetrieveGroupIpIdForGroupName(host, token, groupName); using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", $""ts={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}, nonce={new Random().NextInt64()}, token={token}""); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await httpClient.GetAsync($""{host}/api/user-groups/{groupId}/flat-users""); if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseBody); } else { Console.WriteLine(""Failed to retrieve group members. Status code: "" + response.StatusCode); } } } static async Task<int> RetrieveGroupIpIdForGroupName(string host, string token, string groupName) { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", $""ts={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}, nonce={new Random().NextInt64()}, token={token}""); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await httpClient.GetAsync($""{host}/api/user-groups""); if (!response.IsSuccessStatusCode) { throw new HttpRequestException($""Failed to retrieve user groups. Status code: {response.StatusCode}""); } string responseBody = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseBody); JArray groups = (JArray)jsonObject[""items""]; foreach (var group in groups) { if (group[""shortDescription""].ToString() == groupName) { return (int)group[""userGroupId""]; } } Console.WriteLine(""Group could not be found for name: "" + groupName); Environment.Exit(-1); return 0; } } static async Task<string> GenerateToken(string host, string username, string password) { using (var client = new HttpClient()) { long nonce = new Random().NextInt64(); var request = new HttpRequestMessage(HttpMethod.Post, $""{host}/api/refresh-tokens"") { Content = new StringContent( JsonConvert.SerializeObject(new { userName = username, password = password }), System.Text.Encoding.UTF8, ""application/json"" ) }; request.Headers.Authorization = new AuthenticationHeaderValue(""YELLOWFIN"", $""ts={DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}, nonce={nonce}""); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(""application/vnd.yellowfin.api-v1+json"")); HttpResponseMessage response = await client.SendAsync(request); string responseContent = await response.Content.ReadAsStringAsync(); JObject jsonObject = JsonConvert.DeserializeObject<JObject>(responseContent); string accessToken = jsonObject[""_embedded""][""accessToken""][""securityToken""].ToString(); if (!string.IsNullOrEmpty(accessToken)) { Console.WriteLine(""Access Token: "" + accessToken); } else { Console.WriteLine(""Token not retrieved successfully""); Environment.Exit(-1); } return accessToken; } } } }
package main import ( ""bytes"" ""encoding/json"" ""fmt"" ""io/ioutil"" ""math/rand"" ""net/http"" ""os"" ""time"" ) func main() { fmt.Println(""List Group Member Flattened"") host := ""http://localhost:8080/Yellowfin"" restUsername := ""admin@yellowfin.com.au"" restPassword := ""test"" groupName := ""New Group"" token, err := generateToken(host, restUsername, restPassword) if err != nil { fmt.Println(""Error generating token:"", err) return } groupId, err := retrieveGroupIpIdForGroupName(host, token, groupName) if err != nil { fmt.Println(""Error retrieving group ID:"", err) return } client := &http.Client{} req, err := http.NewRequest(""GET"", fmt.Sprintf(""%s/api/user-groups/%d/flat-users"", host, groupId), nil) if err != nil { fmt.Println(""Error creating request:"", err) return } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { fmt.Println(""Error sending request:"", err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(""Error reading response body:"", err) return } fmt.Println(string(body)) } func retrieveGroupIpIdForGroupName(host, token, groupName string) (int, error) { client := &http.Client{} req, err := http.NewRequest(""GET"", fmt.Sprintf(""%s/api/user-groups"", host), nil) if err != nil { return 0, fmt.Errorf(""error creating request: %v"", err) } nonce := rand.Int63() req.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d, token=%s"", time.Now().UnixMilli(), nonce, token)) req.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") req.Header.Set(""Content-Type"", ""application/json"") resp, err := client.Do(req) if err != nil { return 0, fmt.Errorf(""error sending request: %v"", err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return 0, fmt.Errorf(""error reading response body: %v"", err) } var jsonObject map[string]interface{} if err := json.Unmarshal(body, &jsonObject); err != nil { return 0, fmt.Errorf(""error parsing JSON response: %v"", err) } items, ok := jsonObject[""items""].([]interface{}) if !ok { return 0, fmt.Errorf(""items not found in response"") } for _, item := range items { group := item.(map[string]interface{}) if group[""shortDescription""] == groupName { return int(group[""userGroupId""].(float64)), nil } } fmt.Println(""Group could not be found for name:"", groupName) os.Exit(-1) return 0, fmt.Errorf(""group not found"") } func generateToken(host, username, password string) (string, error) { nonce := rand.Int63() requestBody, err := json.Marshal(map[string]string{ ""userName"": username, ""password"": password, }) if err != nil { return """", fmt.Errorf(""error marshaling request body: %v"", err) } client := &http.Client{} request, err := http.NewRequest(""POST"", fmt.Sprintf(""%s/api/refresh-tokens"", host), bytes.NewBuffer(requestBody)) if err != nil { return """", fmt.Errorf(""error creating request: %v"", err) } request.Header.Set(""Authorization"", fmt.Sprintf(""YELLOWFIN ts=%d, nonce=%d"", time.Now().UnixMilli(), nonce)) request.Header.Set(""Accept"", ""application/vnd.yellowfin.api-v1+json"") request.Header.Set(""Content-Type"", ""application/json"") response, err := client.Do(request) if err != nil { return """", fmt.Errorf(""error sending request: %v"", err) } defer response.Body.Close() responseBody, err := ioutil.ReadAll(response.Body) if err != nil { return """", fmt.Errorf(""error reading response body: %v"", err) } var jsonResponse map[string]interface{} if err := json.Unmarshal(responseBody, &jsonResponse); err != nil { return """", fmt.Errorf(""error parsing JSON response: %v"", err) } accessToken, ok := jsonResponse[""_embedded""].(map[string]interface{})[""accessToken""].(map[string]interface{})[""securityToken""].(string) if !ok { return """", fmt.Errorf(""token not retrieved successfully"") } fmt.Println(""Access Token:"", accessToken) return accessToken, nil }
const fetch = require('node-fetch'); async function main() { console.log(""List Group Member Flattened""); const host = ""http://localhost:8080/Yellowfin""; const restUsername = ""admin@yellowfin.com.au""; const restPassword = ""test""; const groupName = ""New Group""; const token = await generateToken(host, restUsername, restPassword); if (token === null) { console.error(""Failed to retrieve access token""); return; } const groupId = await retrieveGroupIpIdForGroupName(host, token, groupName); if (groupId === null) { console.error(""Failed to retrieve group ID""); return; } const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups/${groupId}/flat-users`, { method: 'GET', headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const responseBody = await response.text(); console.log(responseBody); } catch (error) { console.error(""Error:"", error.message); } } async function retrieveGroupIpIdForGroupName(host, token, groupName) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}, token=${token}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; try { const response = await fetch(`${host}/api/user-groups`, { method: 'GET', headers: headers }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonObject = await response.json(); const groups = jsonObject.items; for (const group of groups) { if (group.shortDescription === groupName) { return group.userGroupId; } } console.error(""Group could not be found for name: "" + groupName); process.exit(-1); } catch (error) { console.error(""Error:"", error.message); } return null; } async function generateToken(host, username, password) { const nonce = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); const headers = { 'Authorization': `YELLOWFIN ts=${Date.now()}, nonce=${nonce}`, 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' }; const body = JSON.stringify({ userName: username, password: password }); try { const response = await fetch(`${host}/api/refresh-tokens`, { method: 'POST', headers: headers, body: body }); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const jsonResponse = await response.json(); const accessToken = jsonResponse._embedded.accessToken.securityToken; if (accessToken) { console.log(`Access Token: ${accessToken}`); } else { console.error(""Token not retrieved successfully""); process.exit(-1); } return accessToken; } catch (error) { console.error(""Error:"", error.message); } return null; } main();
<?php function main() { echo ""List Group Member Flattened\n""; $host = ""http://localhost:8080/Yellowfin""; $restUsername = ""admin@yellowfin.com.au""; $restPassword = ""test""; $groupName = ""New Group""; try { $token = generateToken($host, $restUsername, $restPassword); } catch (Exception $e) { echo ""Error generating token: "" . $e->getMessage() . ""\n""; return; } try { $groupId = retrieveGroupIpIdForGroupName($host, $token, $groupName); } catch (Exception $e) { echo ""Error retrieving group ID: "" . $e->getMessage() . ""\n""; return; } $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); try { $response = httpRequest('GET', ""$host/api/user-groups/$groupId/flat-users"", $headers); echo $response; } catch (Exception $e) { echo ""Error sending request: "" . $e->getMessage() . ""\n""; } } function retrieveGroupIpIdForGroupName($host, $token, $groupName) { $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce . ', token=' . $token, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $response = httpRequest('GET', ""$host/api/user-groups"", $headers); $jsonObject = json_decode($response, true); $groups = $jsonObject['items']; foreach ($groups as $group) { if ($group['shortDescription'] === $groupName) { return $group['userGroupId']; } } echo ""Group could not be found for name: "" . $groupName . ""\n""; exit(-1); } function generateToken($host, $username, $password) { $nonce = mt_rand(); $headers = array( 'Authorization: YELLOWFIN ts=' . intval(microtime(true) * 1000) . ', nonce=' . $nonce, 'Accept: application/vnd.yellowfin.api-v1+json', 'Content-Type: application/json' ); $requestBody = json_encode(array( ""userName"" => $username, ""password"" => $password )); $response = httpRequest('POST', ""$host/api/refresh-tokens"", $headers, $requestBody); $jsonResponse = json_decode($response, true); if (isset($jsonResponse[""_embedded""][""accessToken""][""securityToken""])) { $accessToken = $jsonResponse[""_embedded""][""accessToken""][""securityToken""]; echo ""Access Token: "" . $accessToken . ""\n""; return $accessToken; } else { throw new Exception(""Token not retrieved successfully""); } } function httpRequest($method, $url, $headers, $data = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if ($data !== null) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } $response = curl_exec($ch); if (curl_errno($ch)) { throw new Exception('Error: ' . curl_error($ch)); } curl_close($ch); return $response; } main(); ?>
import json import random import time import requests def main(): print(""List Group Member Flattened"") host = ""http://localhost:8080/Yellowfin"" rest_username = ""admin@yellowfin.com.au"" rest_password = ""test"" group_name = ""New Group"" try: token = generate_token(host, rest_username, rest_password) except Exception as e: print(f""Error generating token: {e}"") return try: group_id = retrieve_group_ip_id_for_group_name(host, token, group_name) except Exception as e: print(f""Error retrieving group ID: {e}"") return nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } try: response = requests.get(f""{host}/api/user-groups/{group_id}/flat-users"", headers=headers) response.raise_for_status() print(response.text) except requests.RequestException as e: print(f""Error sending request: {e}"") def retrieve_group_ip_id_for_group_name(host, token, group_name): nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}, token={token}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } response = requests.get(f""{host}/api/user-groups"", headers=headers) response.raise_for_status() json_object = response.json() groups = json_object['items'] for group in groups: if group['shortDescription'] == group_name: return group['userGroupId'] print(f""Group could not be found for name: {group_name}"") exit(-1) def generate_token(host, rest_username, rest_password): nonce = random.randint(0, 2**63 - 1) headers = { 'Authorization': f'YELLOWFIN ts={int(time.time() * 1000)}, nonce={nonce}', 'Accept': 'application/vnd.yellowfin.api-v1+json', 'Content-Type': 'application/json' } request_body = json.dumps({ ""userName"": rest_username, ""password"": rest_password }) response = requests.post(f""{host}/api/refresh-tokens"", headers=headers, data=request_body) response.raise_for_status() json_response = response.json() access_token = json_response[""_embedded""][""accessToken""][""securityToken""] print(""Access Token:"", access_token) return access_token if __name__ == ""__main__"": main()