Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Расширение GitHub M показывает, как добавить поддержку потока проверки подлинности протокола OAuth 2.0. Дополнительные сведения об особенностях потока проверки подлинности GitHub можно узнать на сайте документации GitHub.
Прежде чем приступить к созданию расширения M, необходимо зарегистрировать новое приложение на сайте GitHub и заменить client_idclient_secret их соответствующими значениями для приложения.
Обратите внимание на проблемы совместимости в Visual Studio:Пакет SDK Power Query использует элемент управления на основе Internet Explorer для всплывающих диалогов OAuth. GitHub прекратил поддержку версии IE, используемой этим элементом управления, что мешает вам завершить предоставление разрешения для вашего приложения при запуске в Visual Studio. Альтернативой является загрузка расширения с помощью Power BI Desktop и завершение первого потока OAuth там. После предоставления приложению доступа к вашей учетной записи последующие входы в систему будут работать нормально из Visual Studio.
OAuth и Power BI
OAuth — это форма делегирования учетных данных. Войдя в GitHub и авторизовав «приложение», которое вы создаете для GitHub, пользователь позволяет вашему «приложению» входить от его имени, чтобы получать данные в Power BI. Приложение должно получить права на получение данных (access_token) и на обновление данных по расписанию (получение и использование refresh_token). Приложение в этом контексте — это соединитель данных, используемый для выполнения запросов в Power BI. Power BI хранит и управляет access_token и refresh_token от вашего имени.
Замечание
Чтобы разрешить Power BI получать и использовать access_token, необходимо указать URL-адрес перенаправления как https://oauth.powerbi.com/views/oauthredirect.html.
При указании этого URL-адреса, и после успешной проверки подлинности и предоставления разрешений GitHub, произойдет перенаправление на конечную точку oauthredirect Power BI, чтобы Power BI мог получить access_token и refresh_token.
Регистрация приложения GitHub
Расширение Power BI должно войти в GitHub. Для этого зарегистрируйте новое приложение OAuth на сайте GitHub https://github.com/settings/applications/new.
-
Application name: введите имя приложения для расширения M. -
Authorization callback URL: введите https://oauth.powerbi.com/views/oauthredirect.html. -
Scope: в GitHub установите область наuser, repo.
Замечание
Зарегистрированное приложение OAuth получает уникальный идентификатор клиента и секретный ключ клиента. Секрет клиента не должен быть общим. Идентификатор клиента и секрет клиента можно получить на странице приложения GitHub. Обновите файлы в проекте соединителя данных с помощью идентификатора клиента (client_id файла) и секрета клиента (client_secret файла).
Как реализовать GitHub OAuth
В этом примере описаны следующие действия.
- Создайте определение типа источника данных, которое объявляет его поддерживает OAuth.
- Укажите сведения, чтобы модуль M смог запустить поток OAuth (
StartLogin). - Преобразуйте код, полученный из GitHub, в access_token (
FinishLoginиTokenMethod). - Определите функции, обращаюющиеся к API GitHub (
GithubSample.Contents).
Шаг 1. Создание определения источника данных
Соединитель данных начинается с записи , описывающей расширение, включая его уникальное имя (имя записи), поддерживаемые типы проверки подлинности и понятное отображаемое имя (метка) для источника данных.
При поддержке OAuth определение содержит функции, реализующие контракт OAuth, в данном случае StartLogin и FinishLogin.
//
// Data Source definition
//
GithubSample = [
Authentication = [
OAuth = [
StartLogin = StartLogin,
FinishLogin = FinishLogin
]
],
Label = Extension.LoadString("DataSourceLabel")
];
Шаг 2. Укажите данные, чтобы M-движок мог начать поток OAuth.
Поток OAuth GitHub начинается, когда пользователи перенаправляются на страницу https://github.com/login/oauth/authorize.
Для входа пользователя необходимо указать ряд параметров запроса:
| Имя | Тип | Description |
|---|---|---|
| идентификатор клиента | струна | Обязательно. Идентификатор клиента, полученный от GitHub при регистрации. |
| redirect_uri | струна | URL-адрес в приложении, на который пользователи будут перенаправляться после авторизации. Дополнительные сведения о URL-адресах перенаправления см. в разделе . Для расширений M redirect_uri должно быть "https://oauth.powerbi.com/views/oauthredirect.html"". |
| scope | струна | Разделенный запятыми список областей. Если не указано, область по умолчанию использует пустой список разрешений для пользователей, у которых нет действительного токена для приложения. Для пользователей, у которых уже есть действующий токен для приложения, страница авторизации OAuth со списком разрешений не будет показана. Вместо этого этот шаг потока будет автоматически завершен с теми же областями действия, которые использовались в последний раз, когда пользователь завершал поток. |
| государство | струна | Случайная строка, которую сложно угадать. Он используется для защиты от атак межсайтовой подделки запросов. |
В следующем фрагменте кода описывается, как реализовать StartLogin функцию для запуска потока входа.
Функция StartLogin принимает resourceUrlstateи display значение.
В функции создайте AuthorizeUrl, который объединяет URL-адрес авторизации GitHub со следующими параметрами:
-
client_id: после регистрации расширения с помощью GitHub вы получите идентификатор клиента на странице приложения GitHub. -
scope: задайте для области значение "user, repo". Это задает область авторизации (то есть то, что приложение хочет получить к доступу) для пользователя. -
state: внутреннее значение, которое передает движок M. -
redirect_uri: задано значение 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
];
Если это первый раз, когда пользователь входит в систему с вашим приложением (идентифицируется по его client_id значению), он увидит страницу с просьбой предоставить доступ вашему приложению. Последующие попытки входа будут запрашивать свои учетные данные.
Шаг 3. Преобразование кода, полученного из GitHub, в access_token
Если пользователь завершает поток проверки подлинности, GitHub перенаправляет обратно в URL-адрес перенаправления Power BI с временным кодом в code параметре, а также с тем состоянием, которое вы указали на предыдущем шаге, в параметре state. Функция FinishLogin извлекает код из callbackUri параметра, а затем обменивается им на маркер доступа (с помощью TokenMethod функции).
FinishLogin = (context, callbackUri, state) =>
let
Parts = Uri.Parts(callbackUri)[Query]
in
TokenMethod(Parts[code]);
Чтобы получить токен доступа GitHub, передайте временный код из ответа авторизации GitHub. В функции TokenMethod создается запрос POST к конечной точке access_token GitHub (https://github.com/login/oauth/access_token).
Для конечной точки GitHub требуются следующие параметры:
| Имя | Тип | Description |
|---|---|---|
| идентификатор клиента | струна | Обязательно. Идентификатор клиента, полученный от GitHub при регистрации. |
| секрет_клиента | струна | Обязательно. Секрет клиента, полученный от GitHub при регистрации. |
| код | струна |
Обязательно. Код, который вы получили в FinishLogin. |
| redirect_uri | струна | URL-адрес в приложении, на который пользователи будут перенаправляться после авторизации. Дополнительные сведения о URL-адресах перенаправления см. в следующих статьях. |
Ниже приведены сведения об используемых параметрах для вызова Web.Contents .
| Аргумент | Description | Ценность |
|---|---|---|
| URL-адрес | URL-адрес веб-сайта. | https://github.com/login/oauth/access_token |
| options | Запись для управления поведением этой функции. | Не используется в этом случае |
| Query | Программное добавление параметров запроса в URL-адрес. |
Content = Text.ToBinary()Where
|
| Headers | Запись с дополнительными заголовками для HTTP-запроса. |
Заголовки= [ |
В этом фрагменте кода описывается, как реализовать TokenMethod функцию для обмена кода авторизации на токен доступа.
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;
Ответ JSON из службы будет содержать поле access_token. Метод TokenMethod преобразует ответ JSON в запись M с помощью Json.Document и возвращает его в обработчик.
Пример ответа:
{
"access_token":"e72e16c7e42f292c6912e7710c838347ae178b4a",
"scope":"user,repo",
"token_type":"bearer"
}
Шаг 4. Определение функций, обращаюющихся к API GitHub
Следующий фрагмент кода экспортирует две функции (GithubSample.Contents и GithubSample.PagedTable) помечая их как sharedи связывает их с типом GithubSample источника данных.
[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);
Функция GithubSample.Contents также публикуется в пользовательском интерфейсе (позволяя ему отображаться в диалоговом окне получения данных ). Функция Value.ReplaceType используется для задания параметра функции типу, заданному атрибутом Url.Type .
При связывании этих функций с типом GithubSample источника данных они автоматически будут использовать учетные данные, предоставленные пользователем. Все функции библиотеки M, которые были включены для расширяемости (например, Web.Contents), автоматически наследуют эти учетные данные.
Дополнительные сведения о том, как работают учетные данные и проверка подлинности, см. в разделе "Обработка проверки подлинности".
Пример URL-адреса
Этот соединитель может получить отформатированные данные из любой конечной точки REST API GitHub версии 3. Например, запрос на извлечение всех коммитов в репозиторий Data Connectors будет выглядеть следующим образом:
GithubSample.Contents("https://api.github.com/repos/microsoft/dataconnectors/commits")