다음을 통해 공유


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.

  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 보낼 때 시작됩니다. 사용자가 로그인하려면 여러 쿼리 매개 변수를 지정해야 합니다.

속성 형식 설명
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 , statedisplay 값을 사용합니다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(
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입니다.
헤더 HTTP 요청에 대한 추가 헤더가 있는 레코드입니다. Headers= [
#"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 필드가 포함됩니다. 이 메서드는 TokenMethod Json.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")