18 Jul 2023 10:19 PM
Hey,
We are trying to build an app. We need the current user information, like name, login id/email, user groups, for further processing. Is there any SDK available that can return me this kind of information?
Thanks.
Stephen
Solved! Go to Solution.
18 Jul 2023 10:59 PM
I am not shure, but you can do it by APIs
19 Jul 2023 11:43 AM
The team is currently working on an SDK which should give you such kind of information. Unfortunately I can't give you an ETA for it.
Best,
Sini
19 Jul 2023 03:34 PM
following this thread... 👀
01 Aug 2023 08:43 AM - edited 01 Aug 2023 08:43 AM
Hi @StephenLHChan, the SDK package is planned for 23CQ3.
In the meanwhile, you could use the service documented in the swagger spec:
https://{environmentid}.apps.dynatrace.com/platform/swagger-ui/index.html?urls.primaryName=Identity%20and%20Access%20Management
01 Aug 2023 03:21 PM
Hi @sw and @sinisa_zubic ,
Are you guys talking the same SDK?
Apologize if there is any misleading at my question.
@sw gave the url which is the endpoint get all users' information but what I am looking for is if there is a way to get the current user information who use the app.
For example, userA click on the app and the SDK will return userA's information to me. And, I will know userA had used the app. I may then ingest logs/ custom events to Dynatrace after userA triggered certain actions.
It is to fulfil some audit requirements at my company.
Thanks!
07 Aug 2023 09:45 AM
Yes we are talking about the same SDK. @sw should know more details
07 Aug 2023 10:10 AM
Sorry for the confusion.
Yes, the SDK package will provide information as:
May I ask for your use case, why do you need the user groups too?
14 Aug 2023 09:28 PM
hi @sw
it is for access right control. If I know the user group of the users, I can limited certain pages of the app only to some users.
21 Aug 2023 02:14 PM
Thanks @StephenLHChan for the insights! This won't be part of this package for now, but I'll discuss this with the team.
23 Jul 2024 06:20 PM
Hi @sw ,
Has there been any update on the SDK yet?
17 Sep 2024 09:28 AM
There is a problem with the permission scope for this API that can't be assigned to an oauth client.
22 Aug 2024 08:41 AM
The package providing this information (except user groups) is now available: https://developer.dynatrace.com/develop/sdks/app-environment/
03 Sep 2024 12:51 PM - edited 10 Sep 2024 10:54 AM
I also have the same use case to shield of pages for default users; I would like to be able to access the user groups through the SDK.
10 Sep 2024 11:15 AM
Hi @DaveOps, a new SDK will soon be available to access the user groups. I'll let you know when it's out.
Best, Edu.
16 Sep 2024 01:16 PM
It seems this API is not available any more:
import { effectivePermissionsClient } from '@dynatrace-sdk/client-platform-management-service';
Outdated docs:
https://developer.dynatrace.com/develop/security/query-user-permissions/
Is there a workaround for this?
16 Sep 2024 01:23 PM
Hi @DaveOps, what do you mean it's not available? Here's the NPM package https://www.npmjs.com/package/@dynatrace-sdk/client-platform-management-service. Additionally I tried what's in our documentation and it works as expected. What issue are you having?
17 Sep 2024 09:30 AM
I am using and older version 1.0.1; that could be the issue.
16 Sep 2024 01:17 PM
Is there a way to get the user account_id ?
16 Sep 2024 03:23 PM
Hi @DaveOps, you can use this https://developer.dynatrace.com/develop/sdks/app-environment/#getcurrentuserdetails.
17 Sep 2024 09:18 AM - edited 17 Sep 2024 09:25 AM
I created a solution to address the user permission problem and will share some of the important parts.
The approach involves checking if a user is part of an admin group returning a boolean. This is a simple way of differentiating between 2 types of users.
Created an appFunction that fetches user groups with the getUserGroupsV2 function. This function checks if a user belongs to an admin group.
export const getUserGroupsV2 = async (accountUuid: string, userEmail: string, bearerToken: string) => {
const url = `https://api.dynatrace.com/iam/v1/accounts/${accountUuid}/users/${userEmail}`;
try {
const response = await fetch(`${url}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${bearerToken}`
}
});
if (!response.ok) {
const errorText = await response.text();
console.error('Error response:', errorText);
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('Error fetching groups:', error);
throw error;
}
};
Make an oauth request to get the bearer token:
export const getOAuth2Token = async (client_id: string, client_secret: string, scope: string, resource: string) => {
const url = 'https://sso.dynatrace.com/sso/oauth2/token';
const params = new URLSearchParams({
grant_type: 'client_credentials',
scope: scope,
client_id: client_id,
client_secret: client_secret,
resource: resource,
});
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: params.toString()
});
if (!response.ok) {
const errorText = await response.text();
console.error('Error response:', errorText);
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching OAuth2 token:', error);
throw error;
}
};
With a couple of helper functions:
const belongsToGroup = (user: User, groupName: string) => {
if (user && user.groups && Array.isArray(user.groups)) {
return user.groups.some(group => group.groupName.toLocaleLowerCase() === groupName.toLocaleLowerCase());
}
return false;
}
export const isSecurityAdmin = (user: User) => {
return belongsToGroup(user, 'Security Admin');
}
You can store the oauth credentials in a .env for development purposes however I would recommend adding additional features to fetch and update the settings using the client-app-settings from the sdk.
// example
import { appSettingsObjectsClient, EffectiveAppSettingsValuesList, AppSettingsObjectResponse } from '@dynatrace-sdk/client-app-settings';
export const fetchConfig = async (schemaId: string): Promise<any[] | null> => {
try {
const response: EffectiveAppSettingsValuesList = await appSettingsObjectsClient.getEffectiveAppSettingsValues({
schemaIds: schemaId,
});
if (response.items.length === 0) {
console.warn(`No configuration found for ${schemaId}.`);
return null;
}
console.log(`fetchConfig for schemaId: ${schemaId}`, response.items);
return response.items;
} catch (error) {
console.error(`Error fetching configuration for schemaId: ${schemaId}`, error);
return null;
}
};
export const updateAppSettings = async (
objectId: string,
value: { [key: string]: any },
optimisticLockingVersion: string
): Promise<boolean> => {
let result = false;
console.log('updateAppSettings', objectId, value);
try {
const putResponse: any = await appSettingsObjectsClient.putAppSettingsObjectByObjectId({
objectId: objectId,
optimisticLockingVersion: optimisticLockingVersion,
body: {
value: value
}
});
if (putResponse) {
console.log('Configuration updated:', putResponse);
result = true;
} else {
console.warn('No response received from PUT request.');
}
} catch (putError) {
console.error('Error during PUT:', putError);
}
return result;
};
The front-end parts:
// .... snippet
import React, { useEffect, useState } from 'react';
import { getCurrentUserDetails } from "@dynatrace-sdk/app-environment";
import { useAppFunction } from '@dynatrace-sdk/react-hooks';
// .... snippet
const [loading, setLoading] = useState(true);
const [userEmail, setUserEmail] = useState<string | null>(null);
const { setPermissions } = useAppState(); // custom hook to store state
// .... snippet
// implement your own appFunction to fetch permissions that uses the getUserGroupsV2 function.
const fetchPermissions = useAppFunction({
name: "backend",
data: { query: "fetch-permissions", blob: userEmail },
}, { autoFetch: false, autoFetchOnUpdate: true });
// .... snippet
useEffect(() => {
const fetchUserData = async () => {
try {
const userDetails = await getCurrentUserDetails();
console.log('User details:', userDetails);
if (userDetails.email) {
setUserEmail(userDetails.email);
fetchPermissions.refetch();
}
} catch (error) {
console.error('Failed to fetch data', error);
} finally {
setLoading(false);
}
}
fetchUserData();
}, []);
useEffect(() => {
if (fetchPermissions.data) {
const { permissions } = fetchPermissions.data as PermissionsResponse;
setPermissions(permissions);
}
}, [fetchPermissions]);
Based on the permissions you can toggle menu items:
{permissions?.admin && (
<AppHeader.ActionItemGroup>
<AppHeader.ActionButton
prefixIcon={<SettingIcon />}
showLabel={true}
onClick={() => navigate('/settings')}
aria-label="App Settings"
>
Settings
</AppHeader.ActionButton>
</AppHeader.ActionItemGroup>
)}