共用方式為


GitHub 連接器範例

GitHub M 擴充功能展示了如何新增對 OAuth 2.0 協定認證流程的支援。 你可以在 GitHub Docs 網站上了解更多關於 GitHub 認證流程的細節。

在開始建立 M 擴充功能之前,你需要先在 GitHub 註冊一個新應用程式,並將 client_idclient_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

  1. Application name: 輸入申請 M 延長碼的名稱。
  2. Authorization callback URL:輸入 https://oauth.powerbi.com/views/oauthredirect.html
  3. Scope: 在 GitHub 中,將範圍設為 user, repo

備註

註冊的 OAuth 應用程式會被分配一個獨特的客戶端 ID 和客戶端秘密。 客戶機密不應被分享。 你可以從 GitHub 應用程式頁面取得 Client ID 和 Client Secret。 在你的 Data Connector 專案中更新檔案,新增 Client ID(client_id 檔案)和 Client Secret(client_secret 檔案)。

如何實作 GitHub OAuth

這個範例會帶你完成以下步驟:

  1. 建立一個資料來源類型定義,宣稱它支援 OAuth。
  2. 提供細節以便 M 引擎能啟動 OAuth 流程(StartLogin)。
  3. 將從 GitHub 收到的程式碼轉換成access_token (FinishLoginTokenMethod)。
  4. 定義能存取 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 使用 resourceUrlstatedisplay 和 值。 在函式中,建立一個 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(
Uri.BuildQueryString( )
[
client_id = client_id,
client_secret = client_secret,
code = 程式碼,
redirect_uri = redirect_uri
]
))

哪裡
  • client_id: 來自 GitHub 應用程式頁面的客戶 ID。
  • client_secret:來自 GitHub 應用程式頁面的用戶端密鑰。
  • code:GitHub授權回應中的程式碼。
  • redirect_uri:授權後使用者將被導向的應用程式中網址。
Headers 一個帶有額外標頭的 HTTP 請求記錄。 標題= [
#“內容型別” = “application/x-www-form-urlencoded”,
#“Accept” = “application/json”
]

這段程式碼片段說明如何實作 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")