iOS অ্যাপে "Google দিয়ে সাইন ইন করুন" যোগ করুন

১. শুরু করার আগে

এই কোডল্যাবটি আপনাকে এমন একটি iOS অ্যাপ্লিকেশন তৈরি করতে সাহায্য করবে যা Google-এর মাধ্যমে সাইন ইন করে এবং একটি সিমুলেটরে চলে। SwiftUI এবং UIKit উভয় ব্যবহার করে বাস্তবায়ন প্রদান করা হয়েছে।

নতুন অ্যাপ ডেভেলপমেন্টের জন্য SwiftUI হল অ্যাপলের আধুনিক UI ফ্রেমওয়ার্ক। এটি একটি একক শেয়ার্ড কোডবেস থেকে সমস্ত অ্যাপল প্ল্যাটফর্মের জন্য ব্যবহারকারী ইন্টারফেস তৈরি করতে সক্ষম করে। এর জন্য iOS 13 এর ন্যূনতম সংস্করণ প্রয়োজন।

UIKit হল iOS এর জন্য অ্যাপলের মূল এবং মৌলিক UI ফ্রেমওয়ার্ক। এটি iOS এর পুরোনো সংস্করণগুলির জন্য ব্যাকওয়ার্ড সামঞ্জস্যতা প্রদান করে। এটি প্রতিষ্ঠিত অ্যাপগুলির জন্য একটি ভাল পছন্দ করে তোলে যেগুলিকে বিভিন্ন ধরণের পুরানো ডিভাইস সমর্থন করতে হয়।

আপনার উন্নয়নের চাহিদার সাথে সবচেয়ে ভালোভাবে সামঞ্জস্যপূর্ণ কাঠামোর পথ আপনি অনুসরণ করতে পারেন।

পূর্বশর্ত

  • সুইফট সম্পর্কে প্রাথমিক জ্ঞান
  • SwiftUI বা UIKit এর প্রাথমিক জ্ঞান

তুমি কি শিখবে

  • কিভাবে একটি গুগল ক্লাউড প্রকল্প তৈরি করবেন
  • গুগল ক্লাউড কনসোলে কীভাবে OAuth ক্লায়েন্ট তৈরি করবেন
  • আপনার iOS অ্যাপের জন্য "Google দিয়ে সাইন ইন করুন" কীভাবে বাস্তবায়ন করবেন
  • "গুগল দিয়ে সাইন ইন করুন" বোতামটি কীভাবে কাস্টমাইজ করবেন
  • কিভাবে একটি আইডি টোকেন ডিকোড করবেন
  • আপনার iOS অ্যাপের জন্য অ্যাপ চেক কীভাবে সক্ষম করবেন

তোমার যা লাগবে

এই কোডল্যাবটি iOS 18.3 সিমুলেটর সহ Xcode 16.3 ব্যবহার করে তৈরি করা হয়েছে। ডেভেলপমেন্টের জন্য আপনার Xcode এর সর্বশেষ সংস্করণ ব্যবহার করা উচিত।

2. একটি নতুন Xcode প্রকল্প তৈরি করুন

  1. Xcode খুলুন এবং একটি নতুন Xcode প্রকল্প তৈরি করুন নির্বাচন করুন।
  2. iOS ট্যাবটি নির্বাচন করুন, অ্যাপ টেমপ্লেটটি নির্বাচন করুন এবং পরবর্তী ক্লিক করুন।

এক্সকোড প্রজেক্ট ক্রিয়েশন টেমপ্লেট পৃষ্ঠা

  1. প্রকল্পের বিকল্পগুলিতে:
    • আপনার পণ্যের নাম লিখুন।
    • ঐচ্ছিকভাবে আপনার দল নির্বাচন করুন।
    • আপনার প্রতিষ্ঠান শনাক্তকারী লিখুন।
    • তৈরি করা বান্ডেল আইডেন্টিফায়ারটি নোট করুন। আপনার পরে এটির প্রয়োজন হবে।
    • ইন্টারফেসের জন্য, যে কোনও একটি বেছে নিন:
      • SwiftUI-ভিত্তিক অ্যাপের জন্য SwiftUI
      • UIKit-ভিত্তিক অ্যাপের স্টোরিবোর্ড
    • ভাষার জন্য Swift বেছে নিন।
    • পরবর্তী ক্লিক করুন এবং আপনার প্রকল্প সংরক্ষণ করার জন্য একটি অবস্থান নির্বাচন করুন।

এক্সকোড প্রকল্পের বিকল্প পৃষ্ঠা

৩. একটি OAuth ক্লায়েন্ট তৈরি করুন

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

একটি Google Cloud প্রকল্প নির্বাচন করুন বা তৈরি করুন

  1. গুগল ক্লাউড কনসোলে যান এবং একটি প্রকল্প নির্বাচন করুন বা তৈরি করুন। যদি আপনি একটি পূর্ব-বিদ্যমান প্রকল্প নির্বাচন করেন, তাহলে কনসোলটি স্বয়ংক্রিয়ভাবে আপনাকে পরবর্তী প্রয়োজনীয় ধাপে পরিচালিত করবে।

গুগল ক্লাউড কনসোল প্রকল্প নির্বাচক পৃষ্ঠা

  1. আপনার নতুন গুগল ক্লাউড প্রোজেক্টের জন্য একটি নাম লিখুন।
  2. তৈরি করুন নির্বাচন করুন।

গুগল ক্লাউড কনসোল প্রকল্প নির্বাচক পৃষ্ঠা

যদি আপনি ইতিমধ্যেই নির্বাচিত প্রকল্পের জন্য একটি সম্মতি স্ক্রিন কনফিগার করে থাকেন, তাহলে আপনাকে এখনই এটি কনফিগার করার জন্য অনুরোধ করা হবে না। সেক্ষেত্রে, আপনি এই বিভাগটি এড়িয়ে যেতে পারেন এবং Create an OAuth 2.0 ক্লায়েন্টে যেতে পারেন।

  1. কনফিগার সম্মতি স্ক্রিন নির্বাচন করুন।

গুগল ক্লাউড কনসোল কনফিগার সম্মতি স্ক্রিনের প্রয়োজনীয়তা সহ OAuth ক্লায়েন্ট পৃষ্ঠা তৈরি করে

  1. ব্র্যান্ডিং পৃষ্ঠায় শুরু করুন নির্বাচন করুন।

গুগল ক্লাউড কনসোল ব্র্যান্ডিং শুরু করার পৃষ্ঠা

  1. প্রকল্প কনফিগারেশন পৃষ্ঠায় নিম্নলিখিত ক্ষেত্রগুলি পূরণ করুন:
    • অ্যাপের তথ্য : আপনার অ্যাপের জন্য একটি নাম এবং ব্যবহারকারীর সহায়তা ইমেল ঠিকানা লিখুন। ব্যবহারকারীরা তাদের সম্মতি সম্পর্কে প্রশ্ন থাকলে আপনার সাথে যোগাযোগ করতে এই সহায়তা ইমেল ঠিকানাটি সর্বজনীনভাবে প্রদর্শিত হবে।
    • শ্রোতা : বহিরাগত নির্বাচন করুন।
    • যোগাযোগের তথ্য : আপনার প্রকল্প সম্পর্কে Google-এর সাথে যোগাযোগ করার জন্য একটি ইমেল ঠিকানা লিখুন।
    • গুগল এপিআই পরিষেবা: ব্যবহারকারীর ডেটা নীতি পর্যালোচনা করুন।
    • তৈরি করুন ক্লিক করুন।

গুগল ক্লাউড কনসোল ক্লায়েন্ট ব্র্যান্ডিং কনফিগারেশন পৃষ্ঠা

  1. নেভিগেশন মেনুতে ক্লায়েন্ট পৃষ্ঠাটি নির্বাচন করুন।
  2. ক্লায়েন্ট তৈরি করুন ক্লিক করুন।

গুগল ক্লাউড প্রকল্প ক্লায়েন্ট পৃষ্ঠা

একটি OAuth 2.0 ক্লায়েন্ট তৈরি করুন

  1. অ্যাপ্লিকেশন প্রকারের জন্য iOS নির্বাচন করুন।
  2. আপনার ক্লায়েন্টের জন্য একটি নাম লিখুন।
  3. শেষ ধাপে তৈরি বান্ডেল আইডেন্টিফায়ারটি প্রবেশ করান।
  4. অ্যাপল কর্তৃক আপনার টিমকে নির্ধারিত টিম আইডি লিখুন। এই ধাপটি আপাতত ঐচ্ছিক, তবে এই কোডল্যাবে পরে অ্যাপ চেক সক্ষম করার জন্য একটি টিম আইডি প্রয়োজন।
  5. তৈরি করুন নির্বাচন করুন।

OAuth ক্লায়েন্টের বিবরণ ইনপুট পৃষ্ঠা

  1. ডায়ালগ উইন্ডো থেকে ক্লায়েন্ট আইডি কপি করুন, আপনার পরে এটির প্রয়োজন হবে।
  2. পরে রেফারেন্সের জন্য plist ফাইলটি ডাউনলোড করুন।

OAuth ক্লায়েন্ট আইডি তৈরি করা ডায়ালগ

৪. আপনার এক্সকোড প্রকল্পটি কনফিগার করুন

পরবর্তী ধাপ হল আপনার Xcode প্রোজেক্টকে Sign In with Google SDK এর সাথে কাজ করার জন্য সেট আপ করা। এই প্রক্রিয়ায় আপনার প্রোজেক্টে SDK কে একটি নির্ভরতা হিসেবে যুক্ত করা এবং একটি অনন্য ক্লায়েন্ট আইডি দিয়ে আপনার প্রোজেক্ট সেটিংস কনফিগার করা জড়িত। এই আইডি সাইন-ইন প্রক্রিয়ার সময় SDK কে Google এর প্রমাণীকরণ পরিষেবার সাথে নিরাপদে যোগাযোগ করতে দেয়।

Google নির্ভরতা সহ সাইন ইন ইনস্টল করুন

  1. আপনার এক্সকোড প্রকল্পটি খুলুন।
  2. ফাইল > প্যাকেজ নির্ভরতা যোগ করুন এ নেভিগেট করুন।
  3. অনুসন্ধান বারে, "Google দিয়ে সাইন ইন করুন" সংগ্রহস্থলের URL লিখুন: https://github.com/google/GoogleSignIn-iOS

সুইফট প্যাকেজ ম্যানেজারে "গুগলের সাথে সাইন ইন করুন" বিকল্পটি খুঁজুন।

  1. প্যাকেজ যোগ করুন নির্বাচন করুন।
  2. GoogleSignIn প্যাকেজের জন্য প্রধান অ্যাপ্লিকেশন লক্ষ্য নির্বাচন করুন।
  3. যদি আপনি SwiftUI ব্যবহার করেন, তাহলে GoogleSignInSwift প্যাকেজের জন্য প্রধান অ্যাপ্লিকেশন টার্গেট নির্বাচন করুন। যদি আপনি UIKit ব্যবহার করার পরিকল্পনা করেন, তাহলে এই প্যাকেজের জন্য কোনও টার্গেট নির্বাচন করবেন না।
  4. প্যাকেজ যোগ করুন নির্বাচন করুন।

আপনার প্রকল্পে Google নির্ভরতা সহ সাইন ইন যোগ করুন

আপনার অ্যাপের শংসাপত্রগুলি কনফিগার করুন

  1. প্রজেক্ট নেভিগেটরে, আপনার প্রজেক্টের রুট-এ ক্লিক করুন।
  2. প্রধান সম্পাদক এলাকায়, লক্ষ্য তালিকা থেকে আপনার প্রধান অ্যাপ্লিকেশন লক্ষ্য নির্বাচন করুন।
  3. সম্পাদক এলাকার উপরে তথ্য ট্যাবটি নির্বাচন করুন।
  4. কাস্টম iOS টার্গেট প্রোপার্টিজ বিভাগের শেষ সারির উপর কার্সার রাখুন এবং প্রদর্শিত + বোতামটি ক্লিক করুন।

iOS টার্গেট প্রোপার্টিজে একটি নতুন টার্গেট কী যোগ করুন

  1. কী কলামে, GIDClientID টাইপ করুন
  2. মান কলামে, গুগল ক্লাউড কনসোল থেকে কপি করা ক্লায়েন্ট আইডিটি পেস্ট করুন।

প্রধান অ্যাপ টার্গেটে GIDClientID যোগ করুন

  1. গুগল ক্লাউড কনসোল থেকে ডাউনলোড করা plist ফাইলটি খুলুন।
  2. বিপরীত ক্লায়েন্ট আইডি এর মানটি অনুলিপি করুন।

গুগল ক্লাউড কনসোল প্লাস্ট ফাইল

  1. তথ্য ট্যাবের নীচে, URL Types প্রসারিত করুন।
  2. + বোতামটি নির্বাচন করুন।
  3. URL স্কিম বাক্সে বিপরীত ক্লায়েন্ট আইডি লিখুন।

প্রধান অ্যাপ্লিকেশন টার্গেটে URLSchemes কী যোগ করুন

এখন আমরা আমাদের অ্যাপে সাইন-ইন বোতাম যোগ করার জন্য প্রস্তুত!

৫. সাইন-ইন বোতামটি যোগ করুন

Xcode প্রজেক্ট কনফিগার করার সাথে সাথে, অ্যাপটিতে "Google দিয়ে সাইন ইন করুন" বোতামটি যোগ করা শুরু করার সময় এসেছে!

এই ধাপের মূল যুক্তি হল GIDSignIn.sharedInstance.signIn এ কল করা। এই পদ্ধতিটি প্রমাণীকরণ প্রক্রিয়া শুরু করে, ব্যবহারকারীর কাছে Sign In with Google SDK-এর নিয়ন্ত্রণ হস্তান্তর করে Sign In with Google প্রবাহ উপস্থাপন করে।

সুইফটইউআই

  1. Xcode Project Navigator-এ ContentView.swift ফাইলটি খুঁজুন।
  2. এই ফাইলের বিষয়বস্তু নিম্নলিখিত লেখা দিয়ে প্রতিস্থাপন করুন:
import GoogleSignIn
import GoogleSignInSwift
import SwiftUI

struct ContentView: View {
  var body: some View {
    VStack {
      GoogleSignInButton(action: handleSignInButton).padding()
    }
  }

  func handleSignInButton() {
    // Find the current window scene.
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
      print("There is no active window scene")
      return
    }

    // Get the root view controller from the window scene.
    guard
      let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
        .rootViewController
    else {
      print("There is no key window or root view controller")
      return
    }

    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(
      withPresenting: rootViewController
    ) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }
      // If sign in succeeded, display the app's main content View.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")
    }
  }
}

#Preview {
  ContentView()
}

iOS সিমুলেটরে SwiftUI ফ্রেমওয়ার্ক Google দিয়ে সাইন ইন করুন বোতাম

ইউআইকিট

  1. Xcode Project Navigator-এ ViewController.swift ফাইলটি খুঁজুন।
  2. এই ফাইলের বিষয়বস্তু নিম্নলিখিত লেখা দিয়ে প্রতিস্থাপন করুন:
import GoogleSignIn
import UIKit

class ViewController: UIViewController {

  // Create an instance of the Sign in with Google button
  let signInButton = GIDSignInButton()

  override func viewDidLoad() {
    super.viewDidLoad()

    // Add the sign-in button to your view
    view.addSubview(signInButton)

    // Position the button using constraints
    signInButton.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
      signInButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signInButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    ])

    // Add a target to the button to call a method when it's pressed
    signInButton.addTarget(self, action: #selector(signInButtonTapped), for: .touchUpInside)
  }

  // This method is called when the sign-in button is pressed.
  @objc func signInButtonTapped() {
    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      // If sign in succeeded, print the ID token.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")
    }
  }
}

iOS সিমুলেটরে UIKit ফ্রেমওয়ার্ক Google দিয়ে সাইন ইন করুন বোতাম

সাইন-ইন বোতামটি দেখুন

সিমুলেটরে আপনার অ্যাপটি চালু করুন। আপনি "Google দিয়ে সাইন ইন করুন" বোতামটি দেখতে পাবেন, কিন্তু এটি এখনও সঠিকভাবে কাজ করবে না। এটি প্রত্যাশিত, কারণ ব্যবহারকারীর প্রমাণীকরণের পরেও আপনার অ্যাপে পুনঃনির্দেশনা পরিচালনা করার জন্য আপনাকে এখনও কোডটি বাস্তবায়ন করতে হবে।

৬. সাইন-ইন বোতামটি কাস্টমাইজ করুন

আপনার অ্যাপের থিমের সাথে আরও ভালোভাবে মানানসই করার জন্য আপনি ডিফল্ট "Google-এর সাথে সাইন-ইন করুন" বোতামটি কাস্টমাইজ করতে পারেন। "Google-এর সাথে সাইন-ইন করুন" SDK আপনাকে বোতামের রঙের স্কিম এবং স্টাইল পরিবর্তন করতে দেয়।

সুইফটইউআই

এই লাইন কোড সহ পৃষ্ঠায় ডিফল্ট বোতামটি যুক্ত করা হয়:

GoogleSignInButton(action: handleSignInButton)

GoogleSignInButton এর ইনিশিয়ালাইজারে প্যারামিটার পাস করে কাস্টমাইজ করা হয়েছে। নিম্নলিখিত কোডটি সাইন-ইন বোতামটিকে ডার্ক মোডে প্রদর্শন করবে।

  1. ContentView.swift খুলুন
  2. নিম্নলিখিত মানগুলি ধারণ করার জন্য GoogleSignInButton এর জন্য initializer আপডেট করুন:
GoogleSignInButton(
  scheme: .dark,  // Options: .light, .dark, .auto
  style: .standard,  // Options: .standard, .wide, .icon
  state: .normal,  // Options: .normal, .disabled
  action: handleSignInButton
).padding()

iOS সিমুলেটরে SwiftUI ফ্রেমওয়ার্ক ডার্ক মোড সাইন ইন উইথ গুগল বোতাম

কাস্টমাইজেশন বিকল্পগুলি সম্পর্কে আরও তথ্যের জন্য GoogleSignInSwift ফ্রেমওয়ার্ক রেফারেন্স দেখুন।

ইউআইকিট

ডিফল্ট বোতামটি এই লাইনের কোড দিয়ে তৈরি করা হয়:

// Create an instance of the Sign in with Google button
let signInButton = GIDSignInButton()

// Add the button to your view
view.addSubview(signInButton)

GIDSignInButton বোতামের ইনস্ট্যান্সে বৈশিষ্ট্য সেট করে কাস্টমাইজ করা হয়। নিম্নলিখিত কোডটি সাইন-ইন বোতামটিকে ডার্ক মোডে প্রদর্শন করবে।

  1. ViewController.swift খুলুন।
  2. viewDidLoad ফাংশনে ভিউতে সাইন-ইন বোতাম যোগ করার আগে নিচের কোডের লাইনগুলি যোগ করুন:
// Set the width and color of the sign-in button
signInButton.style = .standard  // Options: .standard, .wide, .iconOnly
signInButton.colorScheme = .dark  // Options: .dark, .light

iOS সিমুলেটরে UIKit ফ্রেমওয়ার্ক ডার্ক মোড সাইন ইন উইথ গুগল বোতাম

কাস্টমাইজেশন সম্পর্কে আরও তথ্যের জন্য GoogleSignIn ফ্রেমওয়ার্ক রেফারেন্স দেখুন।

৭. প্রমাণীকরণ পুনর্নির্দেশ URL পরিচালনা করুন

সাইন-ইন বোতামটি যুক্ত করার পর, পরবর্তী ধাপ হল ব্যবহারকারীর প্রমাণীকরণের পরে যে পুনঃনির্দেশনা ঘটে তা পরিচালনা করা। প্রমাণীকরণের পরে, Google একটি অস্থায়ী অনুমোদন কোড সহ একটি URL ফেরত দেয়। সাইন-ইন প্রক্রিয়াটি সম্পূর্ণ করার জন্য, একটি হ্যান্ডলার এই URLটি আটকে দেয় এবং একটি স্বাক্ষরিত আইডি টোকেন (JWT) এর জন্য বিনিময় করার জন্য এটি Sign In with Google SDK-তে প্রেরণ করে।

সুইফটইউআই

  1. আপনার App স্ট্রাক্ট ধারণকারী ফাইলটি খুলুন। এই ফাইলটির নামকরণ আপনার প্রোজেক্টের উপর ভিত্তি করে করা হয়েছে, তাই নামটি YourProjectNameApp.swift এর মতো হবে।
  2. এই ফাইলের বিষয়বস্তু নিম্নলিখিত লেখা দিয়ে প্রতিস্থাপন করুন:
import GoogleSignIn
import SwiftUI

@main
struct iOS_Sign_in_with_Google_App: App {
  var body: some Scene {
    WindowGroup {
      ContentView()

        .onOpenURL { url in
          GIDSignIn.sharedInstance.handle(url)
        }
    }
  }
}

ইউআইকিট

  1. AppDelegate.swift খুলুন।
  2. ফাইলের উপরে নিম্নলিখিত আমদানি যোগ করুন:
import GoogleSignIn
  1. AppDelegate ক্লাসের ভিতরে নিম্নলিখিত প্রমাণীকরণ হ্যান্ডলার ফাংশনটি যোগ করুন। এটি স্থাপন করার জন্য একটি ভাল জায়গা হল application(_:didFinishLaunchingWithOptions:) পদ্ধতির ক্লোজিং ব্রেসটি সরাসরি অনুসরণ করা:
func application(
  _ app: UIApplication,
  open url: URL,
  options: [UIApplication.OpenURLOptionsKey: Any] = [:]
) -> Bool {
  var handled: Bool

  handled = GIDSignIn.sharedInstance.handle(url)
  if handled {
    return true
  }
  // If not handled by this app, return false.
  return false
}

এই পরিবর্তনগুলি করার পরে, আপনার AppDelegate.swift ফাইলটি এইরকম দেখাবে:

import GoogleSignIn
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    // Override point for customization after application launch.
    return true
  }

  func application(
    _ app: UIApplication,
    open url: URL,
    options: [UIApplication.OpenURLOptionsKey: Any] = [:]
  ) -> Bool {
    var handled: Bool

    handled = GIDSignIn.sharedInstance.handle(url)
    if handled {
      return true
    }
    // If not handled by this app, return false.
    return false
  }

  // MARK: UISceneSession Lifecycle

  func application(
    _ application: UIApplication,
    configurationForConnecting connectingSceneSession: UISceneSession,
    options: UIScene.ConnectionOptions
  ) -> UISceneConfiguration {
    // Called when a new scene session is being created.
    // Use this method to select a configuration to create the new scene with.
    return UISceneConfiguration(
      name: "Default Configuration",
      sessionRole: connectingSceneSession.role
    )
  }

  func application(
    _ application: UIApplication,
    didDiscardSceneSessions sceneSessions: Set<UISceneSession>
  ) {
    // Called when the user discards a scene session.
    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
  }
}

সাইন-ইন প্রবাহ পরীক্ষা করুন

আপনি এখন সম্পূর্ণ সাইন-ইন প্রবাহ পরীক্ষা করতে পারেন!

আপনার অ্যাপটি চালান এবং সাইন-ইন বোতামটি ট্যাপ করুন। আপনি প্রমাণীকরণ করার পরে, Google একটি সম্মতি স্ক্রিন উপস্থাপন করবে যেখানে আপনি অ্যাপটিকে আপনার তথ্য অ্যাক্সেস করার অনুমতি দিতে পারবেন। আপনি অনুমোদন করার পরে, সাইন-ইন চূড়ান্ত হবে এবং আপনাকে অ্যাপে ফিরিয়ে আনা হবে।

সাইন-ইন প্রবাহ সফলভাবে সম্পন্ন হলে, Google SDK-এর মাধ্যমে সাইন ইন ব্যবহারকারীর শংসাপত্রগুলি ডিভাইসের কীচেইনে নিরাপদে সংরক্ষণ করে। পরবর্তী অ্যাপ লঞ্চের সময় ব্যবহারকারীকে সাইন ইন থাকার অনুমতি দেওয়ার জন্য এই শংসাপত্রগুলি পরে ব্যবহার করা যেতে পারে।

৮. একটি সাইন-আউট বোতাম যোগ করুন

এখন সাইন-ইন কাজ করছে, পরবর্তী ধাপ হল একটি সাইন-আউট বোতাম যোগ করা এবং ব্যবহারকারীর বর্তমান সাইন-ইন অবস্থা প্রতিফলিত করার জন্য UI আপডেট করা। যখন একটি সাইন-ইন সফল হয়, তখন SDK একটি GIDGoogleUser অবজেক্ট প্রদান করে। এই অবজেক্টে ব্যবহারকারীর নাম এবং ইমেলের মতো মৌলিক তথ্য সহ একটি profile প্রপার্টি থাকে যা আপনি UI ব্যক্তিগতকৃত করতে ব্যবহার করবেন।

সুইফটইউআই

  1. আপনার ContentView.swift ফাইলটি খুলুন।
  2. আপনার ContentView স্ট্রাক্টের উপরে একটি state ভেরিয়েবল যোগ করুন। এই ভেরিয়েবলটি ব্যবহারকারীর সাইন ইন করার পরে তাদের তথ্য ধরে রাখবে। যেহেতু এটি একটি @State ভেরিয়েবল, তাই SwiftUI এর মান পরিবর্তন হলে স্বয়ংক্রিয়ভাবে আপনার UI আপডেট করবে:
struct ContentView: View {
  @State private var user: GIDGoogleUser?
}
  1. আপনার ContentView struct এর বর্তমান body নিম্নলিখিত VStack দিয়ে প্রতিস্থাপন করুন। এটি পরীক্ষা করবে যে user state ভেরিয়েবলে কোন user আছে কিনা। যদি থাকে, তাহলে এটি একটি স্বাগত বার্তা এবং একটি সাইন-আউট বোতাম দেখাবে। যদি না থাকে, তাহলে এটি আসল Sign In with Google বোতামটি দেখাবে:
var body: some View {
  VStack {
    // Check if the user is signed in.
    if let user = user {
      // If signed in, show a welcome message and the sign-out button.
      Text("Hello, \(user.profile?.givenName ?? "User")!")
        .font(.title)
        .padding()

      Button("Sign Out", action: signOut)
        .buttonStyle(.borderedProminent)

    } else {
      // If not signed in, show the "Sign in with Google" button.
      GoogleSignInButton(
        scheme: .dark,  // Options: .light, .dark, .auto
        style: .standard,  // Options: .standard, .wide, .icon
        state: .normal,  // Options: .normal, .disabled
        action: handleSignInButton
      ).padding()
    }
  }
}
  1. আপনার নতুন user ভেরিয়েবলে signInResult.user বরাদ্দ করতে handleSignInButton সম্পূর্ণকরণ ব্লকটি আপডেট করুন। এটিই UI কে সাইন-ইন ভিউতে স্যুইচ করতে ট্রিগার করে:
func handleSignInButton() {
  // Find the current window scene.
  guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
    print("There is no active window scene")
    return
  }

  // Get the root view controller from the window scene.
  guard
    let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
      .rootViewController
  else {
    print("There is no key window or root view controller")
    return
  }

  // Start the sign-in process.
  GIDSignIn.sharedInstance.signIn(
    withPresenting: rootViewController
  ) { signInResult, error in
    guard let result = signInResult else {
      // Inspect error
      print("Error signing in: \(error?.localizedDescription ?? "No error description")")
      return
    }

    DispatchQueue.main.async {
      self.user = result.user
    }

    // If sign in succeeded, display the app's main content View.
    print("ID Token: \(result.user.idToken?.tokenString ?? "")")
  }
}
  1. আপনার সাইন-আউট বোতাম দ্বারা কল করার জন্য আপনার ContentView স্ট্রাক্টের নীচে একটি নতুন signOut ফাংশন যুক্ত করুন:
func signOut() {
  GIDSignIn.sharedInstance.signOut()
  // After signing out, set the `user` state variable to `nil`.
  self.user = nil
}

অ্যাপটি চালু করুন এবং সাইন ইন করুন। সফল প্রমাণীকরণের পরে আপনি UI পরিবর্তন দেখতে পাবেন!

iOS সিমুলেটরে SwiftUI ফ্রেমওয়ার্ক সাইন-ইন থাকা অবস্থা

এই পরিবর্তনগুলি করার পরে, আপনার ContentView.swift ফাইলটি এইরকম দেখাবে:

import GoogleSignIn
import GoogleSignInSwift
import SwiftUI

struct ContentView: View {

  @State private var user: GIDGoogleUser?

  var body: some View {
    VStack {
      // Check if the user is signed in.
      if let user = user {
        // If signed in, show a welcome message and the sign-out button.
        Text("Hello, \(user.profile?.givenName ?? "User")!")
          .font(.title)
          .padding()

        Button("Sign Out", action: signOut)
          .buttonStyle(.borderedProminent)

      } else {
        // If not signed in, show the "Sign in with Google" button.
        GoogleSignInButton(
          scheme: .dark,  // Options: .light, .dark, .auto
          style: .standard,  // Options: .standard, .wide, .icon
          state: .normal,  // Options: .normal, .disabled
          action: handleSignInButton
        ).padding()
      }
    }
  }

  func handleSignInButton() {
    // Find the current window scene.
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
      print("There is no active window scene")
      return
    }

    // Get the root view controller from the window scene.
    guard
      let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
        .rootViewController
    else {
      print("There is no key window or root view controller")
      return
    }

    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(
      withPresenting: rootViewController
    ) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      DispatchQueue.main.async {
        self.user = result.user
      }

      // If sign in succeeded, display the app's main content View.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")
    }
  }

  func signOut() {
    GIDSignIn.sharedInstance.signOut()
    // After signing out, set the `user` state variable to `nil`.
    self.user = nil
  }
}

#Preview {
  ContentView()
}

ইউআইকিট

  1. ViewController.swift খুলুন।
  2. ViewController এর উপরে, যেখানে আপনি signInButton ঘোষণা করেছেন তার ঠিক নীচে, একটি sign-out বোতাম এবং একটি welcome লেবেল যুক্ত করুন:
let signOutButton = UIButton(type: .system)
let welcomeLabel = UILabel()
  1. ViewController এর নীচে নিম্নলিখিত ফাংশনটি যোগ করুন। এই ফাংশনটি ব্যবহারকারীর সাইন-ইন স্ট্যাটাসের উপর ভিত্তি করে একটি ভিন্ন UI দেখাবে:
private func updateUI(for user: GIDGoogleUser?) {
  if let user = user {
    // User is signed in.
    signInButton.isHidden = true
    signOutButton.isHidden = false
    welcomeLabel.isHidden = false
    welcomeLabel.text = "Hello, \(user.profile?.givenName ?? "User")!"
  } else {
    // User is signed out.
    signInButton.isHidden = false
    signOutButton.isHidden = true
    welcomeLabel.isHidden = true
  }
}
  1. viewDidLoad ফাংশনের নীচে, ভিউতে স্বাগত লেবেল এবং সাইন-আউট বোতাম যুক্ত করতে নিম্নলিখিত কোডটি যুক্ত করুন:
// --- Set up the Welcome Label ---
welcomeLabel.translatesAutoresizingMaskIntoConstraints = false
welcomeLabel.textAlignment = .center
welcomeLabel.font = .systemFont(ofSize: 24, weight: .bold)
view.addSubview(welcomeLabel)

NSLayoutConstraint.activate([
  welcomeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
  welcomeLabel.bottomAnchor.constraint(equalTo: signInButton.topAnchor, constant: -20),
])

// --- Set up the Sign-Out Button ---
signOutButton.translatesAutoresizingMaskIntoConstraints = false
signOutButton.setTitle("Sign Out", for: .normal)
view.addSubview(signOutButton)

NSLayoutConstraint.activate([
  signOutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
  signOutButton.topAnchor.constraint(equalTo: signInButton.bottomAnchor, constant: 20),
])

signOutButton.addTarget(self, action: #selector(signOutButtonTapped), for: .touchUpInside)

// --- Set Initial UI State ---
updateUI(for: nil)
  1. সফল সাইন-ইনের সময় UpdateUI পদ্ধতিতে কল করতে signInButtonTapped ফাংশনটি আপডেট করুন:
@objc func signInButtonTapped() {
  // Start the sign-in process.
  GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
    guard let result = signInResult else {
      // Inspect error
      print("Error signing in: \(error?.localizedDescription ?? "No error description")")
      return
    }

    // If sign in succeeded, print the ID token.
    print("ID Token: \(result.user.idToken?.tokenString ?? "")")

    DispatchQueue.main.async {
      self.updateUI(for: result.user)
    }
  }
}
  1. অবশেষে, সাইন-আউট প্রক্রিয়া পরিচালনা করার জন্য ViewController এ একটি signOutButtonTapped ফাংশন যোগ করুন:
@objc func signOutButtonTapped() {
  GIDSignIn.sharedInstance.signOut()
  // Update the UI for the signed-out state.
  updateUI(for: nil)
}

অ্যাপটি চালু করুন এবং সাইন ইন করুন। সফল প্রমাণীকরণের পরে আপনি UI পরিবর্তন দেখতে পাবেন!

iOS সিমুলেটরে UIKit ফ্রেমওয়ার্ক সাইন-ইন অবস্থা

এই পরিবর্তনগুলি করার পরে, আপনার ViewController.swift ফাইলটি এইরকম দেখাবে:

import GoogleSignIn
import UIKit

class ViewController: UIViewController {

  // Create an instance of the Sign in with Google button
  let signInButton = GIDSignInButton()
  let signOutButton = UIButton(type: .system)
  let welcomeLabel = UILabel()

  override func viewDidLoad() {
    super.viewDidLoad()

    // Set the width and color of the sign-in button
    signInButton.style = .standard  // Options: .standard, .wide, .iconOnly
    signInButton.colorScheme = .dark  // Options: .dark, .light

    // Add the sign-in button to your view
    view.addSubview(signInButton)

    // Position the button using constraints
    signInButton.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
      signInButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signInButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    ])

    // Add a target to the button to call a method when it's pressed
    signInButton.addTarget(self, action: #selector(signInButtonTapped), for: .touchUpInside)

    // --- Set up the Welcome Label ---
    welcomeLabel.translatesAutoresizingMaskIntoConstraints = false
    welcomeLabel.textAlignment = .center
    welcomeLabel.font = .systemFont(ofSize: 24, weight: .bold)
    view.addSubview(welcomeLabel)

    NSLayoutConstraint.activate([
      welcomeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      welcomeLabel.bottomAnchor.constraint(equalTo: signInButton.topAnchor, constant: -20),
    ])

    // --- Set up the Sign-Out Button ---
    signOutButton.translatesAutoresizingMaskIntoConstraints = false
    signOutButton.setTitle("Sign Out", for: .normal)
    view.addSubview(signOutButton)

    NSLayoutConstraint.activate([
      signOutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signOutButton.topAnchor.constraint(equalTo: signInButton.bottomAnchor, constant: 20),
    ])

    signOutButton.addTarget(self, action: #selector(signOutButtonTapped), for: .touchUpInside)

    // --- Set Initial UI State ---
    updateUI(for: nil)
  }

  // This method is called when the sign-in button is pressed.
  @objc func signInButtonTapped() {
    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      // If sign in succeeded, print the ID token.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")

      DispatchQueue.main.async {
        self.updateUI(for: result.user)
      }
    }
  }

  private func updateUI(for user: GIDGoogleUser?) {
    if let user = user {
      // User is signed in.
      signInButton.isHidden = true
      signOutButton.isHidden = false
      welcomeLabel.isHidden = false
      welcomeLabel.text = "Hello, \(user.profile?.givenName ?? "User")!"
    } else {
      // User is signed out.
      signInButton.isHidden = false
      signOutButton.isHidden = true
      welcomeLabel.isHidden = true
    }
  }

  @objc func signOutButtonTapped() {
    GIDSignIn.sharedInstance.signOut()
    // Update the UI for the signed-out state.
    updateUI(for: nil)
  }
}

৯. ব্যবহারকারীর সাইন-ইন অবস্থা পুনরুদ্ধার করুন

ফিরে আসা ব্যবহারকারীদের অভিজ্ঞতা উন্নত করার জন্য, পরবর্তী পদক্ষেপ হল অ্যাপ লঞ্চের সময় তাদের সাইন-ইন অবস্থা পুনরুদ্ধার করা। restorePreviousSignIn কল করার মাধ্যমে কীচেইনে সংরক্ষিত শংসাপত্রগুলি ব্যবহার করে ব্যবহারকারীকে নীরবে সাইন ইন করা হয়, যাতে তাদের প্রতিবার সাইন-ইন প্রবাহ সম্পূর্ণ করতে না হয়।

সুইফটইউআই

  1. ContentView.swift খুলুন।
  2. body ভেরিয়েবলের ভিতরে VStack অনুসরণ করে নিম্নলিখিত কোডটি যুক্ত করুন:
.onAppear {
  // On appear, try to restore a previous sign-in.
  GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
    // This closure is called when the restoration is complete.
    if let user = user {
      // If a user was restored, update the `user` state variable.
      DispatchQueue.main.async {
        self.user = user
      }

      // Print the ID token to the console when restored.
      print("Restored ID Token: \(user.idToken?.tokenString ?? "")")
    }
  }
}

তোমার ContentView.swift দেখতে এরকম হওয়া উচিত:

import GoogleSignIn
import GoogleSignInSwift
import SwiftUI

struct ContentView: View {

  @State private var user: GIDGoogleUser?

  var body: some View {
    VStack {
      // Check if the user is signed in.
      if let user = user {
        // If signed in, show a welcome message and the sign-out button.
        Text("Hello, \(user.profile?.givenName ?? "User")!")
          .font(.title)
          .padding()

        Button("Sign Out", action: signOut)
          .buttonStyle(.borderedProminent)

      } else {
        // If not signed in, show the "Sign in with Google" button.
        GoogleSignInButton(
          scheme: .dark,  // Options: .light, .dark, .auto
          style: .standard,  // Options: .standard, .wide, .icon
          state: .normal,  // Options: .normal, .disabled
          action: handleSignInButton
        ).padding()
      }
    }

    .onAppear {
      // On appear, try to restore a previous sign-in.
      GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
        // This closure is called when the restoration is complete.
        if let user = user {
          // If a user was restored, update the `user` state variable.
          DispatchQueue.main.async {
            self.user = user
          }

          // Print the ID token to the console when restored.
          print("Restored ID Token: \(user.idToken?.tokenString ?? "")")
        }
      }
    }
  }

  func handleSignInButton() {
    // Find the current window scene.
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
      print("There is no active window scene")
      return
    }

    // Get the root view controller from the window scene.
    guard
      let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
        .rootViewController
    else {
      print("There is no key window or root view controller")
      return
    }

    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(
      withPresenting: rootViewController
    ) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      DispatchQueue.main.async {
        self.user = result.user
      }

      // If sign in succeeded, display the app's main content View.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")
    }
  }

  func signOut() {
    GIDSignIn.sharedInstance.signOut()
    // After signing out, set the `user` state variable to `nil`.
    self.user = nil
  }
}

#Preview {
  ContentView()
}

ইউআইকিট

  1. ViewController.swift খুলুন।
  2. viewDidLoad পদ্ধতির শেষে নিম্নলিখিত restorePreviousSignIn কলটি যোগ করুন:
// Attempt to restore a previous sign-in session
GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
  if let user = user {
    print("Successfully restored sign-in for user: \(user.profile?.givenName ?? "Unknown")")

    // Print the ID token when a session is restored.
    print("Restored ID Token: \(user.idToken?.tokenString ?? "")")

    // On success, update the UI for the signed-in state on the main thread.
    DispatchQueue.main.async {
      self.updateUI(for: user)
    }
  }
}

আপনার ViewController.swift ফাইলটি দেখতে এরকম হওয়া উচিত:

import GoogleSignIn
import UIKit

class ViewController: UIViewController {

  // Create an instance of the Sign in with Google button
  let signInButton = GIDSignInButton()
  let signOutButton = UIButton(type: .system)
  let welcomeLabel = UILabel()

  override func viewDidLoad() {
    super.viewDidLoad()

    // Set the width and color of the sign-in button
    signInButton.style = .standard  // Options: .standard, .wide, .iconOnly
    signInButton.colorScheme = .dark  // Options: .dark, .light

    // Add the sign-in button to your view
    view.addSubview(signInButton)

    // Position the button using constraints
    signInButton.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
      signInButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signInButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    ])

    // Add a target to the button to call a method when it's pressed
    signInButton.addTarget(self, action: #selector(signInButtonTapped), for: .touchUpInside)

    // --- Set up the Welcome Label ---
    welcomeLabel.translatesAutoresizingMaskIntoConstraints = false
    welcomeLabel.textAlignment = .center
    welcomeLabel.font = .systemFont(ofSize: 24, weight: .bold)
    view.addSubview(welcomeLabel)

    NSLayoutConstraint.activate([
      welcomeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      welcomeLabel.bottomAnchor.constraint(equalTo: signInButton.topAnchor, constant: -20),
    ])

    // --- Set up the Sign-Out Button ---
    signOutButton.translatesAutoresizingMaskIntoConstraints = false
    signOutButton.setTitle("Sign Out", for: .normal)
    view.addSubview(signOutButton)

    NSLayoutConstraint.activate([
      signOutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signOutButton.topAnchor.constraint(equalTo: signInButton.bottomAnchor, constant: 20),
    ])

    signOutButton.addTarget(self, action: #selector(signOutButtonTapped), for: .touchUpInside)

    // --- Set Initial UI State ---
    updateUI(for: nil)

    // Attempt to restore a previous sign-in session
    GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
      if let user = user {
        print("Successfully restored sign-in for user: \(user.profile?.givenName ?? "Unknown")")

        // Print the ID token when a session is restored.
        print("Restored ID Token: \(user.idToken?.tokenString ?? "")")

        // On success, update the UI for the signed-in state on the main thread.
        DispatchQueue.main.async {
          self.updateUI(for: user)
        }
      }
    }
  }

  // This method is called when the sign-in button is pressed.
  @objc func signInButtonTapped() {
    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      // If sign in succeeded, print the ID token.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")

      DispatchQueue.main.async {
        self.updateUI(for: result.user)
      }
    }
  }

  private func updateUI(for user: GIDGoogleUser?) {
    if let user = user {
      // User is signed in.
      signInButton.isHidden = true
      signOutButton.isHidden = false
      welcomeLabel.isHidden = false
      welcomeLabel.text = "Hello, \(user.profile?.givenName ?? "User")!"
    } else {
      // User is signed out.
      signInButton.isHidden = false
      signOutButton.isHidden = true
      welcomeLabel.isHidden = true
    }
  }

  @objc func signOutButtonTapped() {
    GIDSignIn.sharedInstance.signOut()
    // Update the UI for the signed-out state.
    updateUI(for: nil)
  }
}

নীরব সাইন-ইন পরীক্ষা করুন

সাইন ইন করার পর, অ্যাপটি সম্পূর্ণভাবে বন্ধ করে আবার চালু করুন। আপনি দেখতে পাবেন যে আপনি এখন স্বয়ংক্রিয়ভাবে সাইন ইন হয়ে গেছেন, বোতামটি ট্যাপ করার প্রয়োজন ছাড়াই।

১০. আইডি টোকেনটি বুঝুন

যদিও GIDGoogleUser অবজেক্টটি ব্যবহারকারীর নাম এবং ইমেল ব্যবহার করে UI ব্যক্তিগতকৃত করার জন্য সুবিধাজনক, SDK থেকে ফিরে আসা সবচেয়ে গুরুত্বপূর্ণ ডেটা হল ID টোকেন।

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

JWT টোকেন অ্যাক্সেস এবং ডিকোড করুন

  1. আপনার অ্যাপটি চালু করুন।
  2. Xcode কনসোলটি খুলুন। আপনি একটি মুদ্রিত ID টোকেন দেখতে পাবেন। এটি দেখতে eyJhbGciOiJSUzI1Ni ... Hecz6Wm4Q এর মতো হবে।
  3. আইডি টোকেনটি কপি করুন এবং JWT ডিকোড করতে jwt.io এর মতো একটি অনলাইন টুল ব্যবহার করুন।

ডিকোড করা JWTটি দেখতে এরকম হবে:

{
  "alg": "RS256",
  "kid": "c8ab71530972bba20b49f78a09c9852c43ff9118",
  "typ": "JWT"
}
{
  "iss": "https://accounts.google.com",
  "azp": "171291171076-rrbkcjrp5jbte92ai9gub115ertscphi.apps.googleusercontent.com",
  "aud": "171291171076-rrbkcjrp5jbte92ai9gub115ertscphi.apps.googleusercontent.com",
  "sub": "10769150350006150715113082367",
  "email": "example@example.com",
  "email_verified": true,
  "at_hash": "JyCYDmHtzhjkb0-qJhKsMg",
  "name": "Kimya",
  "picture": "https://lh3.googleusercontent.com/a/ACg8ocIyy4VoR31t_n0biPVcScBHwZOCRaKVDb_MoaMYep65fyqoAw=s96-c",
  "given_name": "Kimya",
  "iat": 1758645896,
  "exp": 1758649496
}

উল্লেখযোগ্য টোকেন ক্ষেত্র

ডিকোড করা আইডি টোকেনে বিভিন্ন উদ্দেশ্যে বিভিন্ন ক্ষেত্র রয়েছে। যদিও কিছু ক্ষেত্র বোঝা সহজ, যেমন নাম এবং ইমেল, অন্যগুলি আপনার ব্যাকএন্ড সার্ভার যাচাইকরণের জন্য ব্যবহার করে।

নিম্নলিখিত ক্ষেত্রটি বোঝা বিশেষভাবে গুরুত্বপূর্ণ:

  • sub : sub ফিল্ডটি ব্যবহারকারীর গুগল অ্যাকাউন্টের জন্য একটি অনন্য, স্থায়ী শনাক্তকারী। একজন ব্যবহারকারী তাদের প্রাথমিক ইমেল বা নাম পরিবর্তন করতে পারেন, কিন্তু তাদের sub আইডি কখনও পরিবর্তন হবে না। এটি আপনার ব্যাকএন্ড ব্যবহারকারী অ্যাকাউন্টের জন্য প্রাথমিক কী হিসাবে ব্যবহারের জন্য sub ফিল্ডটিকে নিখুঁত মান করে তোলে।

আইডি থেকে ব্যবহারকারীর তথ্য সংগ্রহ করুন টোকেনে সমস্ত টোকেন ক্ষেত্রগুলির অর্থ কী তা সম্পর্কে আরও তথ্য রয়েছে।

১১. অ্যাপ চেকের মাধ্যমে আপনার অ্যাপটি সুরক্ষিত করুন

আপনার প্রকল্পের পক্ষ থেকে শুধুমাত্র আপনার অ্যাপই Google এর OAuth 2.0 এন্ডপয়েন্ট অ্যাক্সেস করতে পারে তা নিশ্চিত করার জন্য অ্যাপ চেক সক্ষম করার জন্য অত্যন্ত পরামর্শ দেওয়া হচ্ছে। অ্যাপ চেক আপনার ব্যাকএন্ড পরিষেবাগুলির অনুরোধগুলি একটি আসল এবং অ-সংযোজিত ডিভাইসে আপনার খাঁটি অ্যাপ থেকে এসেছে কিনা তা যাচাই করে কাজ করে।

এই বিভাগটি দেখায় কিভাবে আপনার অ্যাপে অ্যাপ চেক ইন্টিগ্রেট করবেন এবং সিমুলেটরে ডিবাগিং এবং রিয়েল ডিভাইসে চলমান প্রোডাকশন বিল্ড উভয়ের জন্য এটি কনফিগার করবেন।

কনসোল সেটআপ

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

গুগল ক্লাউড কনসোলে অ্যাপ চেক সক্ষম করুন

  1. আপনার গুগল ক্লাউড প্রকল্পের সাথে যুক্ত ক্লায়েন্টদের তালিকায় নেভিগেট করুন।
  2. আপনার iOS অ্যাপের জন্য তৈরি করা OAuth 2.0 ক্লায়েন্ট আইডিটি নির্বাচন করুন।
  3. iOS এর জন্য Google Identity এর অধীনে অ্যাপ চেক চালু করুন

অ্যাপ চেক টগল সহ OAuth ক্লায়েন্ট সম্পাদনা পৃষ্ঠা

  1. সংরক্ষণ করুন ক্লিক করুন।

একটি API কী তৈরি করুন

  1. আপনার গুগল ক্লাউড প্রোজেক্টের জন্য API লাইব্রেরি পৃষ্ঠায় নেভিগেট করুন।
  2. অনুসন্ধান বারে Firebase অ্যাপ চেক API লিখুন।

গুগল ক্লাউড কনসোল এপিআই লাইব্রেরি পৃষ্ঠা

  1. Firebase অ্যাপ চেক API নির্বাচন করুন এবং সক্ষম করুন।
  2. APIs & Services- এ নেভিগেট করুন এবং নেভিগেশন মেনু থেকে Credentials নির্বাচন করুন।
  3. পৃষ্ঠার শীর্ষে থাকা "ক্রিয়েন্ডেল তৈরি করুন" নির্বাচন করুন।

গুগল ক্লাউড কনসোল এপিআই শংসাপত্র পৃষ্ঠা

  1. এই API কী-তে একটি নাম দিন।
  2. অ্যাপ্লিকেশন সীমাবদ্ধতার অধীনে iOS অ্যাপ নির্বাচন করুন।
  3. আপনার অ্যাপের জন্য বান্ডেল শনাক্তকারীটি একটি অনুমোদিত অ্যাপ্লিকেশন হিসেবে যোগ করুন।
  4. API বিধিনিষেধের অধীনে Restrictive key নির্বাচন করুন।
  5. ড্রপ-ডাউন মেনু থেকে Firebase অ্যাপ চেক API নির্বাচন করুন।
  6. তৈরি করুন নির্বাচন করুন।

গুগল ক্লাউড কনসোল এপিআই কী তৈরির পৃষ্ঠা

  1. তৈরি করা API কীটি কপি করুন। ভবিষ্যতে আপনার এটির প্রয়োজন হবে।

আপনার গুগল ক্লাউড প্রোজেক্টে ফায়ারবেস যোগ করুন

  1. ফায়ারবেস কনসোলে নেভিগেট করুন।
  2. একটি ফায়ারবেস প্রকল্প সেট আপ করে শুরু করুন নির্বাচন করুন।
  3. গুগল ক্লাউড প্রজেক্টে ফায়ারবেস যোগ করুন নির্বাচন করুন।

একটি বিদ্যমান গুগল ক্লাউড প্রকল্পে ফায়ারবেস যোগ করুন

  1. ড্রপ-ডাউন থেকে একটি Google ক্লাউড প্রজেক্ট নির্বাচন করুন এবং সাইন-আপ ফ্লো চালিয়ে যান।
  2. "ফায়ারবেস যোগ করুন" নির্বাচন করুন।
  3. আপনার Firebase প্রকল্প প্রস্তুত হয়ে গেলে, প্রকল্পটি খুলতে Continue নির্বাচন করুন।

ক্লায়েন্ট-সাইড কোড ইন্টিগ্রেশন

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

নিম্নলিখিত কোডটি বিল্ড টাইমে স্বয়ংক্রিয়ভাবে সঠিক সরবরাহকারী নির্বাচন করার জন্য একটি কম্পাইলার নির্দেশিকা ব্যবহার করে উভয় পরিস্থিতি পরিচালনা করে।

সুইফটইউআই

  1. মূল অ্যাপ ফাইলটি খুলুন।
  2. imports এর পরে এবং @main অ্যাট্রিবিউটের আগে নিম্নলিখিত AppDelegate ক্লাসটি সংজ্ঞায়িত করুন:
class AppDelegate: NSObject, UIApplicationDelegate {
  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
  ) -> Bool {

    #if targetEnvironment(simulator)
      // Configure for debugging on a simulator.
      // TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
      let apiKey = "YOUR_API_KEY"
      GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
        if let error {
          print("Error configuring GIDSignIn debug provider: \(error)")
        }
      }
    #else
      // Configure GIDSignIn for App Check on a real device.
      GIDSignIn.sharedInstance.configure { error in
        if let error {
          print("Error configuring GIDSignIn for App Check: \(error)")
        } else {
          print("GIDSignIn configured for App Check.")
        }
      }
    #endif

    return true
  }
}
  1. প্রদত্ত কোডে "YOUR_API_KEY" এর পরিবর্তে Google Cloud Console থেকে কপি করা API Key লিখুন।
  2. আপনার App স্ট্রাক্টের ভেতরে, body ভেরিয়েবলের ঠিক আগে, নিম্নলিখিত লাইনটি যোগ করুন। এটি আপনার অ্যাপডেলিগেট ক্লাসকে অ্যাপ লাইফসাইকেলের সাথে নিবন্ধিত করে, যা এটিকে অ্যাপ লঞ্চ এবং অন্যান্য সিস্টেম ইভেন্টগুলিতে প্রতিক্রিয়া জানাতে সক্ষম করে:
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate

আপনার মূল অ্যাপ ফাইলটি দেখতে এইরকম হওয়া উচিত:

import GoogleSignIn
import SwiftUI

class AppDelegate: NSObject, UIApplicationDelegate {
  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
  ) -> Bool {

    #if targetEnvironment(simulator)
      // Configure for debugging on a simulator.
      // TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
      let apiKey = "YOUR_API_KEY"
      GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
        if let error {
          print("Error configuring GIDSignIn debug provider: \(error)")
        }
      }
    #else
      // Configure GIDSignIn for App Check on a real device.
      GIDSignIn.sharedInstance.configure { error in
        if let error {
          print("Error configuring GIDSignIn for App Check: \(error)")
        } else {
          print("GIDSignIn configured for App Check.")
        }
      }
    #endif

    return true
  }
}

@main
struct iOS_Sign_in_with_Google_App: App {

  @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate

  var body: some Scene {
    WindowGroup {
      ContentView()

        .onOpenURL { url in
          GIDSignIn.sharedInstance.handle(url)
        }
    }
  }
}

ইউআইকিট

  1. AppDelegate.swift খুলুন।
  2. অ্যাপ চেক ইনিশিয়ালাইজেশন ধারণ করার জন্য application(_:didFinishLaunchingWithOptions:) পদ্ধতিটি আপডেট করুন:
func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {

  #if targetEnvironment(simulator)
    // Configure for debugging on a simulator.
    // TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
    let apiKey = "YOUR_API_KEY"
    GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
      if let error {
        print("Error configuring GIDSignIn debug provider: \(error)")
      }
    }
  #else
    // Configure GIDSignIn for App Check on a real device.
    GIDSignIn.sharedInstance.configure { error in
      if let error {
        print("Error configuring GIDSignIn for App Check: \(error)")
      }
    }
  #endif

  return true
}
  1. প্রদত্ত কোডে "YOUR_API_KEY" এর পরিবর্তে Google Cloud Console থেকে কপি করা API Key লিখুন।

আপনার AppDelegate.swift ফাইলটি দেখতে এরকম হওয়া উচিত:

import GoogleSignIn
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {

    #if targetEnvironment(simulator)
      // Configure for debugging on a simulator.
      // TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
      let apiKey = "YOUR_API_KEY"
      GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
        if let error {
          print("Error configuring GIDSignIn debug provider: \(error)")
        }
      }
    #else
      // Configure GIDSignIn for App Check on a real device.
      GIDSignIn.sharedInstance.configure { error in
        if let error {
          print("Error configuring GIDSignIn for App Check: \(error)")
        }
      }
    #endif

    return true
  }

  func application(
    _ app: UIApplication,
    open url: URL,
    options: [UIApplication.OpenURLOptionsKey: Any] = [:]
  ) -> Bool {
    var handled: Bool

    handled = GIDSignIn.sharedInstance.handle(url)
    if handled {
      return true
    }
    // If not handled by this app, return false.
    return false
  }

  // MARK: UISceneSession Lifecycle

  func application(
    _ application: UIApplication,
    configurationForConnecting connectingSceneSession: UISceneSession,
    options: UIScene.ConnectionOptions
  ) -> UISceneConfiguration {
    // Called when a new scene session is being created.
    // Use this method to select a configuration to create the new scene with.
    return UISceneConfiguration(
      name: "Default Configuration",
      sessionRole: connectingSceneSession.role
    )
  }

  func application(
    _ application: UIApplication,
    didDiscardSceneSessions sceneSessions: Set<UISceneSession>
  ) {
    // Called when the user discards a scene session.
    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
  }
}

সিমুলেটরে অ্যাপ চেক পরীক্ষা করুন

  1. Xcode মেনু বারে, Product > Scheme > Edit Scheme এ নেভিগেট করুন।
  2. নেভিগেশন মেনু থেকে রান নির্বাচন করুন।
  3. আর্গুমেন্টস ট্যাব নির্বাচন করুন।
  4. "লঞ্চে পাস করা আর্গুমেন্ট" বিভাগে, + নির্বাচন করুন এবং -FIRDebugEnabled যোগ করুন। এই লঞ্চ আর্গুমেন্টটি Firebase ডিবাগ লগিং সক্ষম করে।
  5. বন্ধ নির্বাচন করুন।

এক্সকোড আর্গুমেন্ট সম্পাদক পৃষ্ঠা

  1. সিমুলেটরে আপনার অ্যাপটি চালু করুন।
  2. Xcode কনসোলে প্রিন্ট করা অ্যাপ চেক ডিবাগ টোকেনটি কপি করুন।

এক্সকোড কনসোলে অ্যাপ চেক ডিবাগ টোকেন

  1. Firebase Console- এ আপনার প্রকল্পে নেভিগেট করুন।
  2. নেভিগেশন মেনুতে বিল্ড বিভাগটি প্রসারিত করুন।
  3. অ্যাপ চেক নির্বাচন করুন।
  4. অ্যাপস ট্যাবটি নির্বাচন করুন।
  5. আপনার অ্যাপের উপর কার্সার রাখুন এবং তিন-বিন্দু মেনু আইকনটি নির্বাচন করুন।

Firebase অ্যাপ চেক সেটিংস

  1. ডিবাগ টোকেন পরিচালনা করুন নির্বাচন করুন।
  2. ডিবাগ টোকেন যোগ করুন নির্বাচন করুন।
  3. আপনার ডিবাগ টোকেনের একটি নাম দিন এবং মানটির জন্য আপনার আগে কপি করা ডিবাগ টোকেনটি পেস্ট করুন।
  4. আপনার টোকেন নিবন্ধন করতে সংরক্ষণ নির্বাচন করুন।

ফায়ারবেস অ্যাপ চেক ডিবাগ টোকেন ব্যবস্থাপনা

  1. সিমুলেটরে ফিরে যান এবং সাইন ইন করুন।

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

  • ফায়ারবেস কনসোলের অ্যাপ চেক বিভাগে, API ট্যাবের অধীনে।

ফায়ারবেস অ্যাপ চেক মেট্রিক্স

  • Google Cloud Console-এ আপনার OAuth ক্লায়েন্টের সম্পাদনা পৃষ্ঠায়।

গুগল ক্লাউড কনসোল অ্যাপ চেক মেট্রিক্স

আপনার অ্যাপের অ্যাপ চেক মেট্রিক্স পর্যবেক্ষণ করার পরে এবং বৈধ অনুরোধগুলি যাচাই করা হচ্ছে কিনা তা নিশ্চিত করার পরে, আপনার অ্যাপ চেক এনফোর্সমেন্ট সক্ষম করা উচিত। একবার প্রয়োগ করা হলে, অ্যাপ চেক সমস্ত অযাচাইকৃত অনুরোধ প্রত্যাখ্যান করে, নিশ্চিত করে যে শুধুমাত্র আপনার খাঁটি অ্যাপ থেকে আসা ট্র্যাফিক আপনার প্রকল্পের পক্ষে Google এর OAuth 2.0 এন্ডপয়েন্ট অ্যাক্সেস করতে পারে।

১২. অতিরিক্ত সম্পদ

অভিনন্দন!

আপনি একটি OAuth 2.0 iOS ক্লায়েন্ট কনফিগার করেছেন, একটি iOS অ্যাপে একটি Sign In with Google বোতাম যোগ করেছেন, বোতামটি কেমন দেখাবে তা কাস্টমাইজ করতে শিখেছেন, একটি JWT ID টোকেন ডিকোড করেছেন এবং আপনার অ্যাপের জন্য অ্যাপ চেক সক্ষম করেছেন।

এই লিঙ্কগুলি আপনাকে পরবর্তী পদক্ষেপগুলিতে সাহায্য করতে পারে:

সচরাচর জিজ্ঞাস্য