Я новичок в Cypress и Azure AD, но я выполнял шаги, описанные здесь, чтобы создать тесты Cypress для существующего приложения Angular, которое использует Azure AD. В нем упоминается, что они используют ADAL, но в нашем приложении используется MSAL, который, по его словам, должен быть аналогичным. Однако я изо всех сил пытаюсь заставить его работать. Вот моя функция входа в систему:
const tenant = 'https://login.microsoftonline.com/{my_tenant_id}/';
const tenantUrl = `${tenant}oauth2/token`;
const clientId = '{my_app_id}';
const clientSecret = '{my_secret}';
const azureResource = 'api://{my_app_id}';
const knownClientApplicationId = '{client_application_id_from_manifest}';
const userId = '{user_identifier}';
export function login() {
cy.request({
method: 'POST',
url: tenantUrl,
form: true,
body: {
grant_type: 'client_credentials',
client_id: clientId,
client_secret: clientSecret,
resource: azureResource
}
}).then(response => {
const Token = response.body.access_token;
const ExpiresOn = response.body.expires_on;
const key = `{"authority":"${tenant}","clientId":"${knownClientApplicationId}","scopes":${knownClientApplicationId},"userIdentifier":${userId}}`;
const authInfo = `{"accessToken":"${Token}","idToken":"${Token}","expiresIn":${ExpiresOn}}`;
window.localStorage.setItem(`msal.idtoken`, Token);
window.localStorage.setItem(key, authInfo);
}
Cypress.Commands.add('login', login);
Когда я запускаю это, возвращается токен доступа. Когда я проверяю локальное хранилище после обычного запроса браузера, у него гораздо больше полей, таких как msal.client.info
(значение authInfo
в приведенном выше коде также должно содержать это значение), но я не знаю, откуда взять эту информацию.
Конечным результатом является то, что запрос POST, кажется, возвращается успешно, но тесты Cypress все еще считают пользователя неаутентифицированным.
Существующее приложение реализует CanActivate
службу, которая проходит, если MsalService.getUser()
возвращает действительного пользователя. Как я могу убедить эту службу, что мой пользователь Cypress действителен?
Обновлять:
После некоторых экспериментов со значениями локального хранилища выяснилось, что для прохождения входа в систему требуется только два значения:
msal.idtoken
msal.client.info
Первый у меня уже есть; во втором я не уверен, но он кажется, чтобы каждый раз возвращать одно и то же значение. На данный момент я жестко кодирую это значение в своих тестах, и, похоже, оно работает:
then(response => {
const Token = response.body.access_token;
window.localStorage.setItem(`msal.idtoken`, Token);
window.localStorage.setItem(`msal.client.info`, `{my_hard_coded_value}`);
});
Единственная незначительная проблема сейчас заключается в том, что метод MsalService.getUser()
возвращает немного другие значения, чем ожидает приложение (например, displayableId
и name
отсутствуют; idToken.azp
и idToken.azpacr
новые). Я буду исследовать дальше ...