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).

azure ad step 1.png

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).

Screenshot 2019-01-16 at 18.09.30.png

Listasta valitaan oikeudet, jota käyttämämme toiminnot tarvitsevat. Esimerkkimme tarvitsee ainoastaan käyttäjätietojen lukuoikeudet (User.Read). 

Screenshot 2019-01-16 at 18.13.02.png

Luodaan vielä salaisuus (secret) ja otetaan sen avain (key) talteen. Tunnistautumisessa avaimen parina käytetään application id:ta

azure ad step 4.png

Tarvitsemme myös tenantin id:n. Se löytyy esimerkiksi Azure Ad:n asetuksista (directory id).

azure ad step 5.png

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.

Screenshot 2019-01-16 at 18.36.52.png

Annetaan connectorille nimi (DelegatedMicrosoftGraph). Tämän jälkeen annetaan kuvaus, sekä asetetaan host-osoitteeksi graph.microsoft.com.

Screenshot 2019-01-18 at 14.25.24.png

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

Screenshot 2019-01-16 at 18.45.37.png

Tässä vaiheessa luodaan connectori (Create connector). Luonnin jälkeen custom connectorin oAuth-osuuteen ilmestyy Redirect URL.

Screenshot 2019-01-16 at 18.49.08.png

Kopioidaan se leikepöydälle ja käydään lisäämässä ko osoite Azure Applikaatiomme Reply URL:ksi. Screenshot 2019-01-16 at 18.50.17.png

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.

Screenshot 2019-01-16 at 18.52.50.png

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.

Screenshot 2019-01-16 at 18.55.09.png

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.

Screenshot 2019-01-16 at 19.00.42.png

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.

Screenshot 2019-01-16 at 19.05.11.png

Näin custom connectorimme vastaus on valmiina parsittuna omiin kenttiinsä, jolloin sitä on helpompi käsitellä PowerAppsissa / Flow:ssa.

Screenshot 2019-01-16 at 19.07.10.png

Custom connectorin käyttö PowerAppsista

Luodaan tyhjä PowerApps ja lisätään siihen tietolähteeksi luomamme connectori.

Valitaan uusi tietolähde (Add data source).

Screenshot 2019-01-16 at 19.21.47.png

Heti perään valitaan uusi yhteys (New connection). Sieltä löytyy luomamme connectori (DelegatedMicrosoftGraph).

Screenshot 2019-01-16 at 19.48.33.png

Lisätään sovellukseemme painike, joka suorittaa connectorin GetMeData -toiminnon ja tallentaa sen paluuarvon kokoelmaan.

Screenshot 2019-01-16 at 19.20.33.png

Painetaan painiketta ja katsotaan mitä kokoelmaan on tallentunut.

Screenshot 2019-01-16 at 19.50.19.png

Voila!

Käyttäjän avatessa PowerAppsin ensimmäistä kertaa, tulee hänen sallia käyttöoikeuksiensa käyttämisen custom connectorillemme (DelegatedMicrosoftGraph).

microsoftteams-image

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.

screenshot 2019-01-16 at 19.59.25

Lisätään PowerAppsiin painike, joka käynnistää tekemämme Flown ja nappaa paluuarvon kokoelmaan.

Screenshot 2019-01-16 at 20.00.01.png

Painetaan painiketta ja tarkistetaan mitä kokoelmamme sisältää.

Screenshot 2019-01-16 at 20.01.10.png

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.