OAuth 2.0

이 문서에서는 OAuth 2.0을 설명합니다. 언제 그것을 사용할지 클라이언트 ID를 획득하는 방법, .NET용 Google API 클라이언트 라이브러리와 함께 사용하는 방법을 알아보세요.

OAuth 2.0 프로토콜

OAuth 2.0은 Google API에서 사용하는 승인 프로토콜입니다. 다음 링크를 읽으면 프로토콜을 숙지할 수 있습니다.

클라이언트 ID 및 보안 비밀 가져오기

Google API 콘솔에서 클라이언트 ID와 비밀번호를 가져올 수 있습니다. 클라이언트 ID에는 여러 유형이 있으며 따라서 애플리케이션에 맞는 올바른 유형을 가져와야 합니다.

를 통해 개인정보처리방침을 정의할 수 있습니다. <ph type="x-smartling-placeholder">

아래의 각 코드 스니펫 (서비스 계정 제외)에서 클라이언트 보안 비밀번호를 만들고 프로젝트에 client_secrets.json로 저장합니다.

<ph type="x-smartling-placeholder">

사용자 인증 정보

사용자 인증 정보

UserCredential 드림 는 액세스 토큰을 사용하여 보호된 리소스에 액세스하기 위한 스레드 안전 도우미 클래스입니다. 액세스 토큰은 일반적으로 1시간 후에 만료되므로 그 후에 사용하려고 하면 오류가 발생합니다.

UserCredential 드림 및 AuthorizationCodeFlow 자동으로 '새로고침'하여 다시 말해, 간단히 말하자면 새 액세스 토큰이 생성됩니다 이 작업은 수명이 긴 갱신 토큰과 함께 수신되며 GCP 콘솔에서 access_type=offline 드림 매개변수를 사용하여 이 값을 변경할 수 있습니다.

대부분의 애플리케이션에서는 사용자 인증 정보의 액세스 토큰과 갱신 토큰이 영구 스토리지에 저장됩니다. 그렇지 않으면 최종 사용자에게 인증 페이지가 매시간 브라우저에서 확인될 수 있습니다. 토큰은 받은 후 1시간이 지나면 만료됩니다.

액세스 토큰과 갱신 토큰이 유지되도록 하려면 kubectl 명령어 자체 구현을 제공하여 IDataStore님, 또는 라이브러리에서 제공되는 다음 구현 중 하나를 사용할 수 있습니다.

  • FileDataStore 드림 사용자 인증 정보가 파일에서 영구적이 되도록 합니다.

ServiceAccountCredential

ServiceAccountCredential 드림 UserCredential와 비슷하지만 다른 용도로 사용됩니다. Google OAuth 2.0은 웹 애플리케이션과 Google Cloud Storage 간의 상호작용과 같은 서버 간 상호작용을 지원합니다. 요청하는 애플리케이션은 API에 액세스하기 위해 자체 ID를 증명해야 하며, 최종 사용자는 개입할 필요가 없습니다. ServiceAccountCredential는 새 액세스 토큰을 가져오기 위한 요청에 서명하는 데 사용되는 비공개 키를 저장합니다.

UserCredentialServiceAccountCredential 모두 구현 IConfigurableHttpClientInitializer 각 객체를 다음과 같이 등록할 수 있습니다.

  • 실패한 응답 핸들러 HTTP 401 상태 코드를 받으면 토큰을 새로고침합니다.
  • Authorization를 가로채는 인터셉터 모든 요청에 포함되어 있습니다.

설치된 애플리케이션

Books API를 사용하는 샘플 코드:

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Books.v1;
using Google.Apis.Books.v1.Data;
using Google.Apis.Services;
using Google.Apis.Util.Store;

namespace Books.ListMyLibrary
{
    /// <summary>
    /// Sample which demonstrates how to use the Books API.
    /// https://developers.google.com/books/docs/v1/getting_started
    /// <summary>
    internal class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine("Books API Sample: List MyLibrary");
            Console.WriteLine("================================");
            try
            {
                new Program().Run().Wait();
            }
            catch (AggregateException ex)
            {
                foreach (var e in ex.InnerExceptions)
                {
                    Console.WriteLine("ERROR: " + e.Message);
                }
            }
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }

        private async Task Run()
        {
            UserCredential credential;
            using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
            {
                credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    new[] { BooksService.Scope.Books },
                    "user", CancellationToken.None, new FileDataStore("Books.ListMyLibrary"));
            }

            // Create the service.
            var service = new BooksService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Books API Sample",
                });

            var bookshelves = await service.Mylibrary.Bookshelves.List().ExecuteAsync();
            ...
        }
    }
}
  
  • 이 샘플 코드에서는 다음을 호출하여 새 UserCredential 인스턴스를 만듭니다. GoogleWebAuthorizationBroker.AuthorizeAsync 메서드를 사용하여 지도 가장자리에 패딩을 추가할 수 있습니다. 이 정적 메서드는 다음을 가져옵니다.

    • 클라이언트 보안 비밀번호 (또는 클라이언트 보안 비밀번호에 대한 스트림)
    • 필수 범위
    • 사용자 식별자입니다.
    • 작업을 취소하는 데 사용되는 취소 토큰입니다.
    • 선택적 데이터 저장소입니다. 데이터 스토어가 지정되지 않은 경우 기본값은 FileDataStore입니다. 기본 Google.Apis.Auth 폴더가 표시됩니다. 폴더는 Environment.SpecialFolder.ApplicationData에 생성됩니다.
  • 이 메서드에서 반환하는 UserCredentialHttpClientInitializer로 설정됩니다. ( 이니셜라이저 사용)를 BooksService 사용합니다. 위에서 설명한 것처럼 UserCredentialHTTP 클라이언트 이니셜라이저

  • 위의 샘플 코드에서는 클라이언트 보안 비밀 정보가 파일에서 로드되어 다음과 같은 작업도 할 수 있습니다.

    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
        new ClientSecrets
        {
            ClientId = "PUT_CLIENT_ID_HERE",
            ClientSecret = "PUT_CLIENT_SECRETS_HERE"
        },
        new[] { BooksService.Scope.Books },
        "user",
        CancellationToken.None,
        new FileDataStore("Books.ListMyLibrary"));
          

도서 샘플을 살펴보세요.

웹 애플리케이션 (ASP.NET Core 3)

Google API 지원 <ph type="x-smartling-placeholder"></ph> 웹 서버 애플리케이션용 OAuth 2.0을 참조하세요.

Google.Apis.Auth.AspNetCore3은 대부분의 Google 기반 ASP.NET Core 3 애플리케이션의 OAuth 2.0 시나리오 이는 Google만의 OpenIdConnect 인증 핸들러 증분 인증을 지원하고 삽입할 수 있는 IGoogleAuthProvider: Google API와 함께 사용할 수 있는 Google 사용자 인증 정보를 제공합니다.

이 섹션에서는 Google.Apis.Auth.AspNetCore3을 구성하고 사용하는 방법을 설명합니다. 표시된 코드 기반으로 한 <ph type="x-smartling-placeholder"></ph> Google.Apis.Auth.AspNetCore3.IntegrationTests: 완벽하게 작동하는 표준 ASP.NET Core 3 애플리케이션입니다.

이 문서를 튜토리얼로 따르려면 자체 ASP.NET이 필요합니다. Core 3 애플리케이션을 실행하고 이 단계를 선행 조건으로 완료해야 합니다.

기본 요건

  • 설치 <ph type="x-smartling-placeholder"></ph> Google.Apis.Auth.AspNetCore3 패키지에서 사용자를 로드합니다.
  • Google Drive API를 사용하므로 kubectl apply 명령어를 Google.Apis.Drive.v3 패키지에서 찾을 수 있습니다.
  • Google Cloud 프로젝트가 없으면 프로젝트를 만듭니다. 팔로우 <ph type="x-smartling-placeholder"></ph> 이 안내를 따르세요. 앱이 식별되는 프로젝트가 됩니다.
  • Google Drive API를 사용 설정해야 합니다. API를 사용 설정하려면 <ph type="x-smartling-placeholder"></ph> 이 안내를 참고하세요.
  • Google이 앱을 식별하는 승인 사용자 인증 정보를 만듭니다. 팔로우 <ph type="x-smartling-placeholder"></ph> 이 안내에 따라 승인 사용자 인증 정보를 만들고 client_secrets.json 파일 두 가지 주요 기능: <ph type="x-smartling-placeholder">
      </ph>
    • 사용자 인증 정보의 유형은 Web application이어야 합니다.
    • 이 앱을 실행하기 위해 추가해야 하는 유일한 리디렉션 URI는 https://localhost:5001/signin-oidc

Google.Apis.Auth.AspNetCore3을 사용하도록 애플리케이션 구성

Google.Apis.Auth.AspNetCore3은 Startup 클래스 또는 이와 유사한 위치에서 구성됩니다. 를 사용하는 것이 좋습니다. 다음 스니펫은 <ph type="x-smartling-placeholder"></ph> Google.Apis.Auth.AspNetCore3.IntegrationTests 프로젝트의 Startup.cs

  • Startup.cs 파일에 다음 using 지시문을 추가합니다.
    using Google.Apis.Auth.AspNetCore3;
  • Startup.ConfigureServices 메서드에서 다음 코드를 추가하고 client_secrets.json 파일. JSON 파일에서 직접 이러한 값을 로드할 수 있습니다. 또는 다른 안전한 방법으로 저장할 수 있습니다. 자세한 내용은 <ph type="x-smartling-placeholder"></ph> Google.Apis.Auth.AspNetCore3.IntegrationTests의 ClientInfo.Load 메서드 프로젝트를 참조하세요.
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    
        // This configures Google.Apis.Auth.AspNetCore3 for use in this app.
        services
            .AddAuthentication(o =>
            {
                // This forces challenge results to be handled by Google OpenID Handler, so there's no
                // need to add an AccountController that emits challenges for Login.
                o.DefaultChallengeScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme;
                // This forces forbid results to be handled by Google OpenID Handler, which checks if
                // extra scopes are required and does automatic incremental auth.
                o.DefaultForbidScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme;
                // Default scheme that will handle everything else.
                // Once a user is authenticated, the OAuth2 token info is stored in cookies.
                o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddCookie()
            .AddGoogleOpenIdConnect(options =>
            {
                options.ClientId = {YOUR_CLIENT_ID};
                options.ClientSecret = {YOUR_CLIENT_SECRET};
            });
    }
          
  • Startup.Configure 메서드에서 ASP.NET Core 3 인증을 추가해야 합니다. 승인 미들웨어 구성요소를 파이프라인에 대한
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        ...
        app.UseHttpsRedirection();
        ...
    
        app.UseAuthentication();
        app.UseAuthorization();
    
        ...
    }
          
    드림 <ph type="x-smartling-placeholder">

사용자 인증 정보를 사용하여 사용자 대신 Google API에 액세스

이제 사용자 인증 정보가 필요한 작업 메서드를 컨트롤러에 추가할 준비가 되었습니다. Google API에 액세스할 수 있습니다 다음 스니펫은 Google Drive 계정에 로그인해야 합니다. 주로 다음 두 가지를 확인하세요.

  • 사용자는 인증되어야 할 뿐 아니라 https://www.googleapis.com/auth/drive.readonly 범위를 애플리케이션에 할당합니다. GoogleScopedAuthorize 속성을 통해 지정할 수 있습니다.
  • 우리는 ASP.NET Core 3의 표준 종속성 주입 메커니즘을 사용하여 IGoogleAuthProvider: 사용자 인증 정보를 가져오는 데 사용합니다.

코드:

  • 먼저 컨트롤러에 다음 using 지시문을 추가합니다.
    using Google.Apis.Auth.AspNetCore3;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Drive.v3;
    using Google.Apis.Services;
          
  • 다음과 같이 컨트롤러 작업을 추가하고 간단한 뷰와 함께 IList<string> 모델을 수신하는 경우).
    /// <summary>
    /// Lists the authenticated user's Google Drive files.
    /// Specifying the <see cref="GoogleScopedAuthorizeAttribute"> will guarantee that the code
    /// executes only if the user is authenticated and has granted the scope specified in the attribute
    /// to this application.
    /// </summary>
    /// <param name="auth">The Google authorization provider.
    /// This can also be injected on the controller constructor.</param>
    [GoogleScopedAuthorize(DriveService.ScopeConstants.DriveReadonly)]
    public async Task<IActionResult> DriveFileList([FromServices] IGoogleAuthProvider auth)
    {
        GoogleCredential cred = await auth.GetCredentialAsync();
        var service = new DriveService(new BaseClientService.Initializer
        {
            HttpClientInitializer = cred
        });
        var files = await service.Files.List().ExecuteAsync();
        var fileNames = files.Files.Select(x => x.Name).ToList();
        return View(fileNames);
    }
          

이것으로 기본입니다. 자세한 내용은 <ph type="x-smartling-placeholder"></ph> Google.Apis.Auth.AspNetCore3.IntegrationTests 프로젝트의 HomeController.cs 다음 목표를 달성하는 방법을 알아보세요.

  • 사용자 인증만(특정 범위 없음)
  • 로그아웃 기능
  • 코드를 통한 점진적 승인 위의 스니펫은 속성을 통한 승인입니다.
  • 현재 부여된 범위 검토
  • 액세스 및 갱신 토큰 검사
  • 액세스 토큰을 강제로 새로고침합니다. 이 작업을 직접 하지 않아도 됩니다. Google.Apis.Auth.AspNetCore3은 액세스 토큰이 만료되었거나 곧 만료되는지 감지합니다. 자동으로 새로고침됩니다

서비스 계정

또한 Google API는 서비스 계정. 클라이언트 애플리케이션이 최종 사용자의 데이터에 대한 액세스를 요청하는 시나리오와 달리 서비스 계정을 통해 클라이언트 애플리케이션의 자체 데이터에 액세스할 수 있습니다.

클라이언트 애플리케이션은 다운로드한 비공개 키를 사용하여 액세스 토큰 요청에 서명합니다. Google API 콘솔에서 찾을 수 있습니다. 새 클라이언트 ID를 만든 후 '서비스 계정'을 선택해야 합니다. 비공개 키를 다운로드할 수 있습니다. 자세한 내용은 <ph type="x-smartling-placeholder"></ph> Google Plus API를 사용하는 서비스 계정 샘플을 참고하세요.

using System;
using System.Security.Cryptography.X509Certificates;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Plus.v1;
using Google.Apis.Plus.v1.Data;
using Google.Apis.Services;

namespace Google.Apis.Samples.PlusServiceAccount
{
    /// <summary>
    /// This sample demonstrates the simplest use case for a Service Account service.
    /// The certificate needs to be downloaded from the Google API Console
    /// <see cref="https://console.cloud.google.com/">
    ///   "Create another client ID..." -> "Service Account" -> Download the certificate,
    ///   rename it as "key.p12" and add it to the project. Don't forget to change the Build action
    ///   to "Content" and the Copy to Output Directory to "Copy if newer".
    /// </summary>
    public class Program
    {
        // A known public activity.
        private static String ACTIVITY_ID = "z12gtjhq3qn2xxl2o224exwiqruvtda0i";

        public static void Main(string[] args)
        {
            Console.WriteLine("Plus API - Service Account");
            Console.WriteLine("==========================");

            String serviceAccountEmail = "SERVICE_ACCOUNT_EMAIL_HERE";

            var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.Exportable);

            ServiceAccountCredential credential = new ServiceAccountCredential(
               new ServiceAccountCredential.Initializer(serviceAccountEmail)
               {
                   Scopes = new[] { PlusService.Scope.PlusMe }
               }.FromCertificate(certificate));

            // Create the service.
            var service = new PlusService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "Plus API Sample",
            });

            Activity activity = service.Activities.Get(ACTIVITY_ID).Execute();
            Console.WriteLine("  Activity: " + activity.Object.Content);
            Console.WriteLine("  Video: " + activity.Object.Attachments[0].Url);

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }
    }
}

위의 샘플 코드는 ServiceAccountCredential 필수 범위가 설정되었으며 FromCertificate 호출이 있습니다. 이 메서드는 지정된 X509Certificate2에서 비공개 키를 로드합니다. 다른 모든 샘플 코드와 마찬가지로 사용자 인증 정보는 HttpClientInitializer로 설정됩니다.