Можно ли создать IdTokens для AzureAd для написания сквозных тестов с помощью транспортира? - PullRequest
0 голосов
/ 23 марта 2020

Мы пишем сквозные тесты с транспортиром для приложения, написанного в Angular. Приложение аутентифицируется с помощью Azure AD с использованием библиотеки ADAL.

В настоящее время мы нажимаем через процесс входа в AzureAd с помощью WebDriver перед началом тестирования, но это fr agile. У нас были проблемы с загрузкой экрана входа в систему с паролем Microsoft. Также локальный процесс входа может быть сложным, потому что иногда он принимает наши Windows учетные данные, а иногда нет.

В поисках альтернатив, можно сгенерировать:

  • Идентификатор в процессе запуска транспортира (onPrepare) через некоторую библиотеку узлов (например, паспорт?) Из Azure Объявление напрямую? Что я могу позже установить для тестов для использования.
  • Какой-то вечно живущий стати c Идентификатор носителя, который тесты e2e читают из файла конфигурации?

Есть ли какие-нибудь другой подход, который я мог бы пропустить?

1 Ответ

1 голос
/ 23 марта 2020

Вы можете использовать поток ROP C для получения токенов для тестов. Это один из случаев, когда использование этого потока может быть в порядке, на мой взгляд. Использование его для обхода экрана входа в обычное приложение не совсем нормально. Он также не работает со всеми видами пользователей, федеративные пользователи могут иногда работать, в зависимости от того, как он настроен.

Вот что я использовал:

// _authority = e.g. https://login.microsoftonline.com/company.com
string tokenUrl = _authority + "oauth2/v2.0/token";
var req = new HttpRequestMessage(HttpMethod.Post, tokenUrl)
{
    Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        ["grant_type"] = "password",
        ["client_id"] = settings.ClientId, // client id for your app
        ["client_secret"] = settings.ClientSecret, // client secret for your app
        ["scope"] = $"openid profile {_resourceUri}/.default", // here you define what you want tokens for
        ["username"] = settings.UserName,
        ["password"] = settings.Password
    })
};

HttpResponseMessage res = await _client.SendAsync(req);

string json = await res.Content.ReadAsStringAsync();
AadTokenResponse tokenResponse = JsonConvert.DeserializeObject<AadTokenResponse>(json);
// tokenResponse.IdToken contains the ID token

// The AadTokenResponse class:
class AadTokenResponse
{
    [JsonProperty("access_token")]
    public string AccessToken { get; set; }

    [JsonProperty("id_token")]
    public string IdToken { get; set; }
}

Область действия где вы должны указать хотя бы область действия openid для получения идентификатора токена. Здесь я также указал идентификатор приложения API URI + "/.default", чтобы получить токен доступа для API. Вы можете оставить область действия openid profile, если вам нужен только токен идентификатора.

Имейте в виду, что вам потребуется защитить учетные данные приложения и учетные данные пользователя в тестовой конфигурации. Кроме того, я рекомендую, чтобы эти учетные данные были , а не для производственной среды. Вам может понадобиться создать облачные учетные записи пользователей для их правильной работы. Кроме того, учетные записи пользователей не могут быть включены MFA. Если срок действия их пароля истекает, вам необходимо установить новый пароль и обновить тестовую конфигурацию.

...