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 @s_wasserbauer and @sinisa_zubic ,
Are you guys talking the same SDK?
Apologize if there is any misleading at my question.
@s_wasserbauer 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. @s_wasserbauer 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
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 @s_wasserbauer ,
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.
04 Mar 2025 04:34 PM
Hi,
I followed the description here:
https://developer.dynatrace.com/develop/sdks/app-environment/#getcurrentuserdetails
I'm getting this error in the console
Missing getCurrentUserDetails function from web runtime.
and this as the response obj
{id: 'dt.missing.user.id', name: 'dt.missing.user.name', email: 'dt.missing.user.email'}
Is there something I'm missing?
Thanks,
Zoltan
Thanks,
Zoltan
10 Mar 2025 09:28 AM
Hi Zoltan, can you please share more details on this?
Are you running the app in detached mode? Can you share the basic structure (anonymized) of the browser URL please?
This happens when the context of the platform is missing. E.g. running scripts outside of the platform.
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>
)}