OAuth 2.0

এই নথিটি OAuth 2.0, কখন এটি ব্যবহার করতে হবে, কীভাবে ক্লায়েন্ট আইডি অর্জন করতে হবে এবং .NET-এর জন্য Google API ক্লায়েন্ট লাইব্রেরির সাথে কীভাবে এটি ব্যবহার করতে হবে তা বর্ণনা করে।

OAuth 2.0 প্রোটোকল

OAuth 2.0 হল Google API দ্বারা ব্যবহৃত অনুমোদন প্রোটোকল। নিম্নলিখিত লিঙ্কগুলি পড়ে আপনাকে প্রোটোকলের সাথে পরিচিত হওয়া উচিত:

ক্লায়েন্ট আইডি এবং গোপনীয়তা অর্জন করা

আপনি Google API কনসোলে ক্লায়েন্ট আইডি এবং গোপনীয়তা পেতে পারেন। বিভিন্ন ধরনের ক্লায়েন্ট আইডি আছে, তাই আপনার আবেদনের জন্য সঠিক ধরন পেতে ভুলবেন না:

নিচের প্রতিটি কোড স্নিপেটে (পরিষেবা অ্যাকাউন্টের একটি ছাড়া), আপনাকে ক্লায়েন্ট সিক্রেট ডাউনলোড করতে হবে এবং আপনার প্রোজেক্টে client_secrets.json হিসেবে সংরক্ষণ করতে হবে।

শংসাপত্র

ব্যবহারকারীর শংসাপত্র

UserCredential হল একটি থ্রেড-সেফ হেল্পার ক্লাস যা সুরক্ষিত রিসোর্স অ্যাক্সেস করতে অ্যাক্সেস টোকেন ব্যবহার করে। একটি অ্যাক্সেস টোকেন সাধারণত 1 ঘন্টা পরে মেয়াদ শেষ হয়, তারপরে আপনি এটি ব্যবহার করার চেষ্টা করলে আপনি একটি ত্রুটি পাবেন।

UserCredential এবং AuthorizationCodeFlow টোকেন স্বয়ংক্রিয়ভাবে "রিফ্রেশ" করার যত্ন নেয়, যার সহজ অর্থ হল একটি নতুন অ্যাক্সেস টোকেন পাওয়া। এটি একটি দীর্ঘস্থায়ী রিফ্রেশ টোকেন ব্যবহার করে করা হয়, যা আপনি অ্যাক্সেস টোকেনের সাথে পাবেন যদি আপনি অনুমোদন কোড প্রবাহের সময় access_type=offline প্যারামিটার ব্যবহার করেন।

বেশিরভাগ অ্যাপ্লিকেশনে, ক্রেডেনশিয়ালের অ্যাক্সেস টোকেন সংরক্ষণ করা এবং ক্রমাগত স্টোরেজে টোকেন রিফ্রেশ করার পরামর্শ দেওয়া হয়। অন্যথায়, আপনাকে প্রতি ঘন্টায় ব্রাউজারে একটি অনুমোদন পৃষ্ঠা সহ শেষ ব্যবহারকারীকে উপস্থাপন করতে হবে, কারণ অ্যাক্সেস টোকেনটি আপনি পাওয়ার এক ঘন্টা পরে মেয়াদ শেষ হয়ে যায়।

অ্যাক্সেস এবং রিফ্রেশ টোকেনগুলি বজায় থাকে তা নিশ্চিত করতে, আপনি IDataStore এর নিজস্ব বাস্তবায়ন প্রদান করতে পারেন, অথবা আপনি লাইব্রেরি দ্বারা প্রদত্ত নিম্নলিখিত বাস্তবায়নগুলির মধ্যে একটি ব্যবহার করতে পারেন:

  • .NET-এর জন্য FileDataStore নিশ্চিত করে যে শংসাপত্রটি একটি ফাইলে স্থায়ী হবে।

সার্ভিস অ্যাকাউন্ট ক্রেডেনশিয়াল

ServiceAccountCredential UserCredential এর অনুরূপ, কিন্তু এটি একটি ভিন্ন উদ্দেশ্য পরিবেশন করে। Google OAuth 2.0 সার্ভার-টু-সার্ভার ইন্টারঅ্যাকশনকে সমর্থন করে যেমন একটি ওয়েব অ্যাপ্লিকেশন এবং Google ক্লাউড স্টোরেজের মধ্যে। অনুরোধকারী অ্যাপ্লিকেশনটিকে একটি API-তে অ্যাক্সেস পেতে তার নিজস্ব পরিচয় প্রমাণ করতে হবে এবং শেষ ব্যবহারকারীকে জড়িত হতে হবে না। ServiceAccountCredential একটি ব্যক্তিগত কী সঞ্চয় করে, যা একটি নতুন অ্যাক্সেস টোকেন পাওয়ার জন্য একটি অনুরোধ স্বাক্ষর করতে ব্যবহৃত হয়।

UserCredential এবং ServiceAccountCredential উভয়ই IConfigurableHttpClientInitializer প্রয়োগ করে যাতে আপনি এইগুলির প্রত্যেকটিকে নিবন্ধন করতে পারেন:

  • একটি অসফল প্রতিক্রিয়া হ্যান্ডলার, তাই এটি টোকেন রিফ্রেশ করবে যদি এটি একটি HTTP 401 স্ট্যাটাস কোড পায়।
  • একটি ইন্টারসেপ্টর, প্রতিটি অনুরোধে Authorization শিরোনাম আটকাতে।

ইনস্টল করা অ্যাপ্লিকেশন

বই 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();
            ...
        }
    }
}
  
  • এই নমুনা কোডে GoogleWebAuthorizationBroker.AuthorizeAsync পদ্ধতিতে কল করে একটি নতুন UserCredential উদাহরণ তৈরি করা হয়েছে। এই স্ট্যাটিক পদ্ধতি নিম্নলিখিত পায়:

    • ক্লায়েন্ট সিক্রেট (বা ক্লায়েন্ট সিক্রেটের জন্য একটি স্ট্রিম)।
    • প্রয়োজনীয় স্কোপ।
    • ব্যবহারকারী শনাক্তকারী।
    • একটি অপারেশন বাতিল করার জন্য বাতিলকরণ টোকেন।
    • একটি ঐচ্ছিক ডেটা স্টোর। যদি ডেটা স্টোর নির্দিষ্ট করা না থাকে, ডিফল্ট Google.Apis.Auth ফোল্ডার সহ একটি FileDataStore । ফোল্ডারটি Environment.SpecialFolder.ApplicationData এ তৈরি করা হয়েছে।
  • এই পদ্ধতিতে যে UserCredential ফেরত দেওয়া হয় তা BooksServiceHttpClientInitializer হিসেবে সেট করা হয় (ইনিশিয়ালাইজার ব্যবহার করে)। উপরে ব্যাখ্যা করা হয়েছে, UserCredential একটি HTTP ক্লায়েন্ট ইনিশিয়ালাইজার প্রয়োগ করে।

  • লক্ষ্য করুন যে উপরের নমুনা কোডে, ক্লায়েন্টের গোপন তথ্য একটি ফাইল থেকে লোড করা হয়েছে, তবে আপনি নিম্নলিখিতগুলিও করতে পারেন:

    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 কোর 3)

Google APIs ওয়েব সার্ভার অ্যাপ্লিকেশনের জন্য OAuth 2.0 সমর্থন করে।

Google.Apis.Auth.AspNetCore3 হল ASP.NET কোর 3 অ্যাপ্লিকেশনে বেশিরভাগ Google ভিত্তিক OAuth 2.0 পরিস্থিতিতে ব্যবহারের জন্য প্রস্তাবিত লাইব্রেরি৷ এটি একটি Google-নির্দিষ্ট OpenIdConnect auth হ্যান্ডলার প্রয়োগ করে। এটি ক্রমবর্ধমান প্রমাণীকরণ সমর্থন করে এবং Google এপিআই-এর সাথে ব্যবহার করা যেতে পারে এমন Google শংসাপত্র সরবরাহ করার জন্য একটি ইনজেকশনযোগ্য IGoogleAuthProvider সংজ্ঞায়িত করে।

এই বিভাগটি কীভাবে Google.Apis.Auth.AspNetCore3 কনফিগার এবং ব্যবহার করতে হয় তা বর্ণনা করে। এখানে দেখানো কোডটি Google.Apis.Auth.AspNetCore3.IntegrationTests- এর উপর ভিত্তি করে যা সম্পূর্ণরূপে কার্যকরী, আদর্শ ASP.NET কোর 3 অ্যাপ্লিকেশন।

আপনি যদি এই ডকুমেন্টেশনটিকে একটি টিউটোরিয়াল হিসাবে অনুসরণ করতে চান, তাহলে আপনার নিজের ASP.NET Core 3 অ্যাপ্লিকেশনের প্রয়োজন হবে এবং পূর্বশর্ত হিসাবে এই পদক্ষেপগুলি সম্পূর্ণ করতে হবে।

পূর্বশর্ত

  • Google.Apis.Auth.AspNetCore3 প্যাকেজ ইনস্টল করুন।
  • আমরা Google Drive API ব্যবহার করছি তাই আপনাকে Google.Apis.Drive.v3 প্যাকেজ ইনস্টল করতে হবে।
  • আপনার যদি ইতিমধ্যে না থাকে তবে একটি Google ক্লাউড প্রকল্প তৈরি করুন৷ এটি করতে এই নির্দেশাবলী অনুসরণ করুন. এটি এমন একটি প্রকল্প হবে যার সাথে আপনার অ্যাপটি চিহ্নিত করা হয়েছে।
  • Google ড্রাইভ এপিআই সক্ষম করা নিশ্চিত করুন। API সক্রিয় করতে, এই নির্দেশাবলী অনুসরণ করুন।
  • অনুমোদনের শংসাপত্র তৈরি করুন যা Google-এ আপনার অ্যাপকে শনাক্ত করবে। অনুমোদনের শংসাপত্র তৈরি করতে এবং client_secrets.json ফাইলটি ডাউনলোড করতে এই নির্দেশাবলী অনুসরণ করুন। দুটি হাইলাইট:
    • লক্ষ্য করুন যে শংসাপত্রের ধরন অবশ্যই ওয়েব অ্যাপ্লিকেশন হতে হবে।
    • এই অ্যাপটি চালানোর জন্য, আপনাকে শুধুমাত্র পুনঃনির্দেশিত URI যোগ করতে হবে তা হল https://localhost:5001/signin-oidc

Google.Apis.Auth.AspNetCore3 ব্যবহার করতে আপনার অ্যাপ্লিকেশন কনফিগার করুন৷

Google.Apis.Auth.AspNetCore3 Startup ক্লাসে কনফিগার করা হয়েছে বা আপনি হয়তো ব্যবহার করছেন এমন বিকল্প। নিম্নলিখিত স্নিপেটগুলি Google.Apis.Auth.AspNetCore3.IntegrationTests প্রকল্পের Startup.cs থেকে নেওয়া হয়েছে৷

  • আপনার Startup.cs ফাইলে নির্দেশিকা ব্যবহার করে নিম্নলিখিত যোগ করুন।
    using Google.Apis.Auth.AspNetCore3;
  • Startup.ConfigureServices পদ্ধতিতে নিম্নলিখিত কোড যোগ করুন, client_secrets.json ফাইলে থাকা মানগুলির সাথে ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট স্থানধারক পরিবর্তন করুন। আপনি এই মানগুলি সরাসরি JSON ফাইল থেকে লোড করতে পারেন বা আপনি সেগুলিকে অন্য কোনও নিরাপদ উপায়ে সংরক্ষণ করতে পারেন৷ JSON ফাইল থেকে সরাসরি এই মানগুলি কীভাবে লোড করা যায় তার উদাহরণের জন্য 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 প্রমাণীকরণ এবং অনুমোদন মিডলওয়্যার উপাদানগুলিকে পাইপলাইনে যোগ করা নিশ্চিত করুন, সেইসাথে HTTPS পুনর্নির্দেশগুলি:
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        ...
        app.UseHttpsRedirection();
        ...
    
        app.UseAuthentication();
        app.UseAuthorization();
    
        ...
    }
          

তাদের পক্ষে Google API অ্যাক্সেস করতে ব্যবহারকারীর শংসাপত্র ব্যবহার করুন৷

আপনি এখন আপনার কন্ট্রোলারগুলিতে অ্যাকশন পদ্ধতিগুলি যোগ করতে প্রস্তুত যার জন্য তাদের পক্ষে Google API অ্যাক্সেস করার জন্য ব্যবহারকারীর শংসাপত্র প্রয়োজন৷ নিম্নলিখিত স্নিপেটটি প্রমাণীকৃত ব্যবহারকারীর Google ড্রাইভ অ্যাকাউন্টে ফাইলগুলিকে কীভাবে তালিকাভুক্ত করতে হয় তা দেখায়৷ প্রধানত দুটি জিনিস লক্ষ্য করুন:

  • ব্যবহারকারীকে শুধুমাত্র প্রমাণীকরণ করতে হবে না, তবে তাদের আপনার অ্যাপ্লিকেশনে https://www.googleapis.com/auth/drive.readonly সুযোগ মঞ্জুর করতে হবে, যা আপনি GoogleScopedAuthorize বৈশিষ্ট্যের মাধ্যমে নির্দিষ্ট করেছেন।
  • আমরা একটি IGoogleAuthProvider পাওয়ার জন্য ASP.NET Core 3-এর স্ট্যান্ডার্ড ডিপেন্ডেন্সি ইনজেকশন মেকানিজম ব্যবহার করছি যা আমরা ব্যবহারকারীর শংসাপত্রগুলি পেতে ব্যবহার করি।

কোড:

  • প্রথমে আপনার কন্ট্রোলারে নির্দেশাবলী ব্যবহার করে নিম্নলিখিত যোগ করুন।
    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);
    }
          

এবং এই মৌলিক. আপনি কিভাবে অর্জন করতে পারেন তা জানতে আপনি Google.Apis.Auth.AspNetCore3.IntegrationTests প্রকল্প থেকে HomeController.cs এ একবার দেখে নিতে পারেন:

  • শুধুমাত্র ব্যবহারকারীর প্রমাণীকরণ, কোনো নির্দিষ্ট সুযোগ নেই
  • লগআউট কার্যকারিতা
  • কোডের মাধ্যমে ক্রমবর্ধমান অনুমোদন। লক্ষ্য করুন যে উপরের স্নিপেটটি বৈশিষ্ট্যগুলির মাধ্যমে ক্রমবর্ধমান অনুমোদন দেখায়।
  • বর্তমানে প্রদত্ত সুযোগগুলি পরীক্ষা করুন
  • এক্সেস পরীক্ষা করুন এবং টোকেন রিফ্রেশ করুন
  • অ্যাক্সেস টোকেন জোর করে রিফ্রেশ করুন। লক্ষ্য করুন যে আপনাকে এটি নিজে করতে হবে না কারণ Google.Apis.Auth.AspNetCore3 সনাক্ত করবে যে অ্যাক্সেস টোকেনের মেয়াদ শেষ হয়ে গেছে বা মেয়াদ শেষ হওয়ার কাছাকাছি এবং এটি স্বয়ংক্রিয়ভাবে রিফ্রেশ হবে।

পরিষেবা অ্যাকাউন্ট

Google APIগুলি পরিষেবা অ্যাকাউন্টগুলিকেও সমর্থন করে৷ একটি ক্লায়েন্ট অ্যাপ্লিকেশন একটি শেষ-ব্যবহারকারীর ডেটাতে অ্যাক্সেসের অনুরোধ করে এমন দৃশ্যের বিপরীতে, পরিষেবা অ্যাকাউন্টগুলি ক্লায়েন্ট অ্যাপ্লিকেশনের নিজস্ব ডেটাতে অ্যাক্সেস প্রদান করে।

আপনার ক্লায়েন্ট অ্যাপ্লিকেশন Google API কনসোল থেকে ডাউনলোড করা একটি ব্যক্তিগত কী ব্যবহার করে অ্যাক্সেস টোকেনের অনুরোধে স্বাক্ষর করে। একটি নতুন ক্লায়েন্ট আইডি তৈরি করার পরে, আপনার একটি "পরিষেবা অ্যাকাউন্ট" অ্যাপ্লিকেশনের ধরন বেছে নেওয়া উচিত এবং তারপরে আপনি ব্যক্তিগত কী ডাউনলোড করতে পারেন। 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 হিসাবে সেট করা হয়েছে।