- Пользователь нажимает кнопку для входа в Google или Facebook.
Приложение открывается в браузере приложения @capacitor/browser с помощью веб-сайта keycloak. - Пользователь может выбирать между входом в систему с помощью Google, Facebook или просто вводом имени пользователя и пароля. >
- После его выбора keycloak перенаправляет пользователя в приложение.
- Если метод токена hasValidToken() возвращает true, то поток приложения будет перенаправлять пользователя на экраны других приложений.
- Выше 1, 2, 3, 4 шага работают нормально
- Когда приложение возвращается после перенаправления, hasValidToken() всегда возвращает false.
- Пользователь не перенаправляется на другие экраны приложения (экраны для аутентифицированного пользователя)
- Когда пользователь снова нажимает кнопку входа в Google или Facebook, процесс повторяется без шага 3, поскольку keycloak знает, что этот пользователь уже вошел в систему, поэтому выполняется перенаправление в приложение
- После приложение перенаправления иногда свернуто (не всегда, и в logcat и консоли инструментов разработки не видно никаких ошибок или ошибок js)
- ОС: 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
- Метод 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();
}
});
};
- Попробуйте войти результат — true (насколько я понимаю, это означает, что вход в систему выполнен успешно)
- Токен доступа — ноль
- Срок действия токена доступа — ноль
Имеет действительный токен доступа — ложь - Получено событие OAuth — OAuthSuccessEvent {type: 'discovery_document_loaded', info: {...}
Есть идеи?
Подробнее здесь: https://stackoverflow.com/questions/793 ... d-fails-io