ตัวอย่างตัวเชื่อมต่อ GitHub
ส่วนขยาย GitHub M แสดงวิธีการเพิ่มการสนับสนุนสําหรับโฟลว์การรับรองความถูกต้องโพรโทคอล OAuth 2.0 คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับข้อมูลจําเพาะของโฟลว์การรับรองความถูกต้องของ GitHub บน ไซต์นักพัฒนา 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 คุณต้องระบุ URL เปลี่ยนเส้นทางเป็นhttps://oauth.powerbi.com/views/oauthredirect.html
เมื่อคุณระบุ URL นี้และ GitHub สําเร็จจะรับรองความถูกต้องและให้สิทธิ์ GitHub จะเปลี่ยนเส้นทางไปยังจุดสิ้นสุด oauthredirect ของ PowerBI เพื่อให้ 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.htmlScope
: ใน GitHub ตั้งค่าขอบเขตเป็นuser, repo
หมายเหตุ
แอปพลิเคชัน OAuth ที่ลงทะเบียนจะได้รับมอบหมาย ID ไคลเอ็นต์ และข้อมูลลับไคลเอ็นต์ ที่ไม่ซ้ํากัน ข้อมูลลับไคลเอ็นต์ไม่ควรแชร์ คุณจะได้รับ ID ไคลเอ็นต์และข้อมูลลับไคลเอ็นต์จากหน้าแอปพลิเคชัน GitHub อัปเดตไฟล์ในโครงการตัวเชื่อมต่อข้อมูลของคุณด้วย ID ไคลเอ็นต์ (client_id
ไฟล์) และข้อมูลลับของไคลเอ็นต์ (client_secret
ไฟล์)
วิธีใช้ GitHub OAuth
ตัวอย่างนี้จะแนะนําคุณผ่านขั้นตอนต่อไปนี้:
- สร้างข้อกําหนดชนิดแหล่งข้อมูลที่ประกาศสนับสนุน OAuth
- ระบุรายละเอียดดังนั้นกลไก M สามารถเริ่มต้นโฟลว์ OAuth (
StartLogin
) - แปลงรหัสที่ได้รับจาก GitHub เป็น access_token (
FinishLogin
และTokenMethod
) - กําหนดฟังก์ชันที่เข้าถึง GitHub API (
GithubSample.Contents
)
ขั้นตอนที่ 1 - สร้างข้อกําหนดของแหล่งข้อมูล
ตัวเชื่อมต่อข้อมูลเริ่มต้นด้วย ระเบียน ที่อธิบายส่วนขยาย รวมถึงชื่อที่ไม่ซ้ํากัน (ซึ่งเป็นชื่อของระเบียน) ชนิดการรับรองความถูกต้องที่ได้รับการสนับสนุน และชื่อที่แสดงที่เรียกง่าย (ป้ายชื่อ) สําหรับแหล่งข้อมูล
เมื่อสนับสนุน OAuth ข้อกําหนดจะประกอบด้วยฟังก์ชันที่ใช้สัญญา OAuth ซึ่งในกรณีนี้คือ StartLogin
และFinishLogin
//
// Data Source definition
//
GithubSample = [
Authentication = [
OAuth = [
StartLogin = StartLogin,
FinishLogin = FinishLogin
]
],
Label = Extension.LoadString("DataSourceLabel")
];
ขั้นตอนที่ 2 - ให้รายละเอียดเพื่อให้กลไก M สามารถเริ่มต้นโฟลว์ OAuth ได้
โฟลว์ GitHub OAuth เริ่มต้นเมื่อคุณนําผู้ใช้ไปยัง https://github.com/login/oauth/authorize
หน้า
เพื่อให้ผู้ใช้เข้าสู่ระบบ คุณจําเป็นต้องระบุพารามิเตอร์คิวรีจํานวนหนึ่ง:
ชื่อ | ชนิด | คำอธิบาย |
---|---|---|
client_id | string | จำเป็นต้องใช้ ID ไคลเอ็นต์ที่คุณได้รับจาก GitHub เมื่อคุณลงทะเบียน |
redirect_uri | string | URL ในแอปของคุณที่จะส่งผู้ใช้หลังจากการรับรองความถูกต้อง ดูรายละเอียดด้านล่างเกี่ยวกับ URL เปลี่ยนเส้นทาง สําหรับส่วนขยาย redirect_uri M ต้องเป็น "https://oauth.powerbi.com/views/oauthredirect.html" |
ขอบเขต | string | รายการขอบเขตที่คั่นด้วยจุลภาค ถ้าไม่มี ขอบเขตเริ่มต้นจะเป็นรายการขอบเขตที่ว่างเปล่าสําหรับผู้ใช้ที่ไม่มีโทเค็นที่ถูกต้องสําหรับแอป สําหรับผู้ใช้ที่มีโทเค็นที่ถูกต้องสําหรับแอปอยู่แล้ว ผู้ใช้จะไม่แสดงหน้าการอนุญาต OAuth ที่มีรายการขอบเขต แต่ขั้นตอนนี้ของโฟลว์จะเสร็จสมบูรณ์โดยอัตโนมัติด้วยขอบเขตเดียวกันกับที่ใช้ครั้งล่าสุดที่ผู้ใช้ดําเนินการโฟลว์เสร็จสมบูรณ์ |
สถานะ | string | สตริงแบบสุ่มที่ไม่สามารถคาดเดาได้ ซึ่งถูกใช้เพื่อป้องกันการโจมตีจากข้ามไซต์ |
ส่วนย่อยของโค้ดต่อไปนี้อธิบายวิธีการใช้ StartLogin
ฟังก์ชันเพื่อเริ่มโฟลว์การเข้าสู่ระบบ
StartLogin
ฟังก์ชันจะใช้resourceUrl
ค่า , state
และdisplay
ในฟังก์ชัน ให้สร้าง AuthorizeUrl
ที่รวม URL ที่อนุญาต GitHub ด้วยพารามิเตอร์ต่อไปนี้:
client_id
: คุณได้รับ ID ไคลเอ็นต์หลังจากที่คุณลงทะเบียนส่วนขยายของคุณกับ GitHub จากหน้าแอปพลิเคชัน GitHubscope
: ตั้งค่าขอบเขตเป็น "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:
ชื่อ | ชนิด | คำอธิบาย |
---|---|---|
client_id | string | จำเป็นต้องใช้ ID ไคลเอ็นต์ที่คุณได้รับจาก GitHub เมื่อคุณลงทะเบียน |
ข้อมูลลับ_ไคลเอ็นต์ | string | จำเป็นต้องใช้ ข้อมูลลับไคลเอ็นต์ที่คุณได้รับจาก GitHub เมื่อคุณลงทะเบียน |
รหัส | string | จำเป็นต้องใช้ รหัสที่คุณได้รับในFinishLogin |
redirect_uri | string | URL ในแอปของคุณที่จะส่งผู้ใช้หลังจากการรับรองความถูกต้อง ดูรายละเอียดด้านล่างเกี่ยวกับ URL เปลี่ยนเส้นทาง |
ต่อไปนี้เป็นรายละเอียดพารามิเตอร์ที่ใช้สําหรับการเรียกใช้ Web.Contents
อาร์กิวเมนต์ | คำอธิบาย | ค่า |
---|---|---|
URL | URL สําหรับเว็บไซต์ | https://github.com/login/oauth/access_token |
ตัวเลือก | ระเบียนเพื่อควบคุมลักษณะการทํางานของฟังก์ชันนี้ | ไม่ได้ใช้ในกรณีนี้ |
คิวรี | ระบบในการเขียนโปรแกรมเพิ่มพารามิเตอร์คิวรีไปยัง URL | เนื้อหา = Text.ToBinary( โดย
|
ส่วนหัว | ระเบียนที่มีส่วนหัวเพิ่มเติมสําหรับคําขอ HTTP | Headers= [ |
ส่วนย่อยของโค้ดนี้จะอธิบายวิธีการใช้ 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
นี้ยังถูกเผยแพร่ไปยัง UI (อนุญาตให้ปรากฏใน กล่องโต้ตอบรับข้อมูล ) ฟังก์ชัน Value.ReplaceType ถูกใช้เพื่อตั้งค่าพารามิเตอร์ฟังก์ชันเป็น Url.Type
ชนิดโดยกําหนดไว้
ด้วยการเชื่อมโยงฟังก์ชันเหล่านี้กับ GithubSample
ชนิดแหล่งข้อมูล พวกเขาจะใช้ข้อมูลประจําตัวที่ผู้ใช้ให้ไว้โดยอัตโนมัติ ฟังก์ชันไลบรารี M ใด ๆ ที่มีการเปิดใช้งานสําหรับความสามารถในการขยาย (เช่น Web.Contents) จะสืบทอดข้อมูลประจําตัวเหล่านี้โดยอัตโนมัติเช่นกัน
สําหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทํางานข้อมูลประจําตัวและการรับรองความถูกต้อง ดูการจัดการการรับรองความถูกต้อง
URL ตัวอย่าง
ตัวเชื่อมต่อนี้สามารถดึงข้อมูลที่จัดรูปแบบจากจุดสิ้นสุด GitHub v3 REST API ใด ๆ ตัวอย่างเช่น คิวรีที่จะดึงความมุ่งมั่นทั้งหมดไปยังที่เก็บตัวเชื่อมต่อข้อมูลจะมีลักษณะดังนี้:
GithubSample.Contents("https://api.github.com/repos/microsoft/dataconnectors/commits")