Я получил токен от AAD с помощью Msal, но не могу получить профиль пользователя, используя полученный токен. Как проверить токен просто на бэкэнде Node? - PullRequest
2 голосов
/ 30 мая 2019

Я использовал следующую конфигурацию для запроса токена из AAD.

Файл app.module.ts:

MsalModule.forRoot({
            clientID: 'CLIENT_ID',
            authority: "https://login.microsoftonline.com/TENANT_ID",
            validateAuthority: true,
            cacheLocation: 'sessionStorage',
            postLogoutRedirectUri: 'http://localhost:4200/authorize/signin',
            navigateToLoginRequestUrl: true,
            popUp: true,
            consentScopes: ['user.read', 'https://graph.microsoft.com']
        }

Возвращает пары msal.idtoken, accesstoken и еще несколько значений ключей msal. Теперь следующий код используется для получения профиля пользователя путем вставки полученного MSAL_IDTOKEN.

const request = require('request');
const tok = 'MSAL_IDTOKEN HERE';
request.get({ url: "https://graph.microsoft.com/v1.0/me", headers: { "Authorization": "Bearer " + tok, "Content-type": "application/json" } }, function (err, response, body) {

    if (err) {
        console.log('err', err);
    }
    else
        console.log(response.body);
})

Теперь после запуска приложения на узле оно возвращало профиль пользователя, найденный после декодирования токена, но теперь это не так.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Я вижу, что у вас есть правильная конфигурация на портале.

Если вы используете MSAL.js, приведите такой код:

    this.app = new Msal.UserAgentApplication(

        this.applicationConfig.clientID,

        `https://login.microsoftonline.com/${AzureADName}/`,

        () => {

            // callback for login redirect

        },

        {

            redirectUri

        }

    );

Затем вы бы позвонили, чтобы получить информацию о пользователе:

this.app.getUser();

или

this.app.getAccount();

Вы должны будете предоставить информацию о версии, чтобы быть уверенным, поскольку API был изменен.

0 голосов
/ 30 мая 2019

Похоже, вы пытаетесь прочитать профиль пользователя с вашего токена доступа.

Для этого вам необходимо назначить profile выделенное разрешение на портале Azure.

См. Снимок экрана ниже:

enter image description here

Примечание: После назначения разрешения вы можете проверить свой токен на https://jwt.io/, содержит ли он необходимое разрешение.

Требование токена:

enter image description here

Считать данные пользователя:

enter image description here

Фрагмент кода:

Класс токенов:

 public class AccessTokenClass
        {
            public string token_type { get; set; }
            public string expires_in { get; set; }
            public string resource { get; set; }
            public string scope { get; set; }
            public string access_token { get; set; }
            public string refresh_token { get; set; }

        }

Метод токена:

private async Task<string> GetTokenByROPCFormat()
        {

            string tokenUrl = $"https://login.microsoftonline.com/YourTenantIdOrName/oauth2/token";

            var tokenRequest = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

            tokenRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                ["grant_type"] = "password",
                ["client_id"] = "b603c7be-a866--e6921e61f925",
                ["client_secret"] = "Vxf1SluKbgu4PF0Nf3wE5oG",
                ["resource"] = "https://graph.microsoft.com",
                ["username"] = "kironmemb@MyTenant.onmicrosoft.com",
                ["password"] = "@Mypassword"

            });

            dynamic json;
            dynamic results;
            HttpClient client = new HttpClient();

            var tokenResponse = await client.SendAsync(tokenRequest);

            json = await tokenResponse.Content.ReadAsStringAsync();
            results = JsonConvert.DeserializeObject<AccessTokenClass>(json);
            Console.WriteLine("Your Refresh Token=>{0}", results.refresh_token);



            //  New Block For Accessing Data from API
            HttpClient newClient = new HttpClient();

            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me");

            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", results.access_token);
            HttpResponseMessage response = await newClient.SendAsync(request);

            string output = await response.Content.ReadAsStringAsync();
            return output;




        }
...