Die ionische App angle-oauth2-oidc hasValidToken() ist immer falsch (Android schlägt fehl, iOS funktioniert)Android

Forum für diejenigen, die für Android programmieren
Guest
 Die ionische App angle-oauth2-oidc hasValidToken() ist immer falsch (Android schlägt fehl, iOS funktioniert)

Post by Guest »

Wir haben also eine Ionic Angular-App für Android und iOS. Wir verwenden das Paket „angular-oauth2-oidc“ mit unserem Server-Keycloak für die Benutzerauthentifizierung. Wir haben heute festgestellt, dass die Anmeldung bei der Android-Version unserer App nicht funktioniert (wir wissen nicht, wie lange dies nicht funktioniert). Wir haben beide Plattformen getestet (Code genau gleich) und iOS funktioniert gut, aber Android schlägt mit Token fehl.
  • Benutzer klickt auf Schaltfläche für Google- oder Facebook-Anmeldung
    App wird im App-Browser von @capacitor/browser mit Keycloak-Website geöffnet
  • Benutzer können wählen, ob sie sich mit Google, Facebook anmelden oder einfach Benutzernamen und Passwort eingeben möchten
    Nach seiner Auswahl Schlüsselumhang Leitet zur App weiter
  • Wenn die Token-Methode hasValidToken() „true“ zurückgibt, leitet der App-Flow den Benutzer zu anderen App-Bildschirmen um
Was ist das Problem unter Android, funktioniert aber unter iOS einwandfrei?
  • Die oben genannten Schritte 1, 2, 3, 4 funktionieren Gut
  • Wenn die App nach der Umleitung wieder verfügbar ist, dann die hasValidToken() gibt immer false zurück
  • Benutzer wird nicht zu anderen App-Bildschirmen weitergeleitet (Bildschirme für authentifizierte Benutzer)
  • Wenn der Benutzer erneut auf Google oder Facebook klickt Anmeldeschaltflächen, dann wird der Ablauf ohne Schritt 3 wiederholt, da Keycloak weiß, dass dieser Benutzer bereits angemeldet ist, sodass eine Umleitung zur App erfolgt.
  • Nach der Umleitung wird die App manchmal minimiert (nicht immer und es gibt keine Native oder JS-Fehler sichtbar in Logcat- und Dev-Tools-Konsole)
Alles sollte gut funktionieren, so wie es für iOS funktioniert. Es funktionierte einwandfrei, bevor wir es bemerkten, und in diesem Teil der App wurden seit etwa 2 Jahren keine Codeänderungen vorgenommen
  • Betriebssystem: Android
  • Browser: Ionic App (@capacitor/browser wird zum Öffnen von Keycloak aus OAuth-Methoden verwendet)
  • Version [z.B. 22]: „angular-oauth2-oidc“: „^15.0.1“
  • Plugin-Init wird in der App erstellt .module.ts wie folgt:

Code: Select all

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
Config ist in Ordnung, storageService.init() funktioniert auch gut und es gibt hier keine Fehler
  • Die Methode addAppUrlOpenListener sieht folgendermaßen aus

Code: Select all

    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();
}
});

});

});
});
};
  • Und außerdem haben wir die Methode authOnAppInit, die bei App-Init in app.component.ts ausgelöst wird, um zu überprüfen, ob der Benutzer bereits angemeldet ist. Die hier bereitgestellten Konsolenprotokolle dienen lediglich der Fehlerbehebung dieses Problems

Code: Select all

    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();
}
});
};
Also noch einmal – für Android oben sind die Konsolenprotokolle:
  • Versuchen Sie es mit der Anmeldung Ergebnis – wahr (soweit ich weiß, bedeutet dies, dass die Anmeldung erfolgreich war)
  • Zugriffstoken – null
  • Ablauf des Zugriffstokens – null
    Hat gültiges Zugriffstoken – falsch
  • OAuth-Ereignis empfangen – OAuthSuccessEvent {type: 'discovery_document_loaded', info: {...}}
Wir haben es ein paar Stunden lang debuggt und wie ich oben geschrieben habe, da Gibt es in keiner dieser Plugin-Methoden Fehler oder sogar native Fehler von Android Logcat
Irgendwelche Ideen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post