Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Best of sign in experience @ Droidcon Lisbon
Search
Dmytro Khmelenko
September 10, 2019
Technology
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Best of sign in experience @ Droidcon Lisbon
Dmytro Khmelenko
September 10, 2019
More Decks by Dmytro Khmelenko
See All by Dmytro Khmelenko
Securing High-Risk Django Applications: Lessons from the Payment Domain
dkhmelenko
0
53
Securing Python Web Applications
dkhmelenko
0
43
Best of login experience
dkhmelenko
0
120
Red or Green? Let us test
dkhmelenko
0
52
A journey to smaller APK size
dkhmelenko
1
130
A journey to smaller apk size
dkhmelenko
0
78
How Git helps us with localization
dkhmelenko
0
110
Dagger.Android module
dkhmelenko
0
80
MVVM vs. MVP
dkhmelenko
0
61
Other Decks in Technology
See All in Technology
分析AIエージェントを育てる、動く環境を育てる
codatum
0
140
FinTech 1-2 : Overview of FinTech
ks91
PRO
0
150
全社共通データ基盤をつくる。ソニーのDatabricks活用とデータガバナンス設計の裏側
sony
0
430
雪かき部 #7 もう怖くない!SELECT文!
foursue
0
280
LocalStack を使ったサーバーレスアプリケーション開発 / Serverless Development with LocalStack
kakakakakku
0
260
AgentCoreで実践するハーネスエンジニアリング
yakumo
1
290
Meet AgentCore Identity Consent Portal
hironobuiga
3
190
【データ横丁主催】AI Agentがコンテキストを使って仕事をした後、何が残るのか― 組織の経験を次の判断に引き継ぐ「Agent Memory」
shisyu_gaku
2
330
AI 時代の Azure エンジニアリング ~ 私たちは何を磨き、何を任せるのか ~
chack411
1
520
Datadog の学び方 - あるいは、オブザーバビリティを学ぶとは何か
mananyuki
1
490
今こそ知りたいAmplifyGen2
mkdev10
2
150
ai_cording_with_k8s_knowledge.pdf
mochizuki875
1
300
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Skip the Path - Find Your Career Trail
mkilby
1
240
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Google's AI Overviews - The New Search
badams
0
1.6k
Writing Fast Ruby
sferik
630
63k
HDC tutorial
michielstock
2
940
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Done Done
chrislema
187
17k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
390
The World Runs on Bad Software
bkeepers
PRO
72
12k
Transcript
Best of sign in experience Dmytro Khmelenko Software Engineer @
Freeletics
How often did you have to do login in apps?
!2
!3
!4
!5
!6
!7
!8
!9
!10
Why? • Privacy • Personalised content
Solutions
Log in with Facebook 2.3 billion monthly active users on
Facebook
Log in with Google
None
Distribution (Android)
Distribution (iOS)
oAuth
oAuth
Solution
Firebase Has sign in pre-built UI
Firebase https://github.com/firebase/FirebaseUI-Android
Firebase Has sign in pre-built UI Supports multiple providers
Firebase
Firebase Has sign in pre-built UI Supports multiple providers Has
account management
Firebase
Firebase Has sign in pre-built UI Supports multiple providers Has
account management Anonymous access & account linking
Firebase Has sign in pre-built UI Supports multiple providers Has
account management Anonymous access & account linking Full email sign up support
Firebase
Firebase: Good to know •Usage limits •Extending with Cloud Functions
•Accounts import/export
Classic Email log in
What’s wrong You have to type You need to remember
The password has to contain at least N characters. At least one character must be a number or a special character.
Autofill framework https://developer.android.com/guide/topics/text/autofill <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:autofillHints="password" />
None
SmartLock for Passwords https://developers.google.com/identity/smartlock-passwords/android/
SmartLock for Passwords • Increase in conversion rate • Significant
drop in register and sign in failures https://developers.google.com/identity/smartlock-passwords/case-studies
How to Auth.CredentialsApi.save(mCredentialsClient, credential).setResultCallback( new ResultCallback() { @Override public void
onResult(Status status) { if (status.isSuccess()) { // Credentials were saved } else { if (status.hasResolution()) { try { status.startResolutionForResult(this, RC_SAVE); } catch (IntentSender.SendIntentException e) { // Could not resolve the request } } } } });
RxSmartLock https://github.com/freeletics/RxSmartLock • Saving RxGoogleSmartLockManager.storeCredentials(context, credentials).subscribe()
None
RxSmartLock https://github.com/freeletics/RxSmartLock • Saving RxGoogleSmartLockManager.storeCredentials(context, credentials).subscribe() • Restoring RxGoogleSmartLockManager.retrieveCredentials(context).subscribe()
None
RxSmartLock https://github.com/freeletics/RxSmartLock implementation 'com.freeletics.rxsmartlock:rxsmartlock:1.0.2'
Fingerprint API • Secure • Fast • Easy
Fingerprint API: requirements • From API 26 • Fingerprint sensor
• Enabled Lock screen • Registered fingerprints • Grant permissions
Fingerprint API: with prompt val callback = object: BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult?) { super.onAuthenticationSucceeded(result) } override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) { super.onAuthenticationError(errorCode, errString) } } val prompt = BiometricPrompt.Builder(context) .setTitle(“Login") .setDescription("Use fingerprint to login") .setNegativeButton("Cancel", { }, { dialog, i -> }) .build() prompt.authenticate(CancellationSignal(), mainExecutor, callback) https://android-developers.googleblog.com/2018/06/better-biometrics-in-android-p.html API 28
Fingerprint API: with prompt val callback = object: BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult?) { super.onAuthenticationSucceeded(result) } override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) { super.onAuthenticationError(errorCode, errString) } } val prompt = BiometricPrompt.Builder(context) .setTitle(“Login") .setDescription("Use fingerprint to login") .setNegativeButton("Cancel", { }, { dialog, i -> }) .build() prompt.authenticate(CancellationSignal(), mainExecutor, callback) https://android-developers.googleblog.com/2018/06/better-biometrics-in-android-p.html API 28
API 28
Fingerprint API: how to val callback = object: FingerprintManagerCompat.AuthenticationCallback() {
override fun onAuthenticationError(errMsgId: Int, errString: CharSequence?) { super.onAuthenticationError(errMsgId, errString) } override fun onAuthenticationSucceeded( result: FingerprintManagerCompat.AuthenticationResult?) { super.onAuthenticationSucceeded(result) } } val fingerprintManager = FingerprintManagerCompat.from(context!!) fingerprintManager.authenticate(null, 0, CancellationSignal(), callback, null) https://developer.android.com/reference/android/support/v4/hardware/fingerprint/FingerprintManagerCompat
Fingerprint API: how to val callback = object: FingerprintManagerCompat.AuthenticationCallback() {
override fun onAuthenticationError(errMsgId: Int, errString: CharSequence?) { super.onAuthenticationError(errMsgId, errString) } override fun onAuthenticationSucceeded( result: FingerprintManagerCompat.AuthenticationResult?) { super.onAuthenticationSucceeded(result) } } val fingerprintManager = FingerprintManagerCompat.from(context) fingerprintManager.authenticate(null, 0, CancellationSignal(), callback, null) https://developer.android.com/reference/android/support/v4/hardware/fingerprint/FingerprintManagerCompat
https://github.com/googlesamples/android-FingerprintDialog
Happy users must have you
@dkhmelenko