Detta är del av en artikelserie Guppy – Hur bygger man en riktig tjänst med Azure Mobile Services?

I det här inlägget tänker jag beskriva hur man sätter upp autentisering i sin Windows Phone 8 app (är väldigt likt Windows 8) emot Twitter och hur denna sedan använts på serversidan av tjänsten.

Twitter

För att kunna använda sig av Twitter för detta ändamål behöver man först skapa en twitter-app. Detta göra på https://dev.twitter.com/apps. Jag bygger på att denna steg-för-steg instruktion för att skapa en tjänst har använts.

image

Det är egentligen tre fält som betyder något: Name, Description och Callback URL. Den sista får du genom att kopiera in den URL som är adressen till tjänsten i Auzure Mobile Services. (Den hittas på tjänsten administrationssida.)

När registreringen är klart får man upp twitter-appens informationssida. Här skall använda oss av de två fälten: Consumer Key och Consumer Secret. Dessa båda fält skall matas in i Azure Mobile Services.

image

Gå till Azure Mobile Services administrationssida för tjänsten och välj Identity i menyn. Kopiera in de två fälten jag beskrev ovan och klicka på Save i menyn längst ned i fönstret.

image

Lägga till autentisering i sin app

(Av utrymmesskäl visar jag inte hur man skapar en ny app ifrån början. Det enklaste är att ladda ned en mall ifrån Azure Mobile Services. Du hittar mallen genom att klicka på ikonen som ser ut som ett blått moln med en blixt i relief. Du ser den i bilden ovan till vänster om menyn som börjar med Dashboard. Välj sedan att Create a new Windows Phone 8 app och följ instruktionerna.)

I denna enkla app kan vi lägga autenticieringen i OnNavigatedTo i MainPage.xaml.

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
if (!App.MobileService.LoginInProgress)
{
var user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Twitter);
}
if (App.MobileService.CurrentUser != null)
{
RefreshTodoItems();
}
}

Som ni ser är det egentligen endast en rad kod, LoginAsync, som sköter hela processen. Vi beskriver vilken autentiseringstjänst som använts genom att in MobileServiceAuthenticationProvider.Twitter i anropet.

Jag använder mig av LoginInProgress i MainPage för att försäkra mig om att inte två autentiseringsprocesser går igång samtidigt och jag ser till att RefreshTodoItems inte anropas om ingen är inloggad genom att kolla att Userobjektet ej är null.

Serversidan

Det första som man skall göra är att ändra rättigheterna för de tabeller som man vill skydda emot obehörig access. Detta gör du för varje enskild tabell i administratörsverktyget.

image

Rättighetskollen sköts sedan automatiskt av Azure Mobile Services.

Mer saker som man kan göra

Läsa ut användaridentiteten

Användaridentiteten följer alltid med när ett anrop görs emot servern. Man behöver inte göra någonting själv på klientsidan. Varje anrop till servern går till en av de fyra metoderna: insert, update, delete eller read. I vart och ett av dessa metoder finns en parameter som heter user. I denna kan du läsa ut vem som har anropat tjänsten.

Så här ser metoden insert ur:

function insert(item, user, request) {
request.execute();
}

Exempel – läs ut det aktuella användaridentiteten

function insert(item, user, request) {
console.info("User id: %s", user.userId);
request.execute();
}

Öppna loggen för tjänsten och där kommer du att se att en rad har lagts till med användaridentiteten för den inloggade användaren. I mitt fall är detta en användaridentitet som Twitter har skapat till mig. Den kommer att se helt annorlunda ut om man använder andra identitetstjänster.

image

Lagra användaridentiteten i tabellen

Det första vi behöver göra är att skapa en kolumn till i vår tabell där vi kan lagra användaridentiteten. Man kan göra det på flera sätt. Det som oftast beskrivs i exemplen är att man dynamiskt gör detta genom att lägga till kolumnen i klassen som beskriver tabellen och sedan använda sig av den för att lägga till en rad. Detta kommer att funka eftersom Azure Mobile Services använder sig av något som heter Dynamic Schema. (Detta kan man slå av.)

Jag vill istället använda mig av mer välkända SQL-verktyg för att göra detsamma. Det finns flera sådana att välja på. I detta exempel kommer jag att använda mig av det som ingår i administratörsverktyget för Azure. Det är alltså ett verktyg som finns online och kräver alltså ingen nedladdning.

En SQL-server och en databas skapades när tjänsten skapades (som inte har visats i denna artikel). En befintlig server och databas kan också ha använts. Här finns en steg-för-steg instruktion om hur man gör detta.

Klicka på länken till SQL Azure som du kan finna i administrationsverktygens vertikala meny längst ut till vänster. (En cylinder med DB i relief.) Klicka sedan på den databas som angavs när Azure Mobile tjänsten skapades och klicka till slut på Manage i den meny som finns i nedre delen av fönstret.

Logga in med det användarnamn och lösenord som tidigare har angivits när SQL Servern skapades.

Nu är vi inne i adminstrationsverktyget för SQL Azure. Välj Design i nedre vänstra hörnet och klicka sedan på knappen Edit för tabellen TodoItem.

image

Nu lägger vi till en kolumn som eter userId och som är av typen nvarchar(30).  Klicka på Save för att förändringen av tabellen skall utföras.

Nästa steg är nu att uppdatera metoden insert för tabellen. Gå tillbaka till skriptet för denna metod och uppdatera den med följande kodrad:

function insert(item, user, request) {
console.info("User id: %s", user.userId);
item.userId = user.userId;
request.execute();
}

Kör appen och lägg till något nytt i listan.

Gå till fliken Browse för tabellen och se att en ny rad har lagts till och denna gång innehåller den användaridentiteten också.

image