Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A extensão do GitHub M mostra como adicionar suporte a um fluxo de autenticação de protocolo OAuth 2.0. Você pode saber mais sobre as especificidades do fluxo de autenticação do GitHub no site do GitHub Docs.
Antes de começar a criar uma extensão M, você precisa registrar um novo aplicativo no GitHub e substituir os arquivos client_id e client_secret pelos valores apropriados para seu aplicativo.
Observação sobre problemas de compatibilidade no Visual Studio:o SDK do Power Query usa um controle baseado no Internet Explorer para pop-up de caixas de diálogo OAuth. O GitHub preteriu seu suporte para a versão do IE usada por esse controle, o que impedirá que você concatena a concessão de permissão para seu aplicativo se for executado no Visual Studio. Uma alternativa é carregar a extensão com o Power BI Desktop e concluir o primeiro fluxo OAuth lá. Depois que o aplicativo tiver recebido acesso à sua conta, os logons subsequentes funcionarão bem no Visual Studio.
OAuth e Power BI
O OAuth é uma forma de delegação de credenciais. Ao fazer logon no GitHub e autorizar o "aplicativo" criado para o GitHub, o usuário está permitindo que seu "aplicativo" faça logon em seu nome para recuperar dados no Power BI. O "aplicativo" deve receber direitos para recuperar dados (obter um access_token) e atualizar os dados em um agendamento (obter e usar um refresh_token). Seu "aplicativo" nesse contexto é o Conector de Dados usado para executar consultas no Power BI. O Power BI armazena e gerencia o access_token e refresh_token em seu nome.
Observação
Para permitir que o Power BI obtenha e use o access_token, especifique a URL de redirecionamento como https://oauth.powerbi.com/views/oauthredirect.html.
Quando você especificar essa URL e o GitHub autenticar e conceder permissões com êxito, o GitHub redirecionará para o ponto de extremidade oauthredirect do Power BI para que o Power BI possa recuperar o access_token e refresh_token.
Como registrar um aplicativo do GitHub
Sua extensão do Power BI precisa fazer logon no GitHub. Para habilitar isso, registre um novo aplicativo OAuth com o GitHub em https://github.com/settings/applications/new.
-
Application name: Digite um nome para o aplicativo da sua extensão M. -
Authorization callback URL: introduza https://oauth.powerbi.com/views/oauthredirect.html. -
Scope: no GitHub, defina o escopo comouser, repo.
Observação
Um aplicativo OAuth registrado recebe uma ID de cliente exclusiva e um segredo do cliente. O Segredo do Cliente não deve ser compartilhado. Você obtém a ID do cliente e o segredo do cliente na página do aplicativo GitHub. Atualize os arquivos em seu projeto do Conector de Dados com a Identificação do Cliente (client_id arquivo) e a Chave Secreta do Cliente (client_secret arquivo).
Como implementar o GitHub OAuth
Este exemplo orienta você pelas seguintes etapas:
- Crie uma definição de Tipo de Fonte de Dados que declare que dá suporte ao OAuth.
- Forneça detalhes para que o mecanismo M possa iniciar o fluxo OAuth (
StartLogin). - Converter o código recebido do GitHub em um access_token (
FinishLogineTokenMethod). - Defina funções que acessam a API do GitHub (
GithubSample.Contents).
Etapa 1 – Criar uma definição de Fonte de Dados
Um Conector de Dados começa com um registro que descreve a extensão, incluindo seu nome exclusivo (que é o nome do registro), tipos de autenticação com suporte e um nome de exibição amigável (rótulo) para a fonte de dados.
Ao dar suporte ao OAuth, a definição contém as funções que implementam o contrato OAuth, nesse caso, StartLogin e FinishLogin.
//
// Data Source definition
//
GithubSample = [
Authentication = [
OAuth = [
StartLogin = StartLogin,
FinishLogin = FinishLogin
]
],
Label = Extension.LoadString("DataSourceLabel")
];
Etapa 2 – Fornecer detalhes para que o mecanismo M possa iniciar o fluxo OAuth
O fluxo OAuth do GitHub é iniciado quando você direciona os usuários para a https://github.com/login/oauth/authorize página.
Para que o usuário faça logon, você precisa especificar uma série de parâmetros de consulta:
| Nome | Tipo | Description |
|---|---|---|
| ID do cliente | cadeia | Obrigatório. A ID do cliente que você recebeu do GitHub quando se registrou. |
| URI de redirecionamento | cadeia | A URL em seu aplicativo para onde os usuários serão enviados após a autorização. Veja os detalhes a seguir sobre urls de redirecionamento. Para extensões M, deve redirect_uri ser "https://oauth.powerbi.com/views/oauthredirect.html". |
| escopo | cadeia | Uma lista de escopos separada por vírgulas. Se não for fornecido, o escopo usará como padrão uma lista vazia de escopos para usuários que não têm um token válido para o aplicativo. Para usuários que já têm um token válido para o aplicativo, o usuário não será mostrado na página de autorização do OAuth com a lista de escopos. Em vez disso, essa etapa do fluxo será concluída automaticamente com os mesmos escopos que foram usados na última vez que o usuário concluiu o fluxo. |
| estado | cadeia | Uma string aleatória indescritível. É usado para proteger contra ataques de falsificação de solicitações entre sites. |
O snippet de código a seguir descreve como implementar uma StartLogin função para iniciar o fluxo de logon.
Uma StartLogin função aceita um resourceUrl, um state e um valor display.
Na função, crie um AuthorizeUrl que concatena a URL de autorização do GitHub com os seguintes parâmetros:
-
client_id: você obtém a ID do cliente depois de registrar sua extensão no GitHub na página do aplicativo GitHub. -
scope: defina o escopo como "user, repo". Isso define o escopo de autorização (ou seja, o que seu aplicativo deseja acessar) para o usuário. -
state: um valor interno que é repassado pelo mecanismo M. -
redirect_uri: definido como 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
];
Se esta for a primeira vez que o usuário estiver fazendo login com o seu aplicativo (identificado pelo valor client_id), ele verá uma página solicitando que conceda acesso ao seu aplicativo. As tentativas de logon subsequentes solicitarão suas credenciais.
Etapa 3 – Converter o código recebido do GitHub em um access_token
Se o usuário concluir o fluxo de autenticação, o GitHub redirecionará de volta para a URL de redirecionamento do Power BI com um código temporário em um code parâmetro, bem como o estado fornecido na etapa anterior em um state parâmetro. Sua FinishLogin função extrairá o código do callbackUri parâmetro e o trocará por um token de acesso (usando a TokenMethod função).
FinishLogin = (context, callbackUri, state) =>
let
Parts = Uri.Parts(callbackUri)[Query]
in
TokenMethod(Parts[code]);
Para obter um token de acesso do GitHub, você passa o código temporário da Resposta de Autorização do GitHub. Na função TokenMethod, você formula uma solicitação POST para o endpoint access_token do GitHub (https://github.com/login/oauth/access_token).
Os seguintes parâmetros são necessários para o endpoint do GitHub:
| Nome | Tipo | Description |
|---|---|---|
| ID do cliente | cadeia | Obrigatório. A ID do cliente que você recebeu do GitHub quando se registrou. |
| segredo_do_cliente | cadeia | Obrigatório. O segredo do cliente que você recebeu do GitHub quando se registrou. |
| codificar | cadeia |
Obrigatório. O código que você recebeu em FinishLogin. |
| URI de redirecionamento | cadeia | A URL em seu aplicativo para onde os usuários serão enviados após a autorização. Veja os detalhes a seguir sobre URLs de redirecionamento. |
Aqui estão os detalhes dos parâmetros usados para a chamada Web.Contents.
| Argument | Description | Value |
|---|---|---|
| url | A URL do site da Web. | https://github.com/login/oauth/access_token |
| Opções | Um registro para controlar o comportamento dessa função. | Não usado nesse caso |
| Query | Adicione programaticamente parâmetros de consulta à URL. |
Content = Text.ToBinary(Where
|
| Headers | Um registro com cabeçalhos adicionais para a solicitação HTTP. |
Headers= [ |
Este snippet de código descreve como implementar uma TokenMethod função para trocar um código de autenticação por um token de acesso.
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;
A resposta JSON do serviço conterá um campo access_token. O TokenMethod método converte a resposta JSON em um registro M usando Json.Document e a retorna para o mecanismo.
Resposta de exemplo:
{
"access_token":"e72e16c7e42f292c6912e7710c838347ae178b4a",
"scope":"user,repo",
"token_type":"bearer"
}
Etapa 4 – Definir funções que acessam a API do GitHub
O snippet de código a seguir exporta duas funções (GithubSample.Contents e GithubSample.PagedTable) marcando-as como sharede as associa ao Tipo de GithubSample Fonte de Dados.
[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);
A GithubSample.Contents função também é publicada na interface do usuário (permitindo que ela apareça na caixa de diálogo Obter Dados ). A função Value.ReplaceType é usada para definir o parâmetro de função para o Url.Type tipo inscrito.
Ao associar essas funções ao tipo de GithubSample fonte de dados, elas usarão automaticamente as credenciais fornecidas pelo usuário. Todas as funções da biblioteca M habilitadas para extensibilidade (como Web.Contents) herdarão automaticamente essas credenciais também.
Para obter mais detalhes sobre como funciona a credencial e a autenticação, consulte Manipulando a Autenticação.
URL de exemplo
Esse conector recupera dados formatados de qualquer endpoint da API REST do GitHub v3. Por exemplo, a consulta para buscar todos os commits do repositório de Conectores de Dados teria a seguinte aparência:
GithubSample.Contents("https://api.github.com/repos/microsoft/dataconnectors/commits")