Voorbeeld van GitHub-connector
De GitHub M-extensie laat zien hoe u ondersteuning toevoegt voor een OAuth 2.0-protocolverificatiestroom. Meer informatie over de specifieke kenmerken van de verificatiestroom van GitHub vindt u op de GitHub Developer-site.
Voordat u aan de slag gaat met het maken van een M-extensie, moet u een nieuwe app registreren op GitHub en de client_id
bestanden client_secret
vervangen door de juiste waarden voor uw app.
Opmerking over compatibiliteitsproblemen in Visual Studio: de Power Query SDK maakt gebruik van een op Internet Explorer gebaseerd besturingselement voor het pop-upvenster van OAuth. GitHub heeft de ondersteuning voor de versie van IE die door dit besturingselement wordt gebruikt afgeschaft, waardoor u de machtigingstoekenning voor uw app niet kunt voltooien als deze wordt uitgevoerd vanuit Visual Studio. Een alternatief is het laden van de extensie met Power BI Desktop en het voltooien van de eerste OAuth-stroom daar. Nadat uw toepassing toegang heeft gekregen tot uw account, werken volgende aanmeldingen prima vanuit Visual Studio.
OAuth en Power BI
OAuth is een vorm van referentiesdelegering. Door u aan te melden bij GitHub en de toepassing te autoriseren die u voor GitHub maakt, staat de gebruiker toe dat uw 'toepassing' zich namens hen kan aanmelden om gegevens op te halen in Power BI. De toepassing moet rechten krijgen om gegevens op te halen (een access_token ophalen) en om de gegevens volgens een schema te vernieuwen (een refresh_token ophalen en gebruiken). Uw 'toepassing' in deze context is uw gegevensconnector die wordt gebruikt om query's uit te voeren in Power BI. Power BI slaat de access_token en refresh_token namens u op en beheert deze.
Notitie
Als u wilt toestaan dat Power BI de access_token kan verkrijgen en gebruiken, moet u de omleidings-URL opgeven als https://oauth.powerbi.com/views/oauthredirect.html.
Wanneer u deze URL opgeeft en GitHub machtigingen heeft geverifieerd en verleend, wordt GitHub omgeleid naar het oauthredirect-eindpunt van Power BI, zodat Power BI de access_token en refresh_token kan ophalen.
Een GitHub-app registreren
Uw Power BI-extensie moet zich aanmelden bij GitHub. Als u dit wilt inschakelen, registreert u een nieuwe OAuth-toepassing bij GitHub op https://github.com/settings/applications/new.
Application name
: Voer een naam in voor de toepassing voor uw M-extensie.Authorization callback URL
: Voer in https://oauth.powerbi.com/views/oauthredirect.html.Scope
: Stel in GitHub het bereik in opuser, repo
.
Notitie
Aan een geregistreerde OAuth-toepassing wordt een unieke client-id en clientgeheim toegewezen. Het clientgeheim mag niet worden gedeeld. U krijgt de client-id en het clientgeheim op de gitHub-toepassingspagina. Werk de bestanden in uw gegevensconnectorproject bij met de client-id (client_id
bestand) en clientgeheim (client_secret
bestand).
GitHub OAuth implementeren
In dit voorbeeld worden de volgende stappen beschreven:
- Maak een definitie van het type gegevensbron waarmee wordt aangegeven dat deze ondersteuning biedt voor OAuth.
- Geef details op zodat de M-engine de OAuth-stroom (
StartLogin
) kan starten. - Converteer de code die u van GitHub hebt ontvangen naar een access_token (
FinishLogin
enTokenMethod
). - Definieer functies die toegang hebben tot de GitHub-API (
GithubSample.Contents
).
Stap 1: een definitie van een gegevensbron maken
Een gegevensconnector begint met een record die de extensie beschrijft, inclusief de unieke naam (de naam van de record), ondersteunde verificatietypen en een beschrijvende weergavenaam (label) voor de gegevensbron.
Bij het ondersteunen van OAuth bevat de definitie de functies die het OAuth-contract implementeren, in dit geval StartLogin
en FinishLogin
.
//
// Data Source definition
//
GithubSample = [
Authentication = [
OAuth = [
StartLogin = StartLogin,
FinishLogin = FinishLogin
]
],
Label = Extension.LoadString("DataSourceLabel")
];
Stap 2: geef details op zodat de M-engine de OAuth-stroom kan starten
De GitHub OAuth-stroom wordt gestart wanneer u gebruikers naar de https://github.com/login/oauth/authorize
pagina leidt.
Als de gebruiker zich aanmeldt, moet u een aantal queryparameters opgeven:
Name | Type | Description |
---|---|---|
client_id | tekenreeks | Vereist. De client-id die u hebt ontvangen van GitHub toen u zich registreerde. |
redirect_uri | tekenreeks | De URL in uw app waar gebruikers na autorisatie worden verzonden. Hieronder vindt u meer informatie over omleidings-URL's. Voor M-extensies moet de ' redirect_uri ;' zijnhttps://oauth.powerbi.com/views/oauthredirect.html". |
bereik | tekenreeks | Een door komma's gescheiden lijst met bereiken. Als dit niet is opgegeven, wordt het bereik standaard ingesteld op een lege lijst met bereiken voor gebruikers die geen geldig token voor de app hebben. Voor gebruikers die al een geldig token voor de app hebben, wordt de gebruiker niet weergegeven op de pagina OAuth-autorisatie met de lijst met bereiken. In plaats daarvan wordt deze stap van de stroom automatisch voltooid met dezelfde bereiken die de laatste keer zijn gebruikt dat de gebruiker de stroom heeft voltooid. |
staat | tekenreeks | Een niet te raden willekeurige tekenreeks. Het wordt gebruikt om te beschermen tegen aanvallen met vervalsing van aanvragen op meerdere sites. |
In het volgende codefragment wordt beschreven hoe u een StartLogin
functie implementeert om de aanmeldingsstroom te starten.
Een StartLogin
functie heeft een resourceUrl
, state
en display
waarde.
Maak in de functie een AuthorizeUrl
url die de GitHub-autorisatie-URL samenvoegt met de volgende parameters:
client_id
: U krijgt de client-id nadat u uw extensie bij GitHub hebt geregistreerd vanaf de GitHub-toepassingspagina.scope
: Stel het bereik in op 'user, repo
'. Hiermee stelt u het autorisatiebereik in (dat wil de app openen) voor de gebruiker.state
: Een interne waarde die de M-motor doorgeeft.redirect_uri
: Ingesteld op https://oauth.powerbi.com/views/oauthredirect.html.
StartLogin = (resourceUrl, state, display) =>
let
AuthorizeUrl = "https://github.com/login/oauth/authorize?" & Uri.BuildQueryString([
client_id = client_id,
scope = "user, repo",
state = state,
redirect_uri = redirect_uri])
in
[
LoginUri = AuthorizeUrl,
CallbackUri = redirect_uri,
WindowHeight = windowHeight,
WindowWidth = windowWidth,
Context = null
];
Als dit de eerste keer is dat de gebruiker zich aanmeldt met uw app (geïdentificeerd met client_id
de waarde), ziet hij een pagina waarin wordt gevraagd om toegang te verlenen tot uw app. Volgende aanmeldingspogingen vragen gewoon om hun referenties.
Stap 3: converteer de code die u van GitHub hebt ontvangen naar een access_token
Als de gebruiker de verificatiestroom voltooit, wordt GitHub omgeleid naar de omleidings-URL van Power BI met een tijdelijke code in een code
parameter, evenals de status die u in de vorige stap in een state
parameter hebt opgegeven. Met uw FinishLogin
functie wordt de code uit de callbackUri
parameter geëxtraheerd en vervolgens uitgewisseld voor een toegangstoken (met behulp van de TokenMethod
functie).
FinishLogin = (context, callbackUri, state) =>
let
Parts = Uri.Parts(callbackUri)[Query]
in
TokenMethod(Parts[code]);
Als u een GitHub-toegangstoken wilt ophalen, geeft u de tijdelijke code van het GitHub-autorisatieantwoord door. In de TokenMethod
functie formuleert u een POST-aanvraag naar het access_token-eindpunt (https://github.com/login/oauth/access_token
) van GitHub.
De volgende parameters zijn vereist voor het GitHub-eindpunt:
Name | Type | Description |
---|---|---|
client_id | tekenreeks | Vereist. De client-id die u hebt ontvangen van GitHub toen u zich registreerde. |
client_secret | tekenreeks | Vereist. Het clientgeheim dat u hebt ontvangen van GitHub toen u zich registreerde. |
code | tekenreeks | Vereist. De code die u hebt ontvangen.FinishLogin |
redirect_uri | tekenreeks | De URL in uw app waar gebruikers na autorisatie worden verzonden. Hieronder vindt u meer informatie over omleidings-URL's. |
Hier vindt u de details die worden gebruikt voor de aanroep Web.Contents .
Argument | Beschrijving | Waarde |
---|---|---|
URL | De URL voor de website. | https://github.com/login/oauth/access_token |
Opties | Een record voor het beheren van het gedrag van deze functie. | Niet gebruikt in dit geval |
Query | Voeg programmatisch queryparameters toe aan de URL. | Content = Text.ToBinary( Waar
|
Kopteksten | Een record met extra headers voor de HTTP-aanvraag. | Headers = [ |
In dit codefragment wordt beschreven hoe u een TokenMethod
functie implementeert voor het uitwisselen van een verificatiecode voor een toegangstoken.
TokenMethod = (code) =>
let
Response = Web.Contents("https://Github.com/login/oauth/access_token", [
Content = Text.ToBinary(Uri.BuildQueryString([
client_id = client_id,
client_secret = client_secret,
code = code,
redirect_uri = redirect_uri])),
Headers=[#"Content-type" = "application/x-www-form-urlencoded",#"Accept" = "application/json"]]),
Parts = Json.Document(Response)
in
Parts;
Het JSON-antwoord van de service bevat een access_token veld. De TokenMethod
methode converteert het JSON-antwoord naar een M-record met behulp van Json.Document en retourneert het naar de engine.
Voorbeeldantwoord:
{
"access_token":"e72e16c7e42f292c6912e7710c838347ae178b4a",
"scope":"user,repo",
"token_type":"bearer"
}
Stap 4: Functies definiëren die toegang hebben tot de GitHub-API
Met het volgende codefragment worden twee functies (GithubSample.Contents
en GithubSample.PagedTable
) geëxporteerd door ze te markeren als shared
en te koppelen aan het GithubSample
gegevensbrontype.
[DataSource.Kind="GithubSample", Publish="GithubSample.UI"]
shared GithubSample.Contents = Value.ReplaceType(Github.Contents, type function (url as Uri.Type) as any);
[DataSource.Kind="GithubSample"]
shared GithubSample.PagedTable = Value.ReplaceType(Github.PagedTable, type function (url as Uri.Type) as nullable table);
De GithubSample.Contents
functie wordt ook gepubliceerd in de gebruikersinterface (zodat deze kan worden weergegeven in het dialoogvenster Gegevens ophalen). De functie Value.ReplaceType wordt gebruikt om de functieparameter in te stellen op het Url.Type
getscribeerde type.
Door deze functies te koppelen aan het GithubSample
type gegevensbron, gebruiken ze automatisch de referenties die de gebruiker heeft opgegeven. Alle M-bibliotheekfuncties die zijn ingeschakeld voor uitbreidbaarheid (zoals Web.Contents), nemen deze referenties ook automatisch over.
Zie Verificatie verwerken voor meer informatie over de werking van referenties en verificatie.
Voorbeeld-URL
Deze connector kan opgemaakte gegevens ophalen uit alle GitHub v3 REST API-eindpunten. De query voor het ophalen van alle doorvoeringen naar de opslagplaats gegevensconnectors ziet er bijvoorbeeld als volgt uit:
GithubSample.Contents("https://api.github.com/repos/microsoft/dataconnectors/commits")