다음을 통해 공유


GitHub 커넥터 샘플

GitHub M 확장은 OAuth 2.0 프로토콜 인증 흐름에 대한 지원을 추가하는 방법을 보여줍니다. GitHub Docs 사이트에서 GitHub 인증 흐름의 세부 사항에 대해 자세히 알아볼 수 있습니다.

M 확장을 만들기 시작하기 전에, GitHub에 새 앱을 등록하고 client_idclient_secret 파일을 앱에 적합한 값으로 교체해야 합니다.

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가 성공적으로 인증하고 권한을 부여하면 GitHub는 Power BI가 access_token 검색하고 refresh_token 수 있도록 Power BI의 oauthredirect 엔드포인트로 리디렉션됩니다.

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 애플리케이션 페이지에서 클라이언트 ID 및 클라이언트 암호를 가져옵니다. Data Connector 프로젝트의 파일을 클라이언트 ID(파일) 및 클라이언트 암호(client_idclient_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")
];

2단계 - M 엔진이 OAuth 흐름을 시작할 수 있도록 세부 정보 제공

GitHub OAuth 흐름은 사용자를 페이지로 https://github.com/login/oauth/authorize 보낼 때 시작됩니다. 사용자가 로그인하려면 여러 쿼리 매개 변수를 지정해야 합니다.

이름 유형 Description
클라이언트_아이디 문자열 필수. 등록할 때 GitHub에서 받은 클라이언트 ID입니다.
리다이렉트_URI 문자열 권한 부여 후에 사용자를 보낼 앱의 URL입니다. 리디렉션 URL에 대한 자세한 내용은 다음을 참조하세요. M 확장의 redirect_uri 경우 "https://oauth.powerbi.com/views/oauthredirect.html"여야 합니다.
scope 문자열 쉼표로 구분된 범위 목록입니다. 제공되지 않은 경우 범위는 기본적으로 앱에 유효한 토큰이 없는 사용자의 빈 범위 목록으로 설정됩니다. 앱에 유효한 토큰이 이미 있는 사용자의 경우 범위 목록이 포함된 OAuth 권한 부여 페이지가 표시되지 않습니다. 대신, 흐름의 이 단계는 사용자가 흐름을 마지막으로 완료했을 때 사용한 것과 동일한 범위로 자동으로 완료됩니다.
문자열 추측할 수 없는 임의 문자열입니다. 교차 사이트 요청 위조 공격으로부터 보호하는 데 사용됩니다.

다음 코드 조각에서는 로그인 흐름을 시작하는 함수를 StartLogin 구현하는 방법을 설명합니다. 함수는 StartLogin, resourceUrl, statedisplay 값을 사용합니다. 함수 내에서 다음 매개 변수와 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 매개변수와 이전 단계에서 제공한 상태가 포함된 state 매개변수를 사용하여 Power BI 리디렉션 URL로 다시 리디렉션합니다. 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
클라이언트_아이디 문자열 필수. 등록할 때 GitHub에서 받은 클라이언트 ID입니다.
클라이언트 비밀번호 문자열 필수. 등록할 때 GitHub에서 받은 클라이언트 암호입니다.
코드 문자열 필수. 받으신 코드는 FinishLogin.
리다이렉트_URI 문자열 권한 부여 후에 사용자를 보낼 앱의 URL입니다. 리디렉션 URL에 대한 자세한 내용은 다음을 참조하세요.

다음은 Web.Contents 호출에 사용되는 세부 정보 매개 변수입니다.

Argument Description 가치
url 웹 사이트의 URL입니다. https://github.com/login/oauth/access_token
options 이 함수의 동작을 제어하는 레코드입니다. 이 경우 사용되지 않음
쿼리 프로그래밍 방식으로 URL에 쿼리 매개 변수를 추가합니다. Content = Text.ToBinary(
Uri.BuildQueryString(
[
client_id = client_id,
client_secret = client_secret,
code = code,
redirect_uri = redirect_uri
]
))

Where
  • client_id: GitHub 애플리케이션 페이지의 클라이언트 ID입니다.
  • client_secret: GitHub 애플리케이션 페이지의 클라이언트 암호입니다.
  • code: GitHub 권한 부여 응답의 코드입니다.
  • redirect_uri: 권한 부여 후에 사용자를 보낼 앱의 URL입니다.
Headers HTTP 요청에 대한 추가 헤더가 있는 레코드입니다. 헤더= [
#"Content-type" = "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 필드가 포함됩니다. 이 메서드는 TokenMethodJson.Document를 사용하여 JSON 응답을 M 레코드로 변환하고 엔진에 반환합니다.

샘플 응답:

{
    "access_token":"e72e16c7e42f292c6912e7710c838347ae178b4a",
    "scope":"user,repo",
    "token_type":"bearer"
}

4단계 - GitHub API에 액세스하는 함수 정의

다음 코드 조각은 두 함수(GithubSample.ContentsGithubSample.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")