Authentication for IOS og Android med Firebase i Xamarin Forms • Euromind
C#MobileXamarin
af Per Lindsø Larsen 4. oktober, 2019
skrevet af Per Lindsø Larsen 4. oktober, 2019
Firebase er en cloudløsning fra Google med mange fordele. En af dem giver mulighed for at lave en hurtig login-mekanisme til applikationer, hvor man ikke behøver at bruge tid på backend eller databasestyring. Har du mindre end 10.000 login om måneder et det en fri tjeneste. Herefter koster det nogle få øre pr. login. Det gør det til en attraktiv og gratis omgang for mange foreninger m.v. Skal man ikke vogte statshemmeligheder eller nøgler til kronjuvelerne, men blot holde lidt styr med brugerne, er et almindeligt login-flow med password og email tilstrækkeligt og nemt at implementere.
I dette indlæg vil jeg lave en implementering i Xamarin Forms til Android og IOS. Den vil indeholde login, mulighed for at oprettelse af ny bruger, send email til nulstilling af password og bygge siderne i et effektivt og sikkert flow for både Android og IOS-brugere. Du kan hente den samlede kode på Github. Den er testet med Android version 7.1-9 og IOS 10.3-13.
Opret i Visual Studio et nyt Projekt Mobile App (Xamarin Forms). Tilføj med det samme de nødvendige Nuget-pakker:
Vælg “Manage Nuget Packages” i Android-sektionen og tilføj Xamarin.Firebase.Core og Xamarin.Firebase.Auth. I skrivende stund har den seneste version af sidstnævnte nogle bugs som jeg ikke gad bakse med, så jeg valgte version 60.1142.1, den gør hvad den skal uden at skabe problemer. Det betyder også, at Core-pakken skal tilføjes i samme version.
I IOS-sektionen tilføjes den seneste version af Xamarin.Firebase.Auth.IOS:
I det delte projekt tilføjes også Xamarin.Firebase.Core.
Første opgave er at lave et interface med de nødvendige funktioner, så vi med DependencyService kan kalde de platform-specifikke implementeringer. Altså én indgang til flere udgaver af løsningen.
Task<string> SignUpWithEmailPassword(string email, string password);
Task <bool> ResetPassword(string email);
Her er valgt de mest nødvendige funktioner, men der er mange andre muligheder i Firebase, som kan tilføjes. Gem ovenstående som iauth.cs i den delte sektion. Med Interface på plads kan implemeteringerne af funktionerne laves for hhv. IOS og Android. For IOS kan det gøres på følgende måde:
using XamarinFirebaseAuth.iOS;
[assembly: Dependency(typeof(AuthIOS))]
namespace XamarinFirebaseAuth.iOS
public class AuthIOS : IAuth
var user = await Auth.DefaultInstance.SignInWithPasswordAsync(email, password);
return await user.User.GetIdTokenAsync(false);
errorCode = (AuthErrorCode)((long)ex.Error.Code);
errorCode = (AuthErrorCode)((int)ex.Error.Code);
// Se https://firebase.google.com/docs/auth/ios/errors
case AuthErrorCode.UserNotFound:
return "ERROR_USER_NOT_FOUND";
return "ERROR_USER_DISABLED";
return "ERROR_WRONG_PASSWORD";
return "ERROR_EMAIL_OR_PASSWORD_MISSING";
public async Task<string> SignUpWithEmailPassword(string email, string password)
AuthDataResult user = await Auth.DefaultInstance.CreateUserAsync(email, password);
Auth.DefaultInstance.SignOut(out _);
public async Task<string> ResetPassword(string email)
await Auth.DefaultInstance.SendPasswordResetAsync(email);
return "ERROR_EMAIL_ALREADY_IN_USE";
return "ERROR_OPERATION_NOT_ALLOWED";
return "ERROR_WEAK_PASSWORD";
return "ERROR_UNKNOWN";
Hvorledes IOS-delen tilrettes findes den en ganske god vejledning til. Gen filen som AuthIOS.cs. Tilføj til FinishLaunching i AppDeligate.cs linjen Firbase.Core.App.Configure(); :
og lav en tilsvarende AuthDroid.cs til Android:
using XamarinFirebaseAuth.Droid;
[assembly: Dependency(typeof(AuthDroid))]
namespace XamarinFirebaseAuth.Droid
public class AuthDroid : IAuth
await FirebaseAuth.Instance.SignInWithEmailAndPasswordAsync(email, password).ContinueWith(async task =>
//Noget gik galt, returner FirebaseAuth fejlkoden
_result = ((FirebaseAuthException) task.Exception.GetBaseException()).ErrorCode;
// Login lykkedes - returner Token
var token = await task.Result.User.GetIdTokenAsync(false);
_result = token.Token;
await FirebaseAuth.Instance.SendPasswordResetEmailAsync(email).ContinueWith(async task =>
err = ((FirebaseAuthException) task.Exception.GetBaseException()).ErrorCode;
return "ERROR_EMAIL_MISSING";
await FirebaseAuth.Instance.CreateUserWithEmailAndPasswordAsync(email, password).ContinueWith(
async task =>
return ((FirebaseAuthException) task.Exception.GetBaseException()).ErrorCode;
Tilføj til OnCreate() i MainActivity.cs linjen FirebaseApp.InitializeApp(Application.Context);
Så skal vi have lavet siderne for Login, Opret bruger og Reset Password. Login-siden er den første, der skal vises, hvis brugeren ikke allerede er logget ind. I App-konstruktoren i app.cs derfor:
public static bool IsUserLoggedIn { get; set; }
if (!IsUserLoggedIn)
I Login.xaml.cs kan kaldes de funktioner. der blev givet i interface IAuth.cs uden at tænke på platform-specifikke forskelle.
private IAuth _auth;
_auth = DependencyService.Get<IAuth>();
var Token = await _auth.LoginWithEmailPassword(EmailInput.Text, PasswordInput.Text);
if (!Token.Contains("ERROR_"))
//Der er logget ind og returneret et token
App.ShowError(Token);
private async void ResetPasswordClicked(object sender, EventArgs e)
await Navigation.PushAsync(new ResetPasswordPage());
private async void SignUpClicked(object sender, EventArgs e)
Det er vigtigt at have det rigtige flow i siderne, Er brugeren først logget ind, er det ikke særlig prof, at et tryk på back-button sender vedkommende tilbage til login-siden. Vi bruger derfor Navigation.InsertPageBefore for at indsætte hovdsiden bagved login-siden og derefter med Navigation.PopAsync(); fjerne login-siden fra stakken.
At logge ind med email og password burde være en ukompliceret opgave, og man glemmer derfor ofte, hvor meget der kan gå galt: Manglende email eller password, bruger ikke fundet i databasen, ugyldigt password, malformateret email, manglende forbindelse etc. Prøver brugeren forgæves at logge ind, er det ikke befordrende for det gode samarbejde at spise vedkommende af en intetsigende alert: ”Fejl under login.”
FirebaseAuth har en række fejlkoder, som kan give en mere fyldestfgørende forklaring på problemerne. For at give fejlmeddelelserne på en skånsom måde til den i forvejen hårdt prøvede bruger, har jeg i denne demo valgt at bruge et Toast-plugin, der giver meddelelsen på en elegant måde og selv fader ud efter nogle sekunder. Installer Nuget pakken Plugin.Toast til det delte projekt.
De øvrige sider laves på tilsvarende vis, som det fremgør af demo-koden på Github. Vi er nu næsten færdig i Visual Studio, men mangler et par json-filer, som vi får ved registrering i Firebase-konsollen. Inden da en sidste vigtig ting: Højreklik på at Android -projektet og vælg Properties. Under fanen Android Manifest noterer Package Name, som skal bruges ved registrering på Firebase. I dette tilfælde com.lindsoe.xamarinfirebaseauth. Ændrer du ikke på vnavnet, vil det som udgangspunkt være com.companyname.[projektnavn].
Noter på tilsvarende vis Bundle ID for IOS-projektet. Du finder det ved at dobbelt klikke på filen info.plist
Opsætning af Firebase på 10 minutter
Gå til Firebase konsollen og log ind med din Google-konto. Opret et nyt projekt og kald det hvad du vil. Efter at have klikket dig videre gennem et par info-sider er dit projekt oprettet og der er nu mulighed for at oprette Firebase til både IOS og Android-app’en, f.eks fra ikonerne:
Klik f’ørst på IOS og indtast nu Bumdle ID for IOS-projektet:
Klik på “Register App” og du kommer nu til siden, hvor du kan downloade den færdige GoogleService-Info.plist.
Gem filen og klik dig videre gennem de næste info-sider, der ikke er relevant for Xamarin-projektet.
Opret derefter på tilsvarende vis Firebase til Android-App’en og gem den downloadede fil, der her hedder google-services.json.
Klik nu på forsidens Authentication-ikon så vi kan få lavet databasen, der selvfølgelig automatisk deles af både IOS og Android App’en.
Du får her først mulighed for at vælge Sign-In metode. Klik på knappen og sæt Sign-In provideren Email/Password til Enabled:
Klik herefter på fanen Users og indtast det første bruger-login med Password og email, så vi kan få testet projektet:
Når du har tilføjet dig selv som første bruger kan du under fanen Templates skifte Template-sprog til dansk, således at teksten i den email, der sendes fra Firebase ved nulstilling af password er på dansk.
Det eneste der mangler er nu bare at tilføje de to json-filer i Visual Studio. Placer google-services.json i folderen Resources under Android-projektet. Marker den i Solution Explorer og sørg for at Build Action under Properties er sat til GoogleServicesJson.
Tilføj den anden json-fil GoogleService-Info.plist til IOS-projektet og sørg her for at Build Action er sat til BundleResource .
Projektet er nu klar til at blive testet på device eller emulator. Indtast den email og password, der blev oprettet på Firebase og du skulle nu få adgang til det forjættede land:
Får du det velkendte nakkedrag “Object reference not set to an instance of an object. ” skyldes det højst sandsynligt et af følgende tre forhold:
Tjek at de to json-filer er placeret i de rigtige foldere. Du må ikke ændre deres navn.
Tjek at Build Action er sat korrekt.
Tjek at det Package Name og Bundle ID, der blev registreret på Firebase er korrekt.
Download projekt fra Github og tilføj til projektet dine egne json-filer efter oprettelse på Firebase. Så kører det bare!