Azure Active Directory B2C에서 액세스 토큰 요청

액세스 토큰에는 API에 부여된 권한을 식별하기 위해 Azure AD B2C(Azure Active Directory B2C)에서 사용할 수 있는 클레임이 포함되어 있습니다. 리소스 서버를 호출하려면 HTTP 요청에 액세스 토큰이 포함되어야 합니다. 액세스 토큰은 Azure AD B2C의 응답에서 access_token으로 표시됩니다.

이 문서에서는 웹 애플리케이션 및 Web API에 대한 액세스 토큰을 요청하는 방법을 보여 줍니다. Azure AD B2C의 토큰에 대한 자세한 내용은 Azure Active Directory B2C의 토큰 개요를 참조하세요.

참고 항목

웹 API 체인(On-Behalf-Of)은 Azure AD B2C에서 지원되지 않습니다. - 많은 아키텍처에는 Azure AD B2C로 보호되는 다른 다운스트림 웹 API를 호출해야 하는 웹 API가 포함되어 있습니다. 이 시나리오는 다른 서비스를 호출하는 Web API 백 엔드가 있는 클라이언트에서 일반적입니다. On-Behalf-Of 흐름이라고도 하는 OAuth 2.0 JWT 전달자 자격 증명 권한 부여를 사용하여 이 연결된 웹 API 시나리오를 지원할 수 있습니다. 그러나 On-Behalf-Of 흐름은 현재 Azure AD B2C에 구현되어 있지 않습니다. On-Behalf-Of는 Microsoft Entra AD에 등록된 애플리케이션에서 작동하지만 토큰을 발급하는 테넌트(Microsoft Entra 또는 Azure AD B2C)에 관계없이 Azure AD B2C에 등록된 애플리케이션에는 작동하지 않습니다.

필수 조건

범위

범위는 보호된 리소스에 대한 사용 권한을 관리하는 방법을 제공합니다. 액세스 토큰을 요청할 때 클라이언트 애플리케이션에서 요청의 범위 매개 변수에서 원하는 권한을 지정해야 합니다. 예를 들어 https://contoso.onmicrosoft.com/api앱 ID URI가 있는 API에 대한 범위 값read를 지정하기 위해 범위는 https://contoso.onmicrosoft.com/api/read가 됩니다.

범위는 웹 API에서 범위 기반 액세스 제어를 구현하는 데 사용됩니다. 예를 들어 웹 API 사용자가 읽기 및 쓰기 액세스 권한을 모두 갖고 있을 수도 있고, 읽기 권한만 갖고 있을 수도 있습니다. 같은 요청에 여러 권한을 얻기 위해 요청의 단일 범위 매개 변수에 공백으로 구분된 여러 항목을 추가할 수 있습니다.

다음 예제에서는 URL에서 디코딩된 범위를 보여 줍니다.

scope=https://contoso.onmicrosoft.com/api/read openid offline_access

다음 예제에서는 URL에서 인코딩된 범위를 보여 줍니다.

scope=https%3A%2F%2Fcontoso.onmicrosoft.com%2Fapi%2Fread%20openid%20offline_access

클라이언트 애플리케이션에 부여된 것보다 더 많은 범위가 필요한 경우 하나 이상의 사용 권한이 부여되면 호출이 성공합니다. 결과 액세스 토큰의 scp 클레임은 성공적으로 부여된 권한으로만 채워집니다.

OpenID Connect 범위

OpenID Connect 표준은 몇 가지 특별한 범위 값을 지정합니다. 다음과 같은 범위는 사용자 프로필에 액세스하기 위한 권한을 나타냅니다.

  • openid - ID 토큰을 요청합니다.
  • offline_access - 인증 코드 흐름을 사용하여 새로 고침 토큰을 요청합니다.
  • 00000000-0000-0000-0000-000000000000 - 클라이언트 ID를 범위로 사용할 경우 동일한 클라이언트 ID가 나타내는 사용자 고유의 서비스 또는 웹 API에 대해 사용할 수 있는 액세스 토큰이 앱에 필요합니다.

/authorize 요청의 response_type 매개 변수가 token을 포함하는 경우 scope 매개 변수는 권한이 부여될 하나 이상의 리소스 범위(openidoffline_access 이외)를 포함해야 합니다. 그렇지 않으면 /authorize 요청이 실패합니다.

토큰 요청

액세스 토큰을 요청하려면 인증 코드가 필요합니다. 다음은 인증 코드에 대한 /authorize 엔드포인트에 대한 요청의 예입니다.

GET https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/authorize?
client_id=<application-ID>
&nonce=anyRandomValue
&redirect_uri=https://jwt.ms
&scope=<application-ID-URI>/<scope-name>
&response_type=code

쿼리 문자열의 값을 다음과 같이 바꿉니다.

  • <tenant-name> - Azure AD B2C 테넌트의 이름. 사용자 지정 도메인을 사용하는 경우 tenant-name.b2clogin.com을 도메인(예: contoso.com)으로 바꿉니다.
  • <policy-name> - 사용자 지정 정책 또는 사용자 흐름의 이름.
  • <application-ID> - 사용자 흐름을 지원하기 위해 등록한 웹 애플리케이션의 애플리케이션 식별자
  • <application-ID-URI> - 클라이언트 애플리케이션의 API 노출 블레이드에서 설정한 애플리케이션 식별자 URI입니다.
  • <scope-name> - 클라이언트 애플리케이션의 API 노출 아래에 추가한 범위의 이름입니다.
  • <redirect-uri> - 클라이언트 애플리케이션을 등록할 때 입력한 리디렉션 URI.

요청의 작동 방식을 파악하려면 브라우저에 요청을 붙여넣고 실행합니다.

사용자가 조치를 취하는 흐름의 대화형 부분입니다. 사용자 흐름의 워크플로를 완료하라는 메시지가 표시됩니다. 로그인 양식 또는 다른 여러 단계로 사용자 이름 및 암호를 입력해야 할 수 있습니다. 완료하는 단계는 사용자 흐름이 정의되는 방식에 따라 달라집니다.

인증 코드에 대한 응답은 다음 예제와 유사해야 합니다.

https://jwt.ms/?code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...

인증 코드를 성공적으로 받은 후에는 이 코드를 사용하여 다음과 같이 액세스 토큰을 요청할 수 있습니다. 매개 변수는 HTTP POST 요청의 본문에 있습니다.

POST <tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/token HTTP/1.1
Host: <tenant-name>.b2clogin.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&client_id=<application-ID>
&scope=<application-ID-URI>/<scope-name>
&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...
&redirect_uri=https://jwt.ms
&client_secret=2hMG2-_:y12n10vwH...

이 POST HTTP 요청을 테스트하려면 Microsoft PowerShell 또는 Postman과 같은 HTTP 클라이언트를 사용할 수 있습니다.

성공적인 토큰 응답은 다음과 같습니다.

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrN...",
    "token_type": "Bearer",
    "not_before": 1549647431,
    "expires_in": 3600,
    "expires_on": 1549651031,
    "resource": "f2a76e08-93f2-4350-833c-965c02483b11",
    "profile_info": "eyJ2ZXIiOiIxLjAiLCJ0aWQiOiJjNjRhNGY3ZC0zMDkxLTRjNzMtYTcyMi1hM2YwNjk0Z..."
}

https://jwt.ms를 사용하여 반환된 액세스 토큰을 검사하는 경우 다음 예제와 유사한 내용이 표시되어야 합니다.

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dl..."
}.{
  "iss": "https://contoso0926tenant.b2clogin.com/c64a4f7d-3091-4c73-a7.../v2.0/",
  "exp": 1549651031,
  "nbf": 1549647431,
  "aud": "f2a76e08-93f2-4350-833c-965...",
  "oid": "1558f87f-452b-4757-bcd1-883...",
  "sub": "1558f87f-452b-4757-bcd1-883...",
  "name": "David",
  "tfp": "B2C_1_signupsignin1",
  "nonce": "anyRandomValue",
  "scp": "read",
  "azp": "38307aee-303c-4fff-8087-d8d2...",
  "ver": "1.0",
  "iat": 1549647431
}.[Signature]

다음 단계