flutter_web_auth icon indicating copy to clipboard operation
flutter_web_auth copied to clipboard

PlatformException(CANCELED, User canceled login, null) on Android

Open jerejacobson opened this issue 5 years ago • 13 comments

Hi, This is my first time using Oauth2 and I am trying to get my callback from the salesforce rest API. I can launch the authenticate() and login to salesforce. Salesforce then re-routes to my call back "myappname://callback?code=aWekysIEeq.....etc", but it throws a PlatformException(CANCELED, User canceled login, null) on android. I check out issue #45 but I am already calling things the right way as far as I can tell. (I might be overlooking the obvious)

I have included the image of the code I am using. (censored both my client_id and redirect_uri "myappname") Capture1

Also, I have my android manifest "intent-filter" inside my main activity. Capture2

If anyone has any ideas or knows of anything I can try I would greatly appreciate it.

thanks!

jerejacobson avatar Sep 13 '20 07:09 jerejacobson

I'm experiencing the same issue

bl4ckbon3 avatar Oct 02 '20 17:10 bl4ckbon3

@bl4ckbon3 I was actually able to fix the issue by importing the project into my own application. (Using the same code as above) It would not work in the GitHub project example that is provided in this repo.(I was using the example one and modifying it just to test the library before writing it into my application.)

jerejacobson avatar Oct 02 '20 19:10 jerejacobson

@jerejacobson I am also experiencing the same issue. My AndroidManifest.xml is setup correctly, and my authenticate method is pretty much the same as yours.

Could you please explain a bit more how you got rid of this issue?

Guillaume-Vacelet avatar Oct 16 '20 16:10 Guillaume-Vacelet

@Guillaume-Vacelet Unfortunately I tried many things so I am not positive which one worked correctly. However, what I did try was to run flutter clean which clears the build cache.

Besides that, I implemented the plugin like the example below. (Not Identical to the project's example)

This is a function to launch the plugin and get the callback scheme and return the result. (The result is parsed for a salesforce keyword in my example )

getAuth() async { //getting the salesforce auth from the user final callbackUrlScheme = 'appname'; try { final result = await FlutterWebAuth.authenticate( url: "https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id=*******************&redirect_uri=appname://callback", callbackUrlScheme: callbackUrlScheme); final token = Uri.parse(result).queryParameters['code']; log("\n" + result); log("\n" + token); return token; } on PlatformException catch (e) { log("\n" + e.toString()); return e.toString(); } }

And when I call this function I make sure to use await so my application doesn't continue without the function finishing.

final token = await getAuth();

And finally in my android > app > src > main > AndroidManifest.xml I have the following activity at the bottom right before my </application> closing

    <activity android:name="com.linusu.flutter_web_auth.CallbackActivity" >
       <intent-filter android:label="flutter_web_auth" 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="appname" />
        </intent-filter>
    </activity>
</application>'

I hope this info helps you to figure out your issue!

jerejacobson avatar Oct 16 '20 18:10 jerejacobson

I had this same issue and it turns out the problem was that I had two intent-filter entries with the same scheme. The other one was for my MainActivity. After removing that entry from my Manifest.xml it seems to work now.

ansells avatar Nov 19 '20 02:11 ansells

same issue here 😢

kyle-seongwoo-jun avatar Nov 25 '20 09:11 kyle-seongwoo-jun

same issue

danielmintz avatar Jun 24 '21 20:06 danielmintz

In my case, it happens when launched other app. e.g. If authenticate URL is twitter.com/xxxxx and twitter app has been installed in Android, twitter app is launched when access the url. And in my case, I will auth tumblr by oauth1.

I resolved this by using SystemChannels.lifecycle in build method as below.

@override
Widget build(BuildContext context) {

  // start
  SystemChannels.lifecycle.setMessageHandler((msg) async {
    if (msg == 'AppLifecycleState.resumed') {
      print('Resumed!');
    }
    return await null;
  });
  // end

  return MaterialApp(/*something widget*/);
}

To be honest, I don't understand why this code in would correct the behavior. I want anyone who know SystemChannels to explain me what this code is doing.

I hope this is helpful to someone else.

kyu-suke avatar Jul 10 '21 04:07 kyu-suke

Had the same issue. You need to add a second activity into your AndroidManifest.xml, instead of putting the intent-filter into your main activity

       ...
       </activity>
       <activity android:name="com.linusu.flutter_web_auth.CallbackActivity">
           <intent-filter android:label="flutter_web_auth">
               <action android:name="android.intent.action.VIEW" />
               <category android:name="android.intent.category.DEFAULT" />
               <category android:name="android.intent.category.BROWSABLE" />
               <data android:scheme="YOUR_CALLBACK_URL_SCHEME_HERE" />
           </intent-filter>
       </activity>
   </application>
</manifest>

pinguluk avatar Aug 25 '21 14:08 pinguluk

I already had the activity setup as both the README and @pinguluk describe, but I was still having this issue.

My problem was that I stupidly tried using a mixed-case URL scheme. When the redirect happened, the provider (rightly) lowercased the scheme, but the CallbackActivity looks for the expected callback as a (case-sensitive, obviously) string key in a map. Since it can't find the callback, nothing happens. Later the cleanup method runs and throws this exception. Making sure I used a fully lowercase callback scheme solved everything.

timshadel avatar Aug 25 '21 15:08 timshadel

I have the same issue and I tried all the proposed workarounds, I assume in my case it happened after I set the target version of the project to 31. could it be that?

maysamsh avatar Mar 07 '22 20:03 maysamsh

in my case I had to set android:exported="true" in:

<activity android:name="com.linusu.flutter_web_auth.CallbackActivity" android:exported="true">
           <intent-filter android:label="flutter_web_auth">
               <action android:name="android.intent.action.VIEW" />
               <category android:name="android.intent.category.DEFAULT" />
               <category android:name="android.intent.category.BROWSABLE" />
               <action android:name="FLUTTER_NOTIFICATION_CLICK" />
               <category android:name="android.intent.category.DEFAULT" />
               <data android:scheme="ananta-dev" />
               <data android:scheme="ananta" />
           </intent-filter>
       </activity>```

maysamsh avatar Mar 08 '22 00:03 maysamsh

This is gonna sound dumb but: for the callback schema within the .dart file, don't have a :/ in your variable value, you don't want (at-least in my case) that for when calling the authenticate function with the callbackUrlSchema, because I had a :/ or :// or ://callback in my case, it was causing the thing to fail on Android.

FM1337 avatar Jun 07 '22 13:06 FM1337

The callback scheme will be validated in the next version: https://github.com/LinusU/flutter_web_auth/commit/4f89925117e31c9874e60c7bc379967233505284

We've also added a troubleshooting section: https://github.com/LinusU/flutter_web_auth#troubleshooting

LinusU avatar Nov 01 '22 10:11 LinusU

Does anyone solved it? iam still having problems

LukGaming avatar May 12 '23 20:05 LukGaming

Yes, same problem continues while accessing to Spotify Web API. I'm authenticating with browser but it's coming null instead of new callback url.

lawuysal avatar May 22 '23 10:05 lawuysal

I solved it and I'm happier then ever. In my case I forgot the change urlschme after url parameter in the FlutterWebAuth2.authenticate method.

lawuysal avatar May 22 '23 11:05 lawuysal