একটি ব্যাকএন্ড সার্ভারের সাথে প্রমাণীকরণ করুন

আপনি যদি কোনও অ্যাপ্লিকেশন বা সাইটের সাথে গুগল সাইন-ইন ব্যবহার করেন যা ব্যাকএন্ড সার্ভারের সাথে যোগাযোগ করে, আপনি সার্ভারে সাইন ইন থাকা ব্যবহারকারীকে চিহ্নিত করার প্রয়োজন হতে পারে। নিরাপদে এটি করতে, কোনও ব্যবহারকারী সফলভাবে সাইন ইন করার পরে, এইচটিটিপিএস ব্যবহার করে ব্যবহারকারীর আইডি টোকেনটি আপনার সার্ভারে প্রেরণ করুন। তারপরে, সার্ভারে, আইডি টোকেনের অখণ্ডতা যাচাই করুন এবং একটি সেশন স্থাপন করতে বা একটি নতুন অ্যাকাউন্ট তৈরি করতে টোকেনে থাকা ব্যবহারকারী তথ্য ব্যবহার করুন।

আপনার সার্ভারে আইডি টোকেন প্রেরণ করুন

প্রথমে, ব্যবহারকারী সাইন ইন করার পরে, তাদের আইডি টোকেন পান:

  1. আপনি গুগল সাইন-ইন কনফিগার করার সময়, requestIdToken পদ্ধতিতে কল করুন এবং এটি আপনার সার্ভারের ওয়েব ক্লায়েন্ট আইডি পাস করুন।

    // Request only the user's ID token, which can be used to identify the
    // user securely to your backend. This will contain the user's basic
    // profile (name, profile picture URL, etc) so you should not need to
    // make an additional call to personalize your application.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.server_client_id))
            .requestEmail()
            .build();
  2. আপনার অ্যাপ্লিকেশনটি শুরু হয়ে গেলে, ব্যবহারকারী ইতিমধ্যে silentSignIn ফোন করে এই ডিভাইস বা অন্য কোনও ডিভাইসে গুগল ব্যবহার করে আপনার অ্যাপটিতে ইতিমধ্যে সাইন ইন করেছে silentSignIn :

    GoogleSignIn.silentSignIn()
        .addOnCompleteListener(
            this,
            new OnCompleteListener<GoogleSignInAccount>() {
              @Override
              public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                handleSignInResult(task);
              }
            });
  3. ব্যবহারকারী চুপটি সাইন ইন করতে না পারেন, আপনার স্বাভাবিক সাইন আউট অভিজ্ঞতা উপস্থাপন, ব্যবহারকারী সাইন ইন করতে বিকল্প দান ব্যবহারকারী যখন। সাইন ইন , ব্যবহারকারীর পেতে GoogleSignInAccount সাইন-ইন অভিপ্রায় কার্যকলাপ ফলাফলে:

    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
  4. ব্যবহারকারী নিঃশব্দে বা স্পষ্টভাবে সাইন ইন করার পরে, GoogleSignInAccount থেকে আইডি টোকেন পান:

    private void handleSignInResult(@NonNull Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            String idToken = account.getIdToken();
    
            // TODO(developer): send ID Token to server and validate
    
            updateUI(account);
        } catch (ApiException e) {
            Log.w(TAG, "handleSignInResult:error", e);
            updateUI(null);
        }
    }

তারপরে, এইচটিটিপিএস পোস্ট অনুরোধের সাথে আপনার সার্ভারে আইডি টোকেনটি প্রেরণ করুন:

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

try {
  List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
  nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
  httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

  HttpResponse response = httpClient.execute(httpPost);
  int statusCode = response.getStatusLine().getStatusCode();
  final String responseBody = EntityUtils.toString(response.getEntity());
  Log.i(TAG, "Signed in as: " + responseBody);
} catch (ClientProtocolException e) {
  Log.e(TAG, "Error sending ID token to backend.", e);
} catch (IOException e) {
  Log.e(TAG, "Error sending ID token to backend.", e);
}

আইডি টোকেনটির অখণ্ডতা যাচাই করুন

আপনি এইচটিটিপিএস পোস্ট দ্বারা আইডি টোকেন গ্রহণ করার পরে, আপনাকে অবশ্যই টোকেনটির অখণ্ডতা যাচাই করতে হবে। টোকেনটি বৈধ কিনা তা যাচাই করতে নীচের মানদণ্ডটি সন্তুষ্ট কিনা তা নিশ্চিত করুন:

  • আইডি টোকেনটি গুগল দ্বারা সঠিকভাবে স্বাক্ষরিত। টোকেনের স্বাক্ষরটি যাচাই করতে গুগলের পাবলিক কীগুলি ( জেডাব্লু কে বা পিইএম ফর্ম্যাটে উপলব্ধ) ব্যবহার করুন। এই কীগুলি নিয়মিত ঘোরানো হয়; আপনার আবার কখন পুনরুদ্ধার করা উচিত তা নির্ধারণ করতে প্রতিক্রিয়াতে Cache-Control শিরোনাম পরীক্ষা করুন।
  • আইডি aud মানটি আপনার অ্যাপ্লিকেশনটির ক্লায়েন্ট আইডির সমান। আপনার অ্যাপ্লিকেশনটির ব্যাকএন্ড সার্ভারে একই ব্যবহারকারীর ডেটা অ্যাক্সেস করতে ব্যবহৃত দূষিত অ্যাপ্লিকেশনটিকে দেওয়া আইডি টোকেনগুলি রোধ করতে এই চেকটি প্রয়োজনীয় necessary
  • আইডি টোকেনে iss মান accounts.google.com . accounts.google.com বা https://accounts.google.com সমান।
  • আইডি টোকেনের মেয়াদোত্তীর্ণ সময় ( exp ) পাস করেনি।
  • আপনি যদি কেবলমাত্র আপনার জি স্যুট ডোমেনের সদস্যদের অ্যাক্সেসকে সীমাবদ্ধ রাখতে চান, আইডি টোকনে hd দাবি রয়েছে যা আপনার জি স্যুট ডোমেন নামের সাথে মেলে verify

এই যাচাইকরণের পদক্ষেপগুলি সম্পাদন করার জন্য আপনার নিজের কোডটি লেখার পরিবর্তে আমরা আপনার প্ল্যাটফর্মের জন্য একটি Google এপিআই ক্লায়েন্ট লাইব্রেরি, বা সাধারণ উদ্দেশ্যে জেডব্লুটি লাইব্রেরি ব্যবহার করার জন্য দৃ strongly়ভাবে পরামর্শ দিচ্ছি। বিকাশ এবং ডিবাগিংয়ের জন্য, আপনি আমাদের tokeninfo বৈধকরণের শেষ tokeninfo কল করতে পারেন।

একটি গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করে

গুগল আইপিএল ক্লায়েন্ট লাইব্রেরিগুলির একটি (যেমন জাভা , নোড.জেএস , পিএইচপি , পাইথন ) ব্যবহার করা কোনও পরিবেশ পরিবেশে গুগল আইডি টোকেনকে বৈধতা দেওয়ার প্রস্তাবিত উপায়।

জাভা

জাভাতে একটি আইডি টোকেন যাচাই করতে GoogleIdTokenVerifier অবজেক্টটি ব্যবহার করুন। উদাহরণ স্বরূপ:

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

...

GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
    // Specify the CLIENT_ID of the app that accesses the backend:
    .setAudience(Collections.singletonList(CLIENT_ID))
    // Or, if multiple clients access the backend:
    //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
    .build();

// (Receive idTokenString by HTTPS POST)

GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
  Payload payload = idToken.getPayload();

  // Print user identifier
  String userId = payload.getSubject();
  System.out.println("User ID: " + userId);

  // Get profile information from payload
  String email = payload.getEmail();
  boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
  String name = (String) payload.get("name");
  String pictureUrl = (String) payload.get("picture");
  String locale = (String) payload.get("locale");
  String familyName = (String) payload.get("family_name");
  String givenName = (String) payload.get("given_name");

  // Use or store profile information
  // ...

} else {
  System.out.println("Invalid ID token.");
}

GoogleIdTokenVerifier.verify() পদ্ধতি যাচাই JWT স্বাক্ষর, aud দাবি, iss দাবি, এবং exp দাবি।

আপনি যদি কেবলমাত্র আপনার জি স্যুট ডোমেনের সদস্যদের অ্যাক্সেসকে সীমাবদ্ধ রাখতে চান, Payload.getHostedDomain() - Payload.getHostedDomain() পদ্ধতিতে ফিরে আসা ডোমেন নামটি পরীক্ষা করে hd দাবিটি যাচাই করুন।

নোড.জেএস

নোড.জেজে আইডি টোকেনটি বৈধ করতে, নোড.জেএস এর জন্য গুগল আথ লাইব্রেরি ব্যবহার করুন । লাইব্রেরিটি ইনস্টল করুন:

npm install google-auth-library --save
তারপরে, verifyIdToken() ফাংশনটি কল করুন। উদাহরণ স্বরূপ:

const {OAuth2Client} = require('google-auth-library');
const client = new OAuth2Client(CLIENT_ID);
async function verify() {
  const ticket = await client.verifyIdToken({
      idToken: token,
      audience: CLIENT_ID,  // Specify the CLIENT_ID of the app that accesses the backend
      // Or, if multiple clients access the backend:
      //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
  });
  const payload = ticket.getPayload();
  const userid = payload['sub'];
  // If request specified a G Suite domain:
  // const domain = payload['hd'];
}
verify().catch(console.error);

verifyIdToken ফাংশন যাচাই JWT স্বাক্ষর, aud দাবি, exp দাবি, এবং iss দাবি।

আপনি যদি কেবলমাত্র আপনার জি স্যুট ডোমেনের সদস্যদের অ্যাক্সেসকে সীমাবদ্ধ রাখতে চান তবে hd দাবিটি আপনার জি স্যুট ডোমেন নামের সাথে মেলে তাও যাচাই করুন।

পিএইচপি

পিএইচপি-তে একটি আইডি টোকেন যাচাই করতে, পিএইচপি- জন্য Google এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করুন । লাইব্রেরিটি ইনস্টল করুন (উদাহরণস্বরূপ, সুরকার ব্যবহার করে):

composer require google/apiclient
তারপরে, verifyIdToken() ফাংশনটি কল করুন। উদাহরণ স্বরূপ:

require_once 'vendor/autoload.php';

// Get $id_token via HTTPS POST.

$client = new Google_Client(['client_id' => $CLIENT_ID]);  // Specify the CLIENT_ID of the app that accesses the backend
$payload = $client->verifyIdToken($id_token);
if ($payload) {
  $userid = $payload['sub'];
  // If request specified a G Suite domain:
  //$domain = $payload['hd'];
} else {
  // Invalid ID token
}

verifyIdToken ফাংশন যাচাই JWT স্বাক্ষর, aud দাবি, exp দাবি, এবং iss দাবি।

আপনি যদি কেবলমাত্র আপনার জি স্যুট ডোমেনের সদস্যদের অ্যাক্সেসকে সীমাবদ্ধ রাখতে চান তবে hd দাবিটি আপনার জি স্যুট ডোমেন নামের সাথে মেলে তাও যাচাই করুন।

পাইথন

পাইথনে আইডি টোকেনকে বৈধতা দিতে, যাচাই_আউথ 2_ টোকেন ফাংশনটি ব্যবহার করুন। উদাহরণ স্বরূপ:

from google.oauth2 import id_token
from google.auth.transport import requests

# (Receive token by HTTPS POST)
# ...

try:
    # Specify the CLIENT_ID of the app that accesses the backend:
    idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID)

    # Or, if multiple clients access the backend server:
    # idinfo = id_token.verify_oauth2_token(token, requests.Request())
    # if idinfo['aud'] not in [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]:
    #     raise ValueError('Could not verify audience.')

    # If auth request is from a G Suite domain:
    # if idinfo['hd'] != GSUITE_DOMAIN_NAME:
    #     raise ValueError('Wrong hosted domain.')

    # ID token is valid. Get the user's Google Account ID from the decoded token.
    userid = idinfo['sub']
except ValueError:
    # Invalid token
    pass

verify_oauth2_token ফাংশন যাচাই JWT স্বাক্ষর, aud দাবি, এবং exp দাবি। verify_oauth2_token ফেরত দেয় এমন বস্তু পরীক্ষা করে আপনাকে অবশ্যই hd দাবি (যদি প্রযোজ্য হয়) যাচাই করতে হবে। যদি একাধিক ক্লায়েন্ট ব্যাকএন্ড সার্ভার অ্যাক্সেস করে তবে aud দাবিটি ম্যানুয়ালিও যাচাই করুন।

টোকেনইনফো শেষ পয়েন্ট কল করা হচ্ছে

ডিবাগিংয়ের জন্য একটি আইডি টোকেন স্বাক্ষরকে বৈধ করার সহজ উপায় tokeninfo শেষ tokeninfo ব্যবহার করা। এই শেষ পয়েন্টটি কল করার জন্য একটি অতিরিক্ত নেটওয়ার্ক অনুরোধ জড়িত যা আপনি নিজের কোডে যথাযথ বৈধতা এবং পেডলোড নিষ্কাশন পরীক্ষা করার সময় আপনার জন্য বৈধতা সর্বাধিক করে। এটি উত্পাদন কোডে ব্যবহারের জন্য উপযুক্ত নয় কারণ অনুরোধগুলি থ্রটলড হতে পারে বা অন্যথায় মাঝে মাঝে ত্রুটিযুক্ত হতে পারে।

ব্যবহার টোকেন একটি আইডি যাচাই করতে tokeninfo শেষবিন্দু, একটি HTTPS দ্বারা পোস্ট করা বা শেষবিন্দু করার অনুরোধ পান, এবং মধ্যে টোকেন আপনার আইডি পাস id_token প্যারামিটার। উদাহরণস্বরূপ, টোকেন "XYZ123" যাচাই করতে নিম্নলিখিত GET অনুরোধটি করুন:

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

যদি টোকেনটি সঠিকভাবে স্বাক্ষরিত হয় এবং iss এবং exp দাবির প্রত্যাশিত মান থাকে তবে আপনি একটি এইচটিটিপি 200 প্রতিক্রিয়া পাবেন, যেখানে শরীরে জেএসওএন-ফর্ম্যাটড আইডি টোকেন দাবি রয়েছে। এখানে একটি উদাহরণ প্রতিক্রিয়া:

{
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

আপনি যদি জি স্যুট গ্রাহক হন তবে আপনি hd দাবিতে আগ্রহী হতে পারেন যা ব্যবহারকারীর হোস্টেড ডোমেনকে নির্দেশ করে। এটি কেবলমাত্র নির্দিষ্ট ডোমেনের সদস্যদের একটি সংস্থার অ্যাক্সেসকে সীমাবদ্ধ করতে ব্যবহার করা যেতে পারে। এই দাবির অনুপস্থিতি ইঙ্গিত দেয় যে ব্যবহারকারী কোনও জি স্যুট হোস্ট করা ডোমেনের অন্তর্ভুক্ত নয়।

একটি অ্যাকাউন্ট বা সেশন তৈরি করুন

আপনি টোকেন যাচাই করার পরে, ব্যবহারকারী ইতিমধ্যে আপনার ব্যবহারকারী ডাটাবেসে আছে কিনা তা পরীক্ষা করে দেখুন। যদি তা হয় তবে ব্যবহারকারীর জন্য একটি প্রমাণীকরণ সেশন স্থাপন করুন। যদি ব্যবহারকারী এখনও আপনার ব্যবহারকারী ডাটাবেজে না থেকে থাকে তবে আইডি টোকেন পেলোডের তথ্য থেকে একটি নতুন ব্যবহারকারী রেকর্ড তৈরি করুন এবং ব্যবহারকারীর জন্য একটি সেশন স্থাপন করুন। আপনি যখন আপনার অ্যাপ্লিকেশনটিতে সদ্য নির্মিত ব্যবহারকারীকে সনাক্ত করেন তখন আপনাকে প্রয়োজনীয় অতিরিক্ত প্রোফাইল তথ্যের জন্য ব্যবহারকারীকে প্রম্পট করতে পারেন।

ক্রস অ্যাকাউন্ট সুরক্ষা দিয়ে আপনার ব্যবহারকারীর অ্যাকাউন্টগুলি সুরক্ষিত করা

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