|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "Authentication" |
| 4 | +date: 2019-03-25 |
| 5 | +categories: ["Firebase"] |
| 6 | +image: firebase/authentication |
| 7 | +description: "Firebase" |
| 8 | +keywords: "firebase, autentykacja, autoryzacja, authentication, account, user, email, password, phone, google, facebook, twitter, github, rejestracja, logowanie, sign in, log in, sign up, log out, android, programowanie, programming" |
| 9 | +--- |
| 10 | + |
| 11 | +## Wprowadzenie |
| 12 | +Tworzenie i zarządzania kontem użytkownika to dla większości aplikacji podstawowa funkcjonalność, która pozwala na personalizowane wykorzystanie funkcjonalności aplikacji, a znajomość tożsamości ułatwia bezpieczne zapisywanie i powiązanie danych z kontem synchronizowanym na różnych urządzeniach. `Firebase Authentication` dostarcza łatwych w użyciu usług `backend` przeznaczonych do uwierzytelniania użytkowników w aplikacji za pomocą `hasła`, `numeru telefonu`, popularnych dostawców tożsamości typu `Google`, `Twitter`, `Facebook`, `Github` oraz umożliwia integracje z innymi zewnętrznymi usługami. Wykorzystuje także popularne standardy branżowe takie jak `OAuth 2.0` i `OpenID Connect` oraz ściśle współpracuje z innymi usługami Firebase. Operacje procesu uwierzytelniania mogą odbywać się poprzez użycie gotowych komponentów interfejsu użytkownika (`FirebaseUI`) lub wykorzystując `Firebase SDK` do ręcznej konfiguracji. |
| 13 | + |
| 14 | +## Użytkownicy |
| 15 | +Obiekt `Firebase User` reprezentuje konto użytkownika zarejestrowanego w aplikacji w projekcie Firebase. Do użytkownika przypisany jest zestaw podstawowych właściwości takich jak: unikalny identyfikator, podstawowy adres email, nazwa i adres URL zdjęcia, które są przechowywane w bazie danych projektu i mogą być aktualizowane. Nie ma możliwości dodania bezpośrednio innych właściwości do obiektu w bazie danych projektu, zamiast tego należy przechowywać dodatkowe właściwości w bazie danych `Firebase Realtime Database`. Przy pierwszej rejestracji do aplikacji profil użytkownika zostanie uzupełniony o dostępne informacje w zależności od udostępnionych danych przez dostarczyciela, np. przy rejestracji adresem email i hasłem zostanie dodany tylko podstawowy adres email. Użytkownik może zalogować się na to samo konto za pomocą różnych metod np. używając adresu email i hasła, konta Google czy konta Twitter. W momencie pomyślnej rejestracji lub logowania następuje przypisanie instancji `Firebase Auth` dla bieżącego użytkownika, której zadaniem jest utrzymanie stanu użytkownika do momentu wylogowania, np. ponowne uruchomienie aplikacji nie powoduje utraty informacji. |
| 16 | + |
| 17 | +## FirebaseUI |
| 18 | +`FirebaseUI` jest biblioteką opartą o pakiet `SDK Firebase Authentication`, która dostarcza komponenty interfejsu graficznego umożliwiające w łatwy sposób wykonanie operacji autoryzacji. Już za pomocą jednego kliknięcia możliwe jest zalogowanie się do aplikacji przy użyciu wielu dostarczycieli (email, telefoniczna autoryzacja, `Google Sign-In` itp) czy też wywołanie różnych metod uwierzytelniania i zadań zarządzania kontem. FirebaseUI automatycznie integruje się z mechanizmem `Smart Lock for Password` i pozwala także na personalizacje stylu graficznego. Aby skorzystać z wybranych dostarczycieli autoryzacji należy dodać odpowiednie zewnętrzne zależności do pliku `build.gradle`, włączyć wspieranie logowania i uzupełnić wymagane informacje w konsoli Firebase oraz dla Facebook i Twitter dodać klucz aplikacji do zasobów tekstowych. Poniższy listing przedstawia sposób wykorzystanie FirebaseUI w procesie logowania, wylogowania i usuwania konta. |
| 19 | + |
| 20 | +{% highlight kotlin %} |
| 21 | +class FirebaseUIActivity : AppCompatActivity() { |
| 22 | + |
| 23 | + companion object { |
| 24 | + const val SIGN_IN = 100 |
| 25 | + } |
| 26 | + |
| 27 | + override fun onCreate(savedInstanceState: Bundle?) { |
| 28 | + super.onCreate(savedInstanceState) |
| 29 | + setContentView(R.layout.activity_firebase_ui) |
| 30 | + |
| 31 | + //add available providers |
| 32 | + val providers = arrayListOf( |
| 33 | + AuthUI.IdpConfig.EmailBuilder().build(), |
| 34 | + AuthUI.IdpConfig.PhoneBuilder().build(), |
| 35 | + AuthUI.IdpConfig.GoogleBuilder().build(), |
| 36 | + AuthUI.IdpConfig.TwitterBuilder().build()) |
| 37 | + |
| 38 | + //start sign in screen and optional customize by logo, theme and urls |
| 39 | + val intent = AuthUI.getInstance() |
| 40 | + .createSignInIntentBuilder() |
| 41 | + .setAvailableProviders(providers) |
| 42 | + .setLogo(R.drawable.logo) |
| 43 | + .setTheme(R.style.AppTheme) |
| 44 | + .setTosAndPrivacyPolicyUrls("http://androidcode.pl/terms", "http://androidcode.pl/privacy") |
| 45 | + .build() |
| 46 | + startActivityForResult(intent, SIGN_IN) |
| 47 | + } |
| 48 | + |
| 49 | + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { |
| 50 | + super.onActivityResult(requestCode, resultCode, data) |
| 51 | + if (requestCode == SIGN_IN) { |
| 52 | + val response = IdpResponse.fromResultIntent(data) |
| 53 | + if (resultCode == Activity.RESULT_OK) { |
| 54 | + //success, get user and do some work |
| 55 | + val user = FirebaseAuth.getInstance().currentUser |
| 56 | + startActivity(Intent(this, UserActivity::class.java)) |
| 57 | + } |
| 58 | + else { |
| 59 | + //fail, show some error message |
| 60 | + } |
| 61 | + } |
| 62 | + } |
| 63 | +} |
| 64 | + |
| 65 | +class UserActivity : AppCompatActivity() { |
| 66 | + |
| 67 | + override fun onCreate(savedInstanceState: Bundle?) { |
| 68 | + super.onCreate(savedInstanceState) |
| 69 | + setContentView(R.layout.activity_user) |
| 70 | + |
| 71 | + signOut.setOnClickListener { |
| 72 | + AuthUI.getInstance().signOut(this) |
| 73 | + .addOnCompleteListener { |
| 74 | + //do something like navigate to home screen |
| 75 | + } |
| 76 | + } |
| 77 | + |
| 78 | + delete.setOnClickListener { |
| 79 | + AuthUI.getInstance().delete(this) |
| 80 | + .addOnCompleteListener { |
| 81 | + //do something like navigate to home screen |
| 82 | + } |
| 83 | + } |
| 84 | + } |
| 85 | + |
| 86 | + //more methods |
| 87 | +} |
| 88 | +{% endhighlight %} |
| 89 | + |
| 90 | +## Firebase SDK |
| 91 | +Kiedy zachodzi potrzeba przejęcia większej kontroli nad procesami uwierzytelniania należy w tym celu wykorzystać `Firebase SDK`, który umożliwia zdefiniowanie zachowania i obsługę zdarzeń na każdym kroku danego procesu. Poniższy listing prezentuje wykorzystanie Firebase SDK w procesie rejestracji za pomocą email i hasła, logowania i wylogowania użytkownika. |
| 92 | + |
| 93 | +{% highlight kotlin %} |
| 94 | +//TODO code |
| 95 | +{% endhighlight %} |
| 96 | + |
| 97 | +Co więcej istnieje możliwość ręcznej konfiguracji zewnętrznych API autoryzacji dla m.in. Google, Twitter, Facebook, Github i integracji z kontem użytkownika Firebase. Ponadto Firebase Authentication oferuje także mechanizm uwierzytelniania kont anonimowych i ich konwersji do kont stałych oraż możliwość logowania się za pomocą linka w wiadomości email. |
| 98 | + |
| 99 | +## Zarządzanie użytkownikami |
| 100 | +Firebase Authentication poza podstawowymi właściwościami użytkownika Firebase umożliwia także uzyskanie dostępu do informacji profilowych dostarczonych przez zewnętrznych usługodawców autoryzacji. Ponadto możliwe jest dodanie lub zmiana bieżących danych (informacje profilowe, email, hasło, itp), a także usuwanie konta oraz wysyłanie maili zmiany hasła, weryfikacji czy ponownej autoryzacji konta. |
| 101 | + |
| 102 | +{% highlight kotlin %} |
| 103 | +//TODO code |
| 104 | +{% endhighlight %} |
0 commit comments