-
Notifications
You must be signed in to change notification settings - Fork 9.7k
[local_auth] Api to stop authentication #2111
Conversation
|
@jmagman @collinjackson @cyanglaz Can you please review this PR, I need it in my project. It's been a long time. :( |
| if (_platform.isAndroid) { | ||
| return _channel.invokeMethod<bool>('stopAuthentication'); | ||
| } | ||
| final Future<bool> future = Future<bool>(() => true); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can replace these three lines with:
return Future.sync(() => true);There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Resolved.
| /// Returns false if there was some error or no auth in progress. | ||
| /// | ||
| /// Returns [Future] bool true or false: | ||
| Future<bool> stopAuthentication() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Out of curiosity, how would the Dart app decide to call this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For devices with in-display fingerprint sensor(assuming that authentication is in progress), if user clicks on any other button on the screen, the fingerprint scanning will still be in progress. Hence, we needed an API to stop the authentication in such scenarios.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the response!
If user clicks on any other button on the screen
This is the part that I don't get. Why would I allow user to click anything in my app if there's authentication in progress? The user is not authenticated so should not be interacting with the app at all. I was assuming that on-screen auth will show exactly the same dialog. The only difference would be where you touch.
Could you please point me to a video or an article of some sort which shows cancelAuthentication in action?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@mehmetf For in-display fingerprint scanners, we don't get any popup. We just get the fingerprint scanner icon.
Assuming current behaviour of the plugin
In the link, you can see that we only get the fingerprint scanner icon and no popup. The user can still type the passcode, and click done. When user clicks done, and we navigate to another screen the authentication is still going on. The plugin doesn't provide any mechanism to cancel this authentication.
So this PR should solve the above problem.
I hope I was clear in explaining. :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Very interesting.
Something is broken in this flow though.
- The image shows FP and a PIN and user can choose to authenticate either way.
- If both of these are not appearing due to this plugin then who is displaying the PIN entry method? That seems wrong. So, I assume both of these are appearing due to the plugin calling
biometric.authenticate. - So, assuming biometric API is showing the PIN entry, if user enters PIN instead of FP, why would
biometric.authenticatenot return "success"? Why would we still expect a fingerprint scan?
I am OK adding this API because it is supported on Android. However the use case you are describing seems very very wrong to me. The app should not be responsible for cancelling authentication if the user already authenticated.
If you agree with me, could you take some time to research how the Android API is supposed to be used? In particular why would PIN entry not run success/failure callbacks? (https://github.com/flutter/plugins/blob/master/packages/local_auth/android/src/main/java/io/flutter/plugins/localauth/AuthenticationHelper.java#L142)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@mehmetf Thanks for your quick response.
- The screenshot is not from my app but explains the exact scenario we need in our app. The screenshot is from oneplus's app locker screen.
- The PIN entry is not due to the plugin. It's the app's screen having PIN entry, and
biometric.authenticatejust overlays the fingerprint icon on top of it for scanning (The user can still interact with other part of the screen though). - Because the biometric API is not responsible for showing the PIN entry, the biometric.authenticate doesn't know anything about it. There's no relation between them. :)
I'm not sure if the use case is wrong, but I have seen this flow in a lot of apps.
Just to add, the biometric API does show fingerprint dialog for physical fingerprint sensors. But it just shows fingerprint icon overlay for in-screen fingerprint sensors.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see!
OK that makes more sense. So basically you app is offering two auth methods simultaneously and you want to cancel one if the user chooses the other one.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@mehmetf Exactly. :)
| result.error( | ||
| "no_fragment_activity", | ||
| "local_auth plugin requires activity to be a FragmentActivity.", | ||
| null); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's a bug here for authInProgress. We might set it to true and never actually call authenticate.
Could you chage line 41 to: if (authInProgress.get())
then add to line 62: authInProgress.set(true);.
Since this method always runs in the UIThread, we technically don't need to use AtomicBoolean. You can also optionally change all of this to a normal boolean primitive.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Resolved. Not changing it to boolean primitive. Since, I don't want things to break. :)
| private void stopAuthentication(Result result) { | ||
| try { | ||
| if (authenticationHelper != null && authInProgress.get()) { | ||
| authenticationHelper.stopAuthentication(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Doing this means .authenticate method will never return? Will one of the AuthCompletionHandler methods be called when you stop authentication?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- The
.authenticatewill returnfalsewhen we stop authentication. - Yes, the
onFailuremethod will be called.
fca86c7 to
b0ed6cd
Compare
b0ed6cd to
2ed420b
Compare
|
@mehmetf Could you please merge this PR? I mean it's been a while. :| |
|
I normally don't merge PRs :-) However, I don't see anyone else reviewing this so I think it is safe to say that it has been approved. Thanks for the contribution! |
Thanks @mehmetf :) Any idea about when it'll be on pub? |
|
@collinjackson I can't publish this package for whatever reason. Could you please do the honors? |
Description
This Api Allows the user to cancel the authentication. Helpful when there's in display fingerprint scanner.
Related Issues
No related issues. It's an enhancement.
Checklist
Before you create this PR confirm that it meets all requirements listed below by checking the relevant checkboxes (
[x]). This will ensure a smooth and quick review process.///).flutter analyze) does not report any problems on my PR.Breaking Change
Does your PR require plugin users to manually update their apps to accommodate your change?