MaikuB / flutter_appauth

A Flutter wrapper for AppAuth iOS and Android SDKs
274 stars 246 forks source link

"Failed to authorize: Null intent received" when using deeplink to bring app in front under android #493

Open hschaeufler opened 6 months ago

hschaeufler commented 6 months ago

Hello everyone, Hello MaikuB, I have a multi-step authentication process in the course of which the user does something in another app. To do this, I first call authoriseAndExchangeCode. During the authentication process, another app is called from the custom Android tab or the ASAuthenticationSession. To bring the custom app back into the foreground after the activities in the other app, I have defined another Android app link/deeplink/intent filter in the main activity. This deeplink is then called from the other app. After the return, the Android custom tab or the ASAuthentificationSession should still be visible. The problem is that under android the authentication is cancelled after the return and authorizeAndExchangeCode throws a PlatformException(null_intent, Failed to authorize: Null intent received, null, null). However, this flow works on iOS.

The following is an excerpt from the AndroidManifest.xml

        <activity
            android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:exported="true"
            android:hardwareAccelerated="true"
            android:launchMode="singleInstance"
            android:showWhenLocked="false"
            android:theme="@style/LaunchTheme"
            android:turnScreenOn="true"
            android:windowSoftInputMode="adjustResize">
...
        <!-- This activity is used for jump back-->
            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="https" />
                <data android:host="my-host.tld"/>
                <data android:path="/launch-my-app"/>
            </intent-filter>
        </activity>
        <!-- This activity is later used for auth with AppAuth-->
        <activity
            android:name="net.openid.appauth.RedirectUriReceiverActivity"
            android:exported="true"
            tools:node="replace">
            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="https" />
                <data android:host="my-other-host.tld"/>
                <data android:path="/auth"/>
            </intent-filter>
        </activity> 

The error seems to be due to the fact that onActivityResult(int requestCode, int resultCode, Intent intent) is called although the authentication has not yet been completed.

Does anyone have an idea what I can do or how I can fix this?

SatriyoJati commented 3 months ago

i got same issue. I set on file build.gradle and AndroidManifest.xml.

vukovicluka commented 3 months ago

this solved my issue https://github.com/MaikuB/flutter_appauth/issues/503#issuecomment-2165906205

hschaeufler commented 3 months ago

this solved my issued #503 (comment)

My AndroidManifest.xml unfortunately doesn't have a android:taskAffinity="" Attribute.

Painwraith commented 2 months ago

I am having the same issue

loukman-sh commented 1 month ago

I have no experience in native Android development so I don't know exactly how this works but I added an intent-filter inside my main activity :

<intent-filter android:autoVerify="true">
    <action android:name="HANDLE_AUTHORIZATION_RESPONSE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

Can't find the source but it fixed the error for me.

hschaeufler commented 1 month ago

I have no experience in native Android development so I don't know exactly how this works but I added an intent-filter inside my main activity :

<intent-filter android:autoVerify="true">
    <action android:name="HANDLE_AUTHORIZATION_RESPONSE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

Can't find the source but it fixed the error for me

Thanks for the tip, I'll give it a try. How did you come up with this? What does your Android manifest look like overall? Did you add this in addition to the activity for the app link to return or the AppAuth activity or instead of one of the two?