GitHub M 擴充功能展示了如何新增對 OAuth 2.0 協定認證流程的支援。 你可以在 GitHub Docs 網站上了解更多關於 GitHub 認證流程的細節。
在開始建立 M 擴充功能之前,你需要先在 GitHub 註冊一個新應用程式,並將 client_id 和 client_secret 檔案替換成你應用程式所需的適當值。
關於 Visual Studio 相容性問題的注意:Power Query SDK 使用基於 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,您必須指定重定向網址為 https://oauth.powerbi.com/views/oauthredirect.html。
當你指定這個網址,GitHub 成功認證並授予權限後,GitHub 會重新導向到 Power BI 的 oauthredirect 端點,讓 Power BI 能取得access_token和refresh_token。
如何註冊 GitHub 應用程式
你的 Power BI 擴充功能需要登入 GitHub。 要啟用此功能,請在 GitHub 註冊一個新的 OAuth 應用程式。https://github.com/settings/applications/new
-
Application name: 輸入申請 M 延長碼的名稱。 -
Authorization callback URL:輸入 https://oauth.powerbi.com/views/oauthredirect.html。 -
Scope: 在 GitHub 中,將範圍設為user, repo。
備註
註冊的 OAuth 應用程式會被分配一個獨特的客戶端 ID 和客戶端秘密。 客戶機密不應被分享。 你可以從 GitHub 應用程式頁面取得 Client ID 和 Client Secret。 在你的 Data Connector 專案中更新檔案,新增 Client ID(client_id 檔案)和 Client Secret(client_secret 檔案)。
如何實作 GitHub OAuth
這個範例會帶你完成以下步驟:
- 建立一個資料來源類型定義,宣稱它支援 OAuth。
- 提供細節以便 M 引擎能啟動 OAuth 流程(
StartLogin)。 - 將從 GitHub 收到的程式碼轉換成access_token (
FinishLogin和TokenMethod)。 - 定義能存取 GitHub API 的函式(
GithubSample.Contents)。
步驟 1 - 建立資料來源定義
資料連接器以描述擴充功能的 記錄 開始,包括其唯一名稱(即記錄名稱)、支援的認證類型,以及資料來源的友善顯示名稱(標籤)。
在支援 OAuth 時,定義包含實作 OAuth 契約的函式——在此例中為 StartLoginFinishLogin和 。
//
// Data Source definition
//
GithubSample = [
Authentication = [
OAuth = [
StartLogin = StartLogin,
FinishLogin = FinishLogin
]
],
Label = Extension.LoadString("DataSourceLabel")
];
步驟二 - 提供細節,讓 M 引擎能啟動 OAuth 流程
GitHub OAuth 流程從你引導使用者到 https://github.com/login/oauth/authorize 該頁面開始。
使用者登入時,你需要指定多個查詢參數:
| 名稱 | 類型 | Description |
|---|---|---|
| client_id (客戶識別碼) | 字串 | 必要。 你註冊時從 GitHub 收到的客戶 ID。 |
| 重新導向_URI | 字串 | 您的應用程式中,授權後用戶將被導向的網址。 詳見後續關於重定向網址的細節。 對於 M 擴展,redirect_uri 必須是「https://oauth.powerbi.com/views/oauthredirect.html"」。 |
| 範圍 | 字串 | 用逗號分隔的瞄準鏡清單。 如果沒有提供,範圍會預設為空範圍清單,給沒有為該應用程式提供有效令牌的使用者使用。 對於已經擁有有效令牌的使用者,使用者不會看到包含範圍清單的 OAuth 授權頁面。 相反地,這個流程步驟會自動以使用者上次完成流程時使用的相同範圍完成。 |
| 狀態 | 字串 | 一個無法猜測的隨機串。 它用來防止跨站請求偽造攻擊。 |
以下程式碼片段說明如何實作 StartLogin 一個函式來啟動登入流程。
函數 StartLogin 使用 resourceUrl、state、display 和 值。
在函式中,建立一個 AuthorizeUrl 用於將 GitHub 授權網址與以下參數進行串聯:
-
client_id: 你在 GitHub 應用程式頁面註冊擴充功能後,會取得客戶端 ID。 -
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 會以臨時代碼 code 和你在前一步 state 提供的狀態參數,重新導向回 Power BI 的重定向網址。 你的 FinishLogin 函數會從 callbackUri 參數中擷取程式碼,然後用 TokenMethod 函數將它兌換為存取權杖。
FinishLogin = (context, callbackUri, state) =>
let
Parts = Uri.Parts(callbackUri)[Query]
in
TokenMethod(Parts[code]);
要取得 GitHub 存取權杖,你必須傳遞 GitHub 授權回應的臨時程式碼。 在這個函式中 TokenMethod ,你會向 GitHub 的 access_token 端點https://github.com/login/oauth/access_token()提出一個 POST 請求。
GitHub 端點需要以下參數:
| 名稱 | 類型 | Description |
|---|---|---|
| client_id (客戶識別碼) | 字串 | 必要。 你註冊時從 GitHub 收到的客戶 ID。 |
| client_secret | 字串 | 必要。 你註冊時從 GitHub 收到的客戶端秘密。 |
| 字碼 | 字串 |
必要。 你收到 FinishLogin的代碼是 。 |
| 重新導向_URI | 字串 | 授權後用戶將被導向至您應用程式中的網址。 詳見後文關於重定向網址的說明。 |
以下是 Web.Contents 呼叫所使用的詳細參數。
| Argument | Description | 價值觀 |
|---|---|---|
| url | 網站網址。 | https://github.com/login/oauth/access_token |
| options | 一個記錄來控制這個函式的行為。 | 這次沒用到 |
| Query | 以程式設計方式將查詢參數新增至 URL。 |
內容 = Text.ToBinary(哪裡
|
| 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 - 定義能存取 GitHub API 的功能
以下程式碼片段將兩個函式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)也會自動繼承這些憑證。
關於憑證與認證的更多細節,請參閱 「處理認證」。
範例網址
此連接器能從任何 GitHub v3 REST API 端點擷取格式化資料。 例如,查詢拉取所有提交到 Data Connectors 倉庫的檔案會是這樣:
GithubSample.Contents("https://api.github.com/repos/microsoft/dataconnectors/commits")