Sovelluksia rakentaessa yksi keskeinen kysymys on, millä käyttäjätunnuksilla asioita tehdään. Vaihtoehtoja on karkeasti ottaen kaksi. Toiminnot tehdään
- Tarkoitusta varten luodulla erillisellä käyttäjätunnuksella, jolla on riittävät oikeudet
- Käyttäjän omilla tunnuksilla (ns. delegoiduilla käyttöoikeuksilla)
PowerAppsissa käytetetään sujuvasti näitä molempia.
- Kun käytät PowerAppsissa SharePoint-listaa, kaikki siihen liittyvät toiminnot tehdään käyttäjän omalla tunnuksella. Mikäli sovelluksella luodaan uusi rivi listalle, tulee sen luojaksi sovelluksen käyttäjä.
- Mikäli PowerApps käyttää Azuren SQL -tietokantaa, kaikki toiminnot tehdään yhdellä ja samalla SQL:n käyttäjätunnuksella.
Voinko sovelluksen tekijänä vaikuttaa siihen, mitä käyttöoikeuksia milloinkin käytetään?
Et aina. Mutta esimerkiksi Microsoft Graph -rajapintaa käyttäessäsi voit valita kumpaa tapaa käytät.
Microsoft Graph
Voit käyttää Office 365 -palvelun yleisimpiä toimintoja helposti yhdistimien (connector) ja niiden toimintojen (action) avulla. Kaikkiin toimintoihin ei kuitenkaan löydy valmista toimintoa (esimerkiksi uuden tiimin luonti). Tällöin kaverisi on Microsoft Graph, jolla voit ohjemallisesti komentaa Office 365:n eri palveluja.
Tehdään tällä kertaa todella yksinkertainen PowerApps, joka kutsuu Microsoft Graphia käyttäjän käyttöoikeuksin ja selvittää hänen sähköpostiosoitteensa.
Samalla tekniikalla voit rakentaa vaikka mitä hauskaa Microsoft Graph:ia hyödyntäen.
Azure AD Application -rekisteröinti
Käyttöoikeuksien delegointia varten tarvitsemme Azure AD Applicationin, joten luodaan ensimmäiseksi sellainen (Azure Active Directory -> App registrations -> New application registration).
Pyydetään sovellukselle oikeudet käyttää Microsoft Graphia (Settings -> Required permissions -> Add – > Microsoft Graph). Selataan listaa riittävästi alaspäin, jotta päästän delegoitaviin oikeuksiin (Delegated permissions).
Listasta valitaan oikeudet, jota käyttämämme toiminnot tarvitsevat. Esimerkkimme tarvitsee ainoastaan käyttäjätietojen lukuoikeudet (User.Read).
Luodaan vielä salaisuus (secret) ja otetaan sen avain (key) talteen. Tunnistautumisessa avaimen parina käytetään application id:ta
Tarvitsemme myös tenantin id:n. Se löytyy esimerkiksi Azure Ad:n asetuksista (directory id).
Olemme nyt luoneet Azure Ad:hen Applikaation, jolla ei itsellään ole mitään oikeuksia. Mutta sen avulla voimme hyödyntää sovellusta käyttävän käyttäjän käyttöoikeuksia. Käyttäjän luvalla tietenkin.
Kieroa.
Custom Connectorin tekeminen
Tavoitteenamme on selvittää Microsoft Graphia hyödyntäen PowerAppsia käyttävän käyttäjän sähköpostiosoitteen.
Takemmin ottaen kutsumme tätä: https://graph.microsoft.com/v1.0/me/ . Kutsu tehdään PowerAppsin käyttäjän nimissä. Jotta tarvittava käytöoikeuksien delegointi onnistuu, tulee tämä Rest API -kutsu paketoida custom connectoriksi.
Siirrytään https://web.powerapps.com/home osoitteeseen ja valitaan sieltä Data -> Custom connectors -> Create custom connector -> Create from blank.
Annetaan connectorille nimi (DelegatedMicrosoftGraph). Tämän jälkeen annetaan kuvaus, sekä asetetaan host-osoitteeksi graph.microsoft.com.
Tunnistautuminen
Siirrytään Security -osuuteen, jossa määritellään millä käyttöoikeuksilla custom connectoria käytetään.
Valitaan
- Authentication type: OAuth 2.0
- Identity provider: Azure Active Directory
- Client ID: Azureen luomamme Applicationin Application Id
- Client secret: Azureen luomamme Applicationin Secret
- Tenant ID: Tenantin id
- Resource URL: http://graph.microsoft.com
Tässä vaiheessa luodaan connectori (Create connector). Luonnin jälkeen custom connectorin oAuth-osuuteen ilmestyy Redirect URL.
Kopioidaan se leikepöydälle ja käydään lisäämässä ko osoite Azure Applikaatiomme Reply URL:ksi.
Palataan custom connectorin rakentamiseen ja siirrytään Definition-välilehdelle.
Toiminnot (Actions)
Luodaan uusi toiminto (New action) ja annetaan sille nimi (Operation ID). Nimi näkyy Flow:ssa toiminnon (action) nimenä ja PowerAppsissa custom connectorin metodina.
Vielä pitää määritellä, mitä toiminto tekee. Klikataan ”Import from sample” ja täytetään avautuvaan dialogiin URL-osoitteksi https://graph.microsoft.com/v1.0/me/. Kyseinen operaatio on tyypiltään GET.
Ja painetaan import.
Kokeillaan…
Siirrytään Test-osioon ja kokeillaan toimiiko connectorimme.
Luodaan uusi yhteys (New connection), jonka jälkeen pääsee painamaan Test operation -painiketta. Mikäli kaikki on kunnossa, palauttaa kutsu jotain muuta kuin virheen.
Hyvältä näyttää.
Vastauksen muotoilu
Mutoillaan lopuksi toiminnon paluuarvo. Kopioidaan testikutsun vastaus (Response -> Body) ja siirrytään Definition-osuuteen.
Klikataan ”Add default response”, kopioidaan mallivastaus bodyyn ja painetaan Import.
Näin custom connectorimme vastaus on valmiina parsittuna omiin kenttiinsä, jolloin sitä on helpompi käsitellä PowerAppsissa / Flow:ssa.
Custom connectorin käyttö PowerAppsista
Luodaan tyhjä PowerApps ja lisätään siihen tietolähteeksi luomamme connectori.
Valitaan uusi tietolähde (Add data source).
Heti perään valitaan uusi yhteys (New connection). Sieltä löytyy luomamme connectori (DelegatedMicrosoftGraph).
Lisätään sovellukseemme painike, joka suorittaa connectorin GetMeData -toiminnon ja tallentaa sen paluuarvon kokoelmaan.
Painetaan painiketta ja katsotaan mitä kokoelmaan on tallentunut.
Voila!
Käyttäjän avatessa PowerAppsin ensimmäistä kertaa, tulee hänen sallia käyttöoikeuksiensa käyttämisen custom connectorillemme (DelegatedMicrosoftGraph).
Custom connectorin käyttäminen Flow:ssa
Aina emme voi kutsua Microsoft Graphia suoraan PowerAppsista. Esimerkiksi Teamsin luonnissa täytyy odottaa, milloin Teams on valmis. Vasta sen jälkeen voi tehdä mahdollisia lisätoimenpiteitä, kuten lisätä kanavia, käyttäjiä jne.
Tällainen ketju on huomattavasti helpompaa toteuttaa Flow:lla.
Luodaan yksinkertainen Flow, joka käyttää luomaamme custom connectoria. Flow käynnistetään PowerAppsista ja palauttaa PowerAppsille custom connectorilta saamansa sähköpostiosoitteen.
Lisätään PowerAppsiin painike, joka käynnistää tekemämme Flown ja nappaa paluuarvon kokoelmaan.
Painetaan painiketta ja tarkistetaan mitä kokoelmamme sisältää.
Toimii!
Mutta ne lisenssit…
Flow:n ja PowerAppsin lisensointi muuttuu helmikuussa 2019. Yksi muutoksista on, että mikäli Flow/PowerApps pitää sisällään custom connectorin, vaatii sen suorittaminen vähintään Flow/PowerApps P1 -tasoisen lisenssin (5€/käyttäjä/kk).
Eli molemmat esimerkkimme vaativat kaikilta sovelluksen käyttäjille P1-lisenssi.
Huomioita
Delegoidut käyttöoikeudet ovat todella hyödylliset ja niiden käyttö on suoraviivaista.
Custom connectorien teko oli (ainakin tätä kirjoittaessa) kuitenkin aika kankeaa. Connectoriin tehdyt muuutokset tulivat voimaan selvällä viiveellä (5 min), jonka vuoksi tekeminen oli välillä hermoja raastavaa. Virhetä kun aina sattuu ja niitä olisi kiva korjata hieman nopeammin.
Mikäli ihmettelit miksi käyttämäni toiminto (action) oli niin typerästi nimetty (GetMeData), johtui tämä juurikin tuosta viiveestä. En vain enää jaksanut korjata typoa ja odottaa että saisin uudet näytönkuvat tähän juttuun.