Ионное приложение angular-oauth2-oidc hasValidToken() всегда имеет значение false (android не работает, ios работает)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Ионное приложение angular-oauth2-oidc hasValidToken() всегда имеет значение false (android не работает, ios работает)

Сообщение Anonymous »

Итак, у нас есть приложение Ionic Angular для Android и iOS. Мы используем пакет angular-oauth2-oidc с нашим серверным клоаком для аутентификации пользователей. Сегодня мы заметили, что вход в систему в версии нашего приложения для Android не работает (мы не знаем, как долго это не работает). Мы протестировали обе платформы (код один и тот же), и iOS работает нормально, но Android не работает с токеном.
  • Пользователь нажимает кнопку для входа в Google или Facebook.
    Приложение открывается в браузере приложения @capacitor/browser с помощью веб-сайта keycloak.
  • Пользователь может выбирать между входом в систему с помощью Google, Facebook или просто вводом имени пользователя и пароля. >
  • После его выбора keycloak перенаправляет пользователя в приложение.
  • Если метод токена hasValidToken() возвращает true, то поток приложения будет перенаправлять пользователя на экраны других приложений.
В чем проблема на Android, но на iOS работает нормально?
  • Выше 1, 2, 3, 4 шага работают нормально
  • Когда приложение возвращается после перенаправления, hasValidToken() всегда возвращает false.
  • Пользователь не перенаправляется на другие экраны приложения (экраны для аутентифицированного пользователя)
  • Когда пользователь снова нажимает кнопку входа в Google или Facebook, процесс повторяется без шага 3, поскольку keycloak знает, что этот пользователь уже вошел в систему, поэтому выполняется перенаправление в приложение
  • После приложение перенаправления иногда свернуто (не всегда, и в logcat и консоли инструментов разработки не видно никаких ошибок или ошибок js)
Все должно работать нормально, так как оно работает для iOS. Прежде чем мы это заметили, все работало нормально, и в течение двух лет в этой части приложения не было внесено никаких изменений в код.
  • ОС: Android
  • Браузер: приложение Ionic (@capacitor/browser используется для открытия keycloak из методов oauth)
  • Версия [например. 22]: "angular-oauth2-oidc": "^15.0.1"
  • Инициализация плагина выполняется в приложении .module.ts вот так:

Код: Выделить всё

const authConfig: AuthConfig = {
issuer: 'issuer url here',
requireHttps: true,
redirectUri: 'our redirect uri',
clientId: 'our client id',
responseType: 'code',
revocationEndpoint: 'revoke endpoint',
showDebugInformation: true,
useSilentRefresh: true,
openUri: (uri) => {
Browser.open({ url: uri });
},
};

const initializeAuth = (
oauthService: OAuthService,
authService: AuthService,
storageService: StorageService
): (() => Promise) => async () => {
await storageService.init();
oauthService.configure(authConfig);
oauthService.setupAutomaticSilentRefresh();
authService.addAppUrlOpenListener();
return oauthService
.loadDiscoveryDocumentAndTryLogin()
.then(() => {
console.log('OAuth discovery document loaded');
})
.catch((error) => {
console.error('Error loading discovery document:', error);
});
};

...other providers in module
{ provide: APP_INITIALIZER, useFactory: initializeAuth, multi: true, deps: [OAuthService, AuthService, StorageService] },
...other providers in module
Конфигурация в порядке, StorageService.init() также работает нормально, ошибок здесь нет
  • Метод addAppUrlOpenListener выглядит следующим образом

Код: Выделить всё

    addAppUrlOpenListener = (): void => {
App.addListener('appUrlOpen', async (event) => {
const url = new URL(event.url);
this.loggerService.sendLog('App URL opened', { url: event.url });

this.zone.run(async () => {
const queryParams: Params = {};
for (const [key, value] of url.searchParams.entries()) {
queryParams[key] = value;
}
this.router.navigate([], { relativeTo: this.activatedRoute, queryParams }).then(() => {
this.oauthService.tryLogin().then((result) => {
if (this.hasValidAccessToken) {
this.handleAfterLoginActions();
}
});

});

});
});
};
  • А также у нас есть метод authOnAppInit, который запускается при инициализации приложения в app.comComponent.ts, чтобы проверить, вошел ли пользователь уже в систему. Представленные здесь журналы консоли предназначены только для устранения этой проблемы.

Код: Выделить всё

    authOnAppInit = (): void => {
this.oauthService
.loadDiscoveryDocumentAndTryLogin({
onTokenReceived: (info) => {
console.log('Token received callback:', info);
},
onLoginError: (error) => {
console.error('Login error:', error);
},
})
.then((result) => {
this.hasValidAccessToken = this.oauthService.hasValidAccessToken();
const accessToken = this.oauthService.getAccessToken();
const accessTokenExpiration = this.oauthService.getAccessTokenExpiration();

console.log('Try login result:', result);
console.log('Access Token:', accessToken || 'No access token');
console.log('Access Token Expiration:', accessTokenExpiration ? new Date(accessTokenExpiration) : 'No expiration');
console.log('Has Valid Access Token:', this.hasValidAccessToken);

if (this.hasValidAccessToken) {
this.handleAfterLoginActions();
}
})
.catch((error) => {
console.error('Error during app initialization login check:', error);
});

this.oauthService.events.subscribe((event) => {
console.log('OAuth event received:', event,);

this.loggerService.sendLog('OAuth event', { event });
this.hasValidAccessToken = this.oauthService.hasValidAccessToken();
if (this.hasValidAccessToken) {
this.handleAfterLoginActions();
}
});
};
Итак, еще раз — для Android приведенные выше журналы консоли:
  • Попробуйте войти результат — true (насколько я понимаю, это означает, что вход в систему выполнен успешно)
  • Токен доступа — ноль
  • Срок действия токена доступа — ноль
    Имеет действительный токен доступа — ложь
  • Получено событие OAuth — OAuthSuccessEvent {type: 'discovery_document_loaded', info: {...}
Мы отлаживали его для несколько часов, и, как я писал выше, ни в одном из этих методов плагина нет ошибок или даже собственных ошибок из Android Logcat.
Есть идеи?

Подробнее здесь: https://stackoverflow.com/questions/793 ... d-fails-io
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»