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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
51
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
77
How Git helps us with localization
dkhmelenko
0
110
Dagger.Android module
dkhmelenko
0
79
MVVM vs. MVP
dkhmelenko
0
60
Other Decks in Technology
See All in Technology
絵ではじめるKubernetesセキュリティ
aoi1
3
640
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
5
630
Railsのように考える: See through the Master
snoozer05
PRO
4
970
今話題のAI「Jev」って何? 宇宙最速で学ぶ会
minorun365
PRO
26
15k
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
4
630
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
12k
AI時代、データエンジニアが一番おもろい
genshun9
0
640
AgentCore Runtime上にAgentic Coding基盤を構築・展開する際の設計ポイントと限界点 / Design considerations and limitations when building an agentic coding platform on AgentCore Runtime
har1101
4
220
データ_AIの事業の勝敗をわけるもの
nek0128
1
410
人間はどの意思決定を手放せるのか
kawasima
15
7.1k
事業課題から技術的負債に向き合う
sansantech
PRO
2
1.9k
作品が生態系になった ─ Mini Tokyo 3D から世界へ
nagix
0
190
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
The Limits of Empathy - UXLibs8
cassininazir
1
670
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Speed Design
sergeychernyshev
33
2.1k
The Spectacular Lies of Maps
axbom
PRO
1
990
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
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