#authentication #testing #automated-tests #testcafe #identity-aware-proxy
#аутентификация #тестирование #автоматизированные тесты #testcafe #с учетом идентификации-прокси
Вопрос:
Наша тестовая среда поддерживает Google IAP, и тестируемое приложение использует токены на предъявителя для аутентификации пользователя.
Чтобы получить доступ к тестовой среде, я получаю токен Google JWT, а затем добавляю его в качестве Authorization
заголовка для всех запросов, расширяя RequestHook
:
import { RequestHook } from 'testcafe';
import config from '../config/.config.json';
import serviceGoogleAccount from '../config/.service-google-account.json';
import { GoogleAuth } from 'google-auth-library';
export class GoogleIapJWTAuthorization extends RequestHook {
constructor () {
// No URL filtering applied to this hook
// so it will be used for all requests.
super();
const auth = new GoogleAuth({
credentials: serviceGoogleAccount
});
console.log('Google Authentication');
console.log(`Loaded Service Account ${serviceGoogleAccount.client_email}`);
auth.getClient()
.then(client => client.fetchIdToken(`${config.googleAuthSettings.targetAudience}`))
.then(token => {
console.log(`Successfully authenticated with Identity Aware Proxy. Id Token: ${token}`);
this._token = token;
return token;
})
.catch(err => {
console.log(`Identity Aware Proxy Authentication Failed. Id Token: ${token}`);
console.log(JSON.stringify(err));
process.exitCode = 1;
});
}
getGoogleJwtToken() {
return this._token;
}
onRequest (e) {
//Authorization header for authentication into Google Auth IAP
e.requestOptions.headers['Authorization']= `Bearer ${this._token}`;
}
onResponse (e) {
// This method must also be overridden,
// but you can leave it blank.
}
}
При ручном тестировании и входе в учетную запись Google для доступа к тестовой среде этот токен устанавливается как файл cookie:
Пример cookie, установленный Google IAP после входа в систему
Пока все хорошо.
Проблема возникает, когда я пытаюсь войти в приложение с пользователем. Наша конечная точка идентификации возвращает токен на предъявителя для пользователя, и для доступа к страницам, специфичным для пользователя, мне нужно передать токен на предъявителя этого пользователя в качестве заголовка авторизации при запросах.
Но из-за вышеупомянутой реализации токена Google JWT заголовок авторизации уже используется. И поскольку после входа в приложение я получаю 401 несанкционированный доступ к страницам / конечным точкам, для которых требуется токен пользователя на предъявителя, я предполагаю, что токен пользователя на предъявителя перезаписывается токеном Google JWT выше.
Есть ли какой-либо способ решить эту проблему?
Насколько я понимаю, установка файла cookie не так проста в соответствии с https://github.com/DevExpress/testcafe/issues/4063
Комментарии:
1. Кажется, что нет необходимости устанавливать токен доступа через RequestHook при аутентификации в качестве пользователя. Насколько я понимаю, вы входите в систему как пользователь через браузер, поэтому он сам установит требуемый файл cookie
2. Возможно, я не очень хорошо это объяснил — у нас есть 2 шага: 1. Форма входа в Google для доступа к тестовой среде (эта часть просто не разрешает доступ извне к нашим тестовым средам, ее нет в рабочей среде) 2. Наш механизм входа пользователя, который использует токены на предъявителя в заголовке авторизациии не устанавливает файлы cookie При ручном доступе к тестовой среде Я выполняю вход в систему с помощью учетной записи Google, и для этого устанавливается файл cookie. Я не могу автоматизировать этот процесс с помощью TestCafe, потому что Google может показывать captcha для автоматических попыток (и это также замедляет тесты).
3. Если я правильно понимаю, вы используете аутентификацию Google IAP для доступа к своей тестовой среде, и вы не можете войти в тесты через браузер из-за captcha. Кроме того, ваше приложение имеет собственную аутентификацию, которая использует токен, переданный через заголовок авторизации. При запуске приложения вручную Google IAP устанавливает файл cookie аутентификации вместо токена. Тесты не работают, поскольку приложение и Google IAP используют один и тот же заголовок. TestCafe не позволяет устанавливать cookie в тесте. Возможно ли использовать аутентификацию cookie в вашем приложении?
4. Все вышесказанное верно. Небольшая поправка к моему предыдущему комментарию — при входе в Google IAP через пользовательский интерфейс, похоже, не отображается captcha (по крайней мере, для нескольких запусков, которые я сделал), поэтому мой план на данный момент будет заключаться в использовании аутентификации Google IAP UI для тестов, в которых мне нужен пользователь для входа в наше приложение.