Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Authentication all auth
  5. ৭. django-allauth Google Login (DRF)

৭. django-allauth Google Login (DRF)

পার্ট ১ : Django প্রজেক্ট সেটআপ এবং প্রয়োজনীয় প্যাকেজ ইন্সটল করা

প্রথমে নতুন Django প্রজেক্ট তৈরি করুন:

django-admin startproject myproject
cd myproject

প্রয়োজনীয় প্যাকেজ ইন্সটল করুন:

Django, Django REST Framework, এবং Django-Allauth ইনস্টল করতে নিচের কমান্ডগুলো ব্যবহার করুন:

Django REST Framework দিয়ে django-allauth এর Google Login API বানানোর জন্য dj-rest-auth ব্যবহার করা যেতে পারে। dj-rest-auth হলো django-allauth এর সাথে REST API এর মাধ্যমে authentication এবং social login (যেমন Google, Facebook) সহজেই ব্যবহারের জন্য একটি প্যাকেজ।

pip install django djangorestframework django-allauth  dj-rest-auth djangorestframework-simplejwt

settings.py কনফিগারেশন আপডেট করুন:

আপনার প্রজেক্টের settings.py ফাইলে নিম্নলিখিত কনফিগারেশনগুলো যোগ করুন:

INSTALLED_APPS = [
    # Django অ্যাপগুলো
    'django.contrib.sites',
    # Third-party অ্যাপগুলো
    'rest_framework',
    'rest_framework.authtoken',  # <-- Add this line

    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google',  # Google login
    'dj_rest_auth',  # dj-rest-auth অ্যাপ
    'dj_rest_auth.registration',  # Social login registration
    'rest_framework_simplejwt',  # Simple JWT অ্যাপ
]
# Use a dummy email backend for development
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
MIDDLEWARE = [
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'allauth.account.middleware.AccountMiddleware',  # allauth middleware
]

# Authentication backends
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
]

SITE_ID = 1

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework_simplejwt.authentication.JWTAuthentication',

    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

REST_USE_JWT = True

Google OAuth2 কনফিগারেশন

Google OAuth2 এর জন্য SOCIALACCOUNT_PROVIDERS কনফিগারেশন:

SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'SCOPE': [
            'profile',
            'email',
        ],
        'AUTH_PARAMS': {
            'access_type': 'online',
        }
    }
}

urls.py ফাইলে allauth এর URL অন্তর্ভুক্ত করুন

আপনার প্রজেক্টের মূল urls.py ফাইলে allauth এর URL প্যাটার্ন যুক্ত করুন।

# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
from allauth.socialaccount.providers.google.views import GoogleOAuth2Adapter
from dj_rest_auth.registration.views import SocialLoginView
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

class GoogleLogin(SocialLoginView):
    adapter_class = GoogleOAuth2Adapter

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('allauth.urls')),  # allauth URL
    path('api/auth/', include('dj_rest_auth.urls')),  # dj-rest-auth URL
    path('api/auth/registration/', include('dj_rest_auth.registration.urls')),  # registration URL
    path('api/auth/google/', GoogleLogin.as_view(), name='google_login'),  # Google login API endpoint
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),  # JWT টোকেন অবটেইন
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),  # JWT টোকেন রিফ্রেশ
]

মাইগ্রেশন রান করুন:

মডেলগুলো তৈরি করতে এবং ডেটাবেস আপডেট করতে নিচের কমান্ড রান করুন:

python manage.py migrate

একটি Superuser তৈরি করুন:

আপনার সাইটে অ্যাডমিন প্যানেল ব্যবহারের জন্য একটি Superuser তৈরি করুন:

python manage.py createsuperuser

সাইট কনফিগার করুন:

  • Sites মডিউলে গিয়ে example.com সাইটে ক্লিক করুন বা নতুন একটি সাইট তৈরি করুন।
  • Domain name এবং Display name এ আপনার লোকাল হোস্ট বা প্রকৃত ডোমেইন দিন, যেমন:
    • Domain name: 127.0.0.1 (ডেভেলপমেন্টে) অথবা আপনার প্রোডাকশন ডোমেইন
    • Display name: আপনার সাইটের নাম

পার্ট ২ :

ধাপ ১: Google API Console-এ একটি প্রজেক্ট তৈরি করুন

  1. Google API Console-এ যান: Google API Console
  2. প্রজেক্ট তৈরি করুন:
    • ড্যাশবোর্ডে Select a project ক্লিক করুন এবং New Project সিলেক্ট করুন।
    • একটি প্রজেক্ট নাম দিন এবং Create ক্লিক করুন।

১। google ক্লাউড কনসোল এর লিংক এ প্রবেশ করি তাহলে নিচের মতো দেখতে পাবো

২। প্রজেক্ট তৈরী করি

ধাপ ২: OAuth Consent Screen সেটআপ করুন

  1. OAuth consent screen অপশনে যান।
    • External নির্বাচন করুন (এটি সাধারণত বাহ্যিক ইউজারদের জন্য হয়) এবং Create ক্লিক করুন।
  2. App Information পূরণ করুন:
    • App name-এ অ্যাপের নাম লিখুন।
    • User support email এ আপনার ইমেইল এড্রেস দিন।
    • Developer contact information ফিল্ডেও আপনার ইমেইল লিখুন।
  3. Scopes যোগ না করলেও চলবে এখন, এটি পরে আপডেট করা যাবে।
  4. Save and Continue ক্লিক করে পরবর্তী ধাপে যান।

ধাপ ৩: OAuth 2.0 Credentials তৈরি করুন

  1. Credentials পেজে যান।
    • Create Credentials এ ক্লিক করুন এবং OAuth client ID নির্বাচন করুন।
  2. Application type হিসেবে Web application নির্বাচন করুন।
  3. Authorized redirect URIs এ আপনার ডোমেইনের জন্য Redirect URI যোগ করুন। ডেভেলপমেন্টের সময় এটি সাধারণত এমন হয়:
http://localhost:8000/accounts/google/login/callback/
  1. Production এ আপনার সঠিক ডোমেইন উল্লেখ করতে হবে।
  2. Create ক্লিক করলে আপনার জন্য Client ID এবং Client Secret তৈরি হয়ে যাবে।
  3. Client ID এবং Client Secret সংরক্ষণ করুন, কারণ এগুলো Django অ্যাপ্লিকেশনের সেটআপে লাগবে।

৩। এবার প্রজেক্ট সিলেক্ট করে credentials তৈরী করি এবং Oauth client id তে ক্লিক করি

http://127.0.0.1:8000 for Authorized JavaScript origins

http://127.0.0.1:8000/accounts/google/login/callback/ for Authorized redirect URIs

আমি যখন লোকালহোস্ট এ চালাচ্ছিলাম তখন এরর দিচ্ছিলো কারণ আমার ইউআরএল ছিল http://localhost:8000/ পরে আমি এটা পরিবর্তন করলে ঠিক হয়ে যায়

ধাপ ৪: Google Credentials Django-তে কনফিগার করা

  1. Django Admin Panel এ যান এবং Sites মডিউলে localhost বা আপনার প্রজেক্টের ডোমেইন যোগ করুন।
  2. Social Applications এ যান:
    • Provider হিসেবে Google সিলেক্ট করুন।
    • Client ID এবং Client Secret দিয়ে ফর্মটি পূরণ করুন।
    • “Sites” ফিল্ডে আপনার সাইট সিলেক্ট করুন।

Provider: Google নির্বাচন করুন।

Provider ID: এটি ফাঁকা রাখুন। সাধারণত এটি প্রয়োজন হয় না।

Name: একটি সহজে বোঝার মতো নাম দিন, যেমন Google OAuth

Client id: আপনার JSON ফাইলে থাকা client_id এর মান এখানে বসান:

656075529100-mhre4t4qn5rf6geel6lrb3b952b7h09v.apps.googleusercontent.com

Secret key: আপনার JSON ফাইল থেকে client_secret এর মান এখানে বসান:

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
  1. Key: এটি ফাঁকা রাখুন, কারণ Google OAuth সেটআপের জন্য এটি সাধারণত প্রয়োজন হয় না।
  2. Settings: এটি ফাঁকা রাখুন যদি বিশেষ কোনো সেটিংস প্রয়োজন না হয়।

সব কিছু পূরণ করার পর SAVE বাটনে ক্লিক করে সেভ করুন।

ধাপ ৫: Django সার্ভার চালিয়ে টেস্ট করুন

সবকিছু ঠিকভাবে কনফিগার হয়ে থাকলে, আপনার Django অ্যাপে Google Login অপশন কাজ করবে।

এবার আপনি ব্রাউজারে গিয়ে /accounts/login/ URL-এ Google Login অপশন দেখতে পাবেন।

Rest ফ্রেমওয়ার্ক দিয়ে এক্সেস টোকেন পাওয়া এজন্য প্রজেক্ট এর urls.py তে নিচের কোড করি

from django.contrib import admin
from django.urls import path, include
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
from .views import google_login_redirect, google_login_callback

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('allauth.urls')),
    path('api/auth/', include('dj_rest_auth.urls')),  # dj-rest-auth URLs
    path('api/auth/registration/', include('dj_rest_auth.registration.urls')),  # Registration URLs
    path('api/auth/google/', google_login_redirect, name='google_login_redirect'),  # Google login redirect URL
    path('api/auth/google/callback/', google_login_callback, name='google_login_callback'),  # Callback for Google login
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),  # JWT Token Obtain endpoint
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),  # JWT Token Refresh endpoint
]

এবং view তে নিচের কোড করি

from django.shortcuts import redirect
from django.http import JsonResponse
from allauth.socialaccount.models import SocialApp
from allauth.socialaccount.providers.google.provider import GoogleProvider
import requests
from rest_framework_simplejwt.tokens import RefreshToken
from django.contrib.auth.models import User

# Custom Redirect View for Google login
def google_login_redirect(request):
    app = SocialApp.objects.get(provider=GoogleProvider.id)
    client_id = app.client_id
    redirect_uri = "http://localhost:8000/api/auth/google/callback/"
    scope = " ".join(["email", "profile"])
    auth_url = (
        f"https://accounts.google.com/o/oauth2/auth?client_id={client_id}"
        f"&redirect_uri={redirect_uri}&scope={scope}&response_type=code"
    )
    return redirect(auth_url)

# Callback View for Google login
def google_login_callback(request):
    authorization_code = request.GET.get('code')
    
    if not authorization_code:
        return JsonResponse({"error": "Authorization code not found"}, status=400)
    
    app = SocialApp.objects.get(provider=GoogleProvider.id)
    client_id = app.client_id
    client_secret = app.secret
    redirect_uri = "http://localhost:8000/api/auth/google/callback/"
    
    # Google token endpoint
    token_url = "https://oauth2.googleapis.com/token"
    
    # Prepare the data to request the access token
    token_data = {
        'code': authorization_code,
        'client_id': client_id,
        'client_secret': client_secret,
        'redirect_uri': redirect_uri,
        'grant_type': 'authorization_code'
    }
    
    # Send the POST request to get the access token
    response = requests.post(token_url, data=token_data)
    
    if response.status_code != 200:
        return JsonResponse({"error": "Failed to fetch access token", "details": response.json()}, status=500)
    
    token_info = response.json()
    access_token = token_info.get('access_token')
    refresh_token = token_info.get('refresh_token')
    
    if not access_token:
        return JsonResponse({"error": "Access token not found in response"}, status=500)
    
    # Get user info from Google using the access token
    user_data = requests.get(
        "https://www.googleapis.com/oauth2/v2/userinfo",
        headers={"Authorization": f"Bearer {access_token}"}
    ).json()
    
    # Check if the user exists in the system
    user = User.objects.filter(email=user_data['email']).first()
    
    if not user:
        # If user doesn't exist, create a new user
        user = User.objects.create_user(
            username=user_data['email'], 
            email=user_data['email'], 
            password=None  # Set a default password if needed
        )
    
    # Generate JWT token
    refresh = RefreshToken.for_user(user)
    return JsonResponse({
        'access_token': str(refresh.access_token),
        'refresh_token': str(refresh),
    })

এবং গুগল cloude কনসোল এর রিডাইরেক্ট ইউআরএল এ নিচের মত করি

http://localhost:8000/api/auth/google/callback/

এখন লগইন এর জন্য এই ইউআরএল এ যেতে হবে

http://localhost:8000/api/auth/google/

How can we help?