GitHub 커넥터 샘플
GitHub M 확장은 OAuth 2.0 프로토콜 인증 흐름에 대한 지원을 추가하는 방법을 보여줍니다. GitHub 개발자 사이트에서 GitHub 인증 흐름 의 세부 사항에 대해 자세히 알아볼 수 있습니다.
M 확장 만들기를 시작하기 전에 GitHub에 새 앱을 등록하고 파일과 client_secret
파일을 앱에 적절한 값으로 바꿔 client_id
야 합니다.
Visual Studio의 호환성 문제에 대한 참고 사항: 파워 쿼리 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가 권한을 성공적으로 인증하고 부여하면 Power BI가 access_token 검색하고 refresh_token 수 있도록 GitHub가 PowerBI의 oauthredirect 엔드포인트로 리디렉션됩니다.
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 애플리케이션 페이지에서 클라이언트 ID 및 클라이언트 암호를 가져옵니다. Data Connector 프로젝트의 파일을 클라이언트 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 | 필수입니다. 등록할 때 GitHub에서 받은 클라이언트 ID입니다. |
redirect_uri | string | 권한 부여 후에 사용자를 보낼 앱의 URL입니다. url 리디렉션에 대한 자세한 내용은 아래를 참조하세요. M 확장의 redirect_uri 경우 "https://oauth.powerbi.com/views/oauthredirect.html"여야 합니다. |
scope | string | 쉼표로 구분된 범위 목록입니다. 제공되지 않은 경우 범위는 기본적으로 앱에 유효한 토큰이 없는 사용자의 빈 범위 목록으로 설정됩니다. 앱에 유효한 토큰이 이미 있는 사용자의 경우 범위 목록이 포함된 OAuth 권한 부여 페이지가 표시되지 않습니다. 대신, 흐름의 이 단계는 사용자가 흐름을 마지막으로 완료했을 때 사용한 것과 동일한 범위로 자동으로 완료됩니다. |
state | string | 추측할 수 없는 임의 문자열입니다. 교차 사이트 요청 위조 공격으로부터 보호하는 데 사용됩니다. |
다음 코드 조각에서는 로그인 흐름을 시작하는 함수를 StartLogin
구현하는 방법을 설명합니다.
함수는 StartLogin
, state
및 display
값을 사용합니다resourceUrl
.
함수에서 GitHub 권한 부여 URL을 다음 매개 변수와 연결하는 함수를 만듭니 AuthorizeUrl
다.
client_id
: GitHub 애플리케이션 페이지에서 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
와 매개 변수의 이전 단계에서 제공한 상태를 사용하여 Power BI 리디렉션 URL로 state
다시 리디렉션됩니다. 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 엔드포인트에는 다음 매개 변수가 필요합니다.
속성 | 형식 | 설명 |
---|---|---|
client_id | string | 필수입니다. 등록할 때 GitHub에서 받은 클라이언트 ID입니다. |
client_secret | string | 필수입니다. 등록할 때 GitHub에서 받은 클라이언트 암호입니다. |
코드 | string | 필수입니다. 에서 받은 코드입니다.FinishLogin |
redirect_uri | string | 권한 부여 후에 사용자를 보낼 앱의 URL입니다. 리디렉션 URL에 대한 자세한 내용은 아래를 참조하세요. |
다음은 Web.Contents 호출에 사용되는 세부 정보 매개 변수입니다 .
인수 | 설명 | 값 |
---|---|---|
URL | 웹 사이트의 URL입니다. | https://github.com/login/oauth/access_token |
options | 이 함수의 동작을 제어하는 레코드입니다. | 이 경우 사용되지 않음 |
쿼리 | 프로그래밍 방식으로 URL에 쿼리 매개 변수를 추가합니다. | Content = Text.ToBinary( Where
|
헤더 | 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.Document를 사용하여 JSON 응답을 M 레코드로 변환하고 엔진에 반환합니다.
샘플 응답:
{
"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 함수는 함수 매개 변수를 ascribed 형식으로 Url.Type
설정하는 데 사용됩니다.
이러한 함수를 데이터 원본 종류와 GithubSample
연결하면 사용자가 제공한 자격 증명을 자동으로 사용합니다. 확장성을 사용하도록 설정된 모든 M 라이브러리 함수(예: Web.Contents)도 이러한 자격 증명을 자동으로 상속합니다.
자격 증명 및 인증의 작동 방식에 대한 자세한 내용은 인증 처리를 참조하세요.
샘플 URL
이 커넥터는 GitHub v3 REST API 엔드포인트에서 형식이 지정된 데이터를 검색할 수 있습니다. 예를 들어 모든 커밋을 데이터 커넥터 리포지토리로 끌어오는 쿼리는 다음과 같습니다.
GithubSample.Contents("https://api.github.com/repos/microsoft/dataconnectors/commits")