Thứ năm, 12/12/2019 | 00:00 GMT+7

Xác thực Django với Facebook, Instagram và LinkedIn

Đăng ký thủ công và đăng nhập vào account trực tuyến đôi khi có thể gây khó khăn. Các ứng dụng web hiện đại giải quyết vấn đề này thông qua xác thực xã hội, chủ yếu là một cách cho phép user đăng nhập (và đăng ký) ứng dụng bằng thông tin đăng nhập từ nhà cung cấp mạng xã hội mà họ đã có account .

Trong hướng dẫn này, ta sẽ xây dựng một ứng dụng Django cho phép user đăng nhập thông qua account Facebook, Instagram và LinkedIn của họ. Để làm điều này, ta sẽ sử dụng thư viện social-auth-app-django . Ta cũng sẽ học cách extract thông tin bổ sung như ảnh profile và tên user từ các account xã hội tương ứng.

Vào cuối hướng dẫn này, ta sẽ có ứng dụng cuối cùng hoạt động như sau:

Hoạt ảnh của sản phẩm cuối cùng

Mã nguồn của dự án này có sẵn trên GitHub .

Yêu cầu

Bạn cần cài đặt các mục sau trên máy của bạn để làm theo hướng dẫn này:

  1. Python3
  2. Pipenv

Pipenv là một công cụ sẵn sàng production nhằm mục đích mang lại những gì tốt nhất trong tất cả các thế giới đóng gói cho thế giới Python. Nó khai thác Pipfile, pip và virtualenv thành một lệnh duy nhất.

Hướng dẫn này giả định người đọc có kiến thức làm việc cơ bản với Django. Bạn cũng cần có account Facebook, Instagram và LinkedIn.

Hãy đi sâu vào ngay!

Bước 1 - Cài đặt ứng dụng Django

Trong phần này, ta sẽ tạo một dự án Django mới và cài đặt các phụ thuộc. Hãy bắt đầu bằng cách tạo một folder mới và đặt nó trở thành folder làm việc hiện tại:

    $ mkdir django_social_app     $ cd django_social_app 

Ta sẽ tạo và kích hoạt một môi trường ảo mới bằng Pipenv; điều này có tác dụng tạo ra một môi trường Python cô lập và ngăn ta làm ô nhiễm folder gói global khi ta cài đặt các phụ thuộc Django. Ta cũng sẽ cài đặt djangosocial-auth-app-django :

    $ pipenv shell     $ pipenv install django social-auth-app-django 

social-auth-app-django giới thiệu việc triển khai xác thực xã hội với Django.

Hãy tạo (và chuyển vào) một dự án Django mới, ta sẽ gọi nó là social_app:

    $ (django_social_app) $ django-admin startproject social_app     $ (django_social_app) $ cd social_app 

Lưu ý : Điều quan trọng là ta phải chạy các lệnh từ terminal có nguồn root trong môi trường ảo, tức là hiển thị (django_social_app) ở đầu mỗi dòng lệnh.

Tiếp theo, ta sẽ tạo một ứng dụng Django có tên là core , ứng dụng này sẽ chứa tất cả các khung nhìn và mẫu của ta :

    (django_social_app) $ python manage.py startapp core 

Lưu ý : Bạn cần ở trong folder social_app mẹ để chạy các lệnh 'python management.py *'.

Hãy tìm file settings.py trong dự án social_app và thêm cả coresocial-auth-app-django dưới dạng INSTALLED_APPS :

    #social_app/settings.py      INSTALLED_APPS = [         'django.contrib.admin',         'django.contrib.auth',         'django.contrib.contenttypes',         'django.contrib.sessions',         'django.contrib.messages',         'django.contrib.staticfiles',         'social_django', # add this          'core' # add this       ] 

Cuối cùng, hãy di chuyển database :

    (django_social_app) $ python manage.py migrate 

Cấu hình các lớp xác thực

Đằng sau mức thấp , Django duy trì một danh sách " backend xác thực" mà nó kiểm tra trong quá trình xác thực user . Nếu phương pháp xác thực đầu tiên không thành công, Django sẽ thử phương pháp thứ hai, v.v., cho đến khi tất cả các backend đã được thử.

Mảng AUTHENTICATION_BACKENDS chứa danh sách các lớp backend xác thực (dưới dạng chuỗi) và theo mặc định được đặt thành:

    ['django.contrib.auth.backends.ModelBackend'] 

Ta có thể cập nhật nó và thêm các lớp xác thực mới để cho phép xác thực với các nền tảng xã hội mà ta đang xem xét trong hướng dẫn này.

Để cập nhật nó, hãy thêm mã sau vào file settings.py :

    #social_app/settings.py      #add this     AUTHENTICATION_BACKENDS = [         'social_core.backends.linkedin.LinkedinOAuth2',         'social_core.backends.instagram.InstagramOAuth2',         'social_core.backends.facebook.FacebookOAuth2',         'django.contrib.auth.backends.ModelBackend',     ] 

Ta vừa thêm các lớp backend xác thực cho Linkedin, Instagram và Facebook.
Bạn có thể tìm thấy danh sách các lớp backend xác thực được hỗ trợ bởi social-auth-app-django tại đây.

Thêm mẫu và file tĩnh

Ta chỉ làm việc về cài đặt và cấu hình ứng dụng, hãy chuyển sang một cái gì đó trực quan ngay bây giờ. Trong phần này, ta sẽ xây dựng nền tảng của các mẫu sẽ hiển thị ứng dụng.

Hãy tạo một folder mới trong folder core , ta sẽ gọi đây là các templates folder :

    (django_social_app) $ cd core/     (django_social_app) $ mkdir templates/ 

Tạo ba file trong folder templates và gọi chúng:

  1. base.html
  2. login.html
  3. home.html

Bây giờ, hãy mở file base.html và paste vào đoạn mã sau:

    <!-- templates/base.html -->      {% load static %}     <!DOCTYPE html>     <html lang="en">     <head>         <meta charset="UTF-8" />         <meta name="viewport" content="width=device-width, initial-scale=1.0" />         <meta http-equiv="X-UA-Compatible" content="ie=edge" />         <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"             crossorigin="anonymous" />         <link rel="stylesheet" href="{% static 'css/index.css' %}" />         <title>Social Auth with Django</title>     </head>     <body>         <div class="container-fluid">             <div>                 <h1 class="text-white text-center">{% block title %}{% endblock %}</h1>                 <div class="card p-5">                     {% block content %}                     {% endblock %}                 </div>             </div>         </div>     </body>     </html> 

Dán đoạn mã sau vào file login.html :

   <!-- templates/login.html -->      {% extends 'base.html' %}     {% block title %} Sign in {% endblock %}     {% block content %}     <div class="row">         <div class="col-md-8 mx-auto social-container my-2 order-md-1">             <button class="btn btn-danger  mb-2">                 <a href="#">Login with Instagram</a>             </button>             <button class="btn btn-primary mb-2">                 <a href="#">Login with Facebook                 </a>             </button>             <button class="btn btn-info mb-2">                 <a href="#">Login with LinkedIn</a>             </button>         </div>     </div>     </div>     {% endblock %} 

Cuối cùng, cập nhật file home.html với mã bên dưới:

    <!-- templates/home.html -->      {% extends 'base.html' %}     {% block title %} Home {% endblock %}     {% block content %}     <div class="row">         <div class="col-sm-12 mb-3">             <h4 class="text-center"> Welcome {{ user.username }} </h4>         </div>     </div>     {% endblock %} 

Ta cần một số kiểu để giúp mã của ta trông đẹp mắt khi hiển thị, vì vậy hãy tạo một folder có tên static trong folder root của folder core và ta sẽ lưu trữ các kiểu của bạn ở đó.

Tạo một folder được gọi là folder css trong folder static và cuối cùng, tạo file index.css trong folder css .

Bây giờ, hãy mở file index.css và cập nhật nó bằng mã sau:

    /_ index.css _/      img {       border: 3px solid #282c34;     }     .container-fluid {       height: 100vh;       background-color: #282c34;       display: flex;       justify-content: center;       align-items: center;     }     .container-fluid > div {       width: 85%;       min-width: 300px;       max-width: 500px;     }     .card {       width: 100%;     }     .social-container {       display: flex;       flex-direction: column;       justify-content: center;     }     .btn a, .btn a:hover {       color: white;       text-decoration: none ;     } 

Cài đặt Chế độ xem và URL

Trong phần này, ta sẽ xác định Chế độ xem và đăng ký các URL mà ứng dụng cần để hoạt động, vì vậy hãy mở file core/views.py và thay thế nội dung của nó bằng đoạn mã bên dưới:

    # core/views.py      from django.shortcuts import render     from django.contrib.auth.decorators import login_required      # Create your views here.     def login(request):       return render(request, 'login.html')      @login_required     def home(request):       return render(request, 'home.html') 

Tiếp theo, ta sẽ đăng ký các tuyến đường cho ứng dụng và đính kèm các chức năng xem phù hợp của chúng. Thay thế nội dung của social_app/urls.py bằng mã bên dưới:

    # social_app/urls.py      from django.contrib import admin     from django.urls import path, include     from django.contrib.auth import views as auth_views     from core import views      urlpatterns = [         path('admin/', admin.site.urls),         path("login/", views.login, name="login"),         path("logout/", auth_views.LogoutView.as_view(), name="logout"),         path('social-auth/', include('social_django.urls', namespace="social")),         path("", views.home, name="home"),     ] 

Trong file settings.py , ta cần đặt bốn giá trị mới - LOGIN_URL , LOGOUT_URL , LOGIN_REDIRECT_URLLOGOUT_REDIRECT_URL - vì chúng sẽ được sử dụng để chuyển hướng user khi quá trình xác thực hoàn tất:

    # social_app/settings.py      # [...]      LOGIN_URL = 'login'     LOGIN_REDIRECT_URL = 'home'     LOGOUT_URL = 'logout'     LOGOUT_REDIRECT_URL = 'login'      # [...] 

Tuyệt diệu! Bây giờ ta có thể chạy ứng dụng để xem những gì ta đã xây dựng cho đến nay. Hãy khởi động server bằng lệnh này:

    (django_social_app) $ python manage.py runserver 

Lưu ý : Bạn cần ở trong folder social_app mẹ để chạy các lệnh 'python management.py *'.

Ta có thể xem ứng dụng trên http: // localhost: 8000 , mặc dù ta sẽ được chuyển hướng đến /login vì ta không được xác thực:

Ảnh chụp màn hình ứng dụng có  các node

Trông được! Trong các phần tiếp theo, ta sẽ đăng ký ứng dụng của bạn với các nhà cung cấp mạng xã hội để user có thể được xác thực thông qua các nền tảng xã hội.

Bước 2 - Xác thực Facebook

Trong phần này, ta sẽ thực hiện các thao tác nâng cao và cài đặt xác thực qua Facebook.

Nhận thông tin đăng nhập Facebook

Trụ sở để các nhà phát triển Facebook trang , sau khi đăng nhập, click vào Add a App mới và nhập các chi tiết cho các ứng dụng trên cửa sổ modal đó xuất hiện:

Ảnh chụp màn hình trang của Nhà phát triển Facebook
Khi ứng dụng đã được tạo, bạn sẽ được chuyển hướng đến trang tổng quan của ứng dụng. Ở phía bên trái của màn hình, nhấp vào ** Cài đặt , sau đó nhấp vào tùy chọn ** Cơ bản xuất hiện ngay bên dưới nó.

Khi màn hình mới tải, trong phần Tên domain ứng dụng , hãy thêm server localhost như sau:

Ảnh chụp màn hình của biểu mẫu ứng dụng

Bây giờ hãy cuộn xuống cho đến khi bạn thấy một tùy chọn cho biết Thêm nền tảng , hãy nhấp vào nó và chọn tùy chọn Trang web . Thao tác này sẽ tạo một phần trang web nơi bạn sẽ thấy URL của trang web , thêm http://localhost:8000/ vào đầu vào và nhấp vào nút Lưu thay đổi :

Ảnh chụp màn hình của biểu mẫu ứng dụng

Bây giờ, sao chép ID ứng dụng và bí mật ứng dụng từ trang tổng quan ứng dụng và thêm chúng vào file settings.py :

    # social_app/settings.py      #[...]      SOCIAL_AUTH_FACEBOOK_KEY = YOUR_APP_KRY        # App ID     SOCIAL_AUTH_FACEBOOK_SECRET = YOUR_APP_SECRET  # App Secret      #[...] 

Thay thế các phím YOUR_APP_ * bằng các giá trị từ console ứng dụng Facebook của bạn.

Hãy cập nhật URL của nút Đăng nhập bằng Facebook trong file login.html bằng file này:

    <!-- templates/login.html -->              <button class="btn btn-primary mb-2">                 <a href="{% url 'social:begin' 'facebook' %}">Login with Facebook</a>             </button> 

Khởi động web server và truy cập localhost:8000/login để kiểm tra rằng bây giờ ta có thể đăng nhập vào ứng dụng thông qua Facebook:

    (django_social_app) $ python manage.py runserver 

Lưu ý : Bạn cần ở trong folder social_app mẹ để chạy các lệnh 'python management.py *'.

Khi ta nhấp vào nút Đăng nhập bằng Facebook , ta sẽ được chuyển hướng đến một trang tương tự như bên dưới:

Ảnh chụp màn hình Facebook

Nhấp vào Tiếp tục vì USERNAME sẽ chuyển hướng đến trang chủ và tên user của bạn sẽ được hiển thị. Ta đã được xác thực thành công qua Facebook:

Ảnh chụp màn hình của ứng dụng do Facebook xác thực
Bạn muốn biết những gì vừa xảy ra ở mức thấp ? Hãy cùng tìm hiểu; ta sẽ tạo một account superuser để truy cập bảng quản trị:

    (django_social_app) $ python manage.py createsuperuser 

Bạn sẽ nhận được dấu nhắc nhập tên user , email và password cho superuser. Đảm bảo nhập các chi tiết mà bạn có thể nhớ vì bạn cần chúng để đăng nhập vào console quản trị trong thời gian ngắn.

Sau khi tạo account superuser, ta sẽ chạy server và truy cập bảng quản trị trên địa chỉ này - http: // localhost: 8000 / admin / :

Ảnh chụp trang xác thực quản trị Django
Ta có thể thấy rằng một User mới (ngoài siêu user ) đã được tạo trong danh mục User :

Ảnh chụp trang  admin-user  Django

Ta cũng sẽ thấy rằng có một account mới trong danh mục Xác thực mạng xã hội của user :

Ảnh chụp trang xác thực xã hội của  admin-user  Django

Lời giải thích cho sự tồn tại của các account này mới là: Khi user đăng nhập vào các ứng dụng sử dụng Facebook (hoặc bất kỳ nhà cung cấp mạng xã hội), một user mới và user Auth xã hội dụ được tạo ra. User Social Auth được liên kết với account User lần đầu tiên, sau đó, version User được truy vấn từ database .

Cá thể User được tạo bằng cách sử dụng các chi tiết nhận được từ nhà cung cấp mạng xã hội. Trong trường hợp này, Facebook đã gửi lại trường first_namelast_name của Trường hợp người dùng đã tạo và tên user là sự ghép nối của first_namelast_name .

Một số nhà cung cấp xã hội (như Instagram) sẽ trả lại tên user của user trên nền tảng của họ và điều này được sử dụng (thay vì nối) cho cá thể User đã tạo trên ứng dụng.

Ta không muốn ứng dụng của bạn chỉ hiển thị tên user , ta muốn nhận thêm dữ liệu * User * chẳng hạn như ảnh profile , vì vậy hãy yêu cầu thêm dữ liệu từ Facebook.

Lưu ý : Bạn cần đăng xuất khỏi bảng quản trị để tiếp tục.

Mở file settings.py và cập nhật nó cho phù hợp:

    # settings.py      TEMPLATES = [         {             'BACKEND': 'django.template.backends.django.DjangoTemplates',             'DIRS': [],             'APP_DIRS': True,             'OPTIONS': {                 'context_processors': [                     'django.template.context_processors.debug',                     'django.template.context_processors.request',                     'django.contrib.auth.context_processors.auth',                     'django.contrib.messages.context_processors.messages',                     'social_django.context_processors.backends', # add this                     'social_django.context_processors.login_redirect', # add this                 ],             },         },     ]      SOCIAL_AUTH_FACEBOOK_KEY = YOUR_APP_SECRET          # App ID     SOCIAL_AUTH_FACEBOOK_SECRET = YOUR_APP_SECRET       # App Secret     SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'user_link'] # add this     SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {       # add this       'fields': 'id, name, email, picture.type(large), link'     }     SOCIAL_AUTH_FACEBOOK_EXTRA_DATA = [                 # add this         ('name', 'name'),         ('email', 'email'),         ('picture', 'picture'),         ('link', 'profile_url'),     ] 

Thay thế các phím YOUR_APP_ * bằng các giá trị từ console ứng dụng Facebook của bạn.

Bộ xử lý ngữ cảnh social_django giúp thêm dữ liệu backend và liên kết vào ngữ cảnh mẫu. Điều này giúp ta có thể truy cập dữ liệu về user đã xác thực bằng cách sử dụng thẻ mẫu. Bạn có thể đọc thêm về nó ở đây .

Khi user đăng nhập vào ứng dụng qua Facebook, ta có thể truy cập vào một tập hợp con dữ liệu của user bằng cách sử dụng quyền; quyền là cách ta hỏi liệu ta có thể truy cập dữ liệu trên Facebook hay không. Trong đoạn mã trên, SOCIAL_AUTH_FACEBOOK_SCOPE chứa danh sách các quyền để truy cập các thuộc tính dữ liệu mà ứng dụng của ta yêu cầu. Quyền email và user_link yêu cầu quyền truy cập vào liên kết profile và email Facebook của user tương ứng.

Hãy khởi động server ngay bây giờ, truy cập http: // localhost: 8000 / login / và thử đăng nhập qua Facebook:

Gửi để xem xét đăng nhập thông qua ảnh chụp màn hình Facebook

Nhấp vào Tiếp tục với quyền USERNAME sẽ cấp cho ứng dụng quyền truy cập vào dữ liệu cá nhân của user trên Facebook và vì lý do này, để yêu cầu một số quyền, bạn cần gửi đơn đăng ký của bạn để được group Facebook xem xét đảm bảo rằng dữ liệu được trả lại không sử dụng sai mục đích. Bạn có thể tìm thấy danh sách các quyền của Facebook tại đây.

SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS có một khóa - fields - trong đó giá trị là danh sách các thuộc tính sẽ được Facebook trả về khi user đăng nhập thành công. Các giá trị phụ thuộc vào SOCIAL_AUTH_FACEBOOK_SCOP .

Khi user đăng nhập bằng Facebook, API Facebook trả về dữ liệu được yêu cầu trong SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS . Để lưu trữ dữ liệu trong database , ta cần chỉ định chúng trong SOCIAL_AUTH_FACEBOOK_EXTRA_DATA .

Dữ liệu bổ sung sẽ được lưu trữ trong trường extra_data của version User Social Auth :

Trường dữ liệu bổ sung của quản trị Django
Bây giờ, hãy cập nhật giao diện user để hiển thị dữ liệu bổ sung mà ta nhận được từ Facebook, ta sẽ mở file home.html và thay thế nội dung của nó bằng file này:

<!-- home.html -->      {% extends 'base.html' %}     {% block title %} Home {% endblock %}     {% block content %}       <div class="row">         <div class="col-sm-12 mb-3">           <h4 class="text-center">Welcome {{ user.username }}</h4>         </div>              <!-- Add from here -->         {% for ass in backends.associated %}           {% if ass.provider == 'facebook' %}             <div class="col-md-6 text-center">                 <img src="{{ass.extra_data.picture.data.url}}" alt="" width="150" height="150" style="border-radius: 50%">             </div>             <div class="col-md-6 social-container my-2">                 <p> Signed in via:  {{ ass.provider }} </p>                 <p> Name:  {{ ass.extra_data.name }} </p>                 <p> Provider url: <a href="{{ass.extra_data.profile_url}}">link</a></p>             </div>           {% endif %}         {% endfor %}         <div class="col-sm-12 mt-2 text-center">           <button class="btn btn-danger">             <a href="{% url 'logout' %}">Logout</a>           </button>         </div>             <!-- End here -->       </div>     {% endblock %} 

Bây giờ ta có thể truy cập địa chỉ trang chủ của ứng dụng - http: // localhost: 8000 / - trên trình duyệt web và xem dữ liệu bổ sung:

Ảnh chụp màn hình của ứng dụng với nhiều chi tiết hơn được kéo vào

Lưu ý: Bây giờ ta có quyền truy cập vào dữ liệu được lưu trữ trong trường `extra_data` bởi vì ta đã thêm bộ xử lý ngữ cảnh vào` TEMPLATES`; điều này cho phép ta truy cập dữ liệu ` backend ` trong giao diện user .

Xin chúc mừng! ta đã xác thực thành công qua Facebook và bây giờ có thể chuyển sang cài đặt nhà cung cấp mạng xã hội tiếp theo.

Bước 3 - Xác thực Instagram

Thấy rằng ta đã đi vào chi tiết về cách mọi thứ hoạt động đằng sau mức thấp , ta có thể cài đặt xác thực Instagram chỉ trong ba bước:

  • Nhận thông tin đăng nhập API

  • Cài đặt chương trình backend

  • Cài đặt giao diện user

Đi nào!

Nhận thông tin đăng nhập API

Hãy truy cập trang nhà phát triển Instagram và nhấp vào Đăng ký ứng dụng của bạn:

Trang đăng ký Instagram

Trên màn hình xuất hiện tiếp theo, nhấp vào Đăng ký Khách hàng Mới và điền thông tin chi tiết cho đơn đăng ký:

Instagram đăng ký trang id khách hàng mới
Lưu ý : Instagram (và hầu hết các nhà cung cấp mạng xã hội) yêu cầu URL chuyển hướng sẽ là địa chỉ mà trình duyệt của user sẽ được chuyển đến sau khi xác thực. Đối với hướng dẫn này, ta sẽ sử dụng địa chỉ này http: // localhost: 8000 / social-auth / complete / instagram / . Bạn có thể tìm hiểu thêm về điều này ở đây .

Đăng ký thành công ứng dụng sẽ trả về màn hình như sau:

Instagram quản lý trang khách hàng
Bây giờ, ta sẽ nhấp vào tùy chọn Quản lý để lấy ID khách hàng và Bí mật khách hàng của ứng dụng:

Ứng dụng quản lý khách hàng và bí mật trên Instagram
Lưu ý : Ta cần ID và Bí mật để cấu hình phần backend .

Cài đặt chương trình backend

Hãy thêm mã này vào file settings.py :

    # settings.py      #[...]      # add this code     SOCIAL_AUTH_INSTAGRAM_KEY = YOUR_CLIENT_ID         #Client ID     SOCIAL_AUTH_INSTAGRAM_SECRET = YOUR_CLIENT_SECRET  #Client SECRET     SOCIAL_AUTH_INSTAGRAM_EXTRA_DATA = [         ('user', 'user'),     ]      #[...] 

Thay thế các khóa YOUR_CLIENT_ * bằng các giá trị từ ứng dụng Instagram của bạn.

Với đoạn mã trên, một khi user được xác thực qua Instagram, một đối tượng user sẽ được gửi lại ứng dụng. Ta thêm đối tượng này vào SOCIAL_AUTH_INSTAGRAM_EXTRA_DATA vì ta muốn nó được lưu trữ trong database để tham khảo.

Đối tượng user được trả về ở định dạng này:

    {       "id": ...,       "username": ...,       "profile_picture": ...,       "full_name": ...,       "bio": ...,       "website": ...,       "is_business": ...,     } 

Cài đặt giao diện user

Ta muốn hiển thị một giao diện user đẹp khi user được xác thực qua Instagram, vì vậy hãy thay thế nội dung của file home.html bằng mã bên dưới:

   <!-- home.html -->      {% extends 'base.html' %}     {% block title %} Home {% endblock %}     {% block content %}     <div class="row">         <div class="col-sm-12 mb-3">             <h4 class="text-center">Welcome {{ user.username }}</h4>         </div>         <!-- Add from here -->         {% for ass in backends.associated %}           {% if ass.provider == 'facebook' %}             <div class="col-md-6 text-center">                 <img src="{{ass.extra_data.picture.data.url}}" alt="" width="150" height="150" style="border-radius: 50%">             </div>             <div class="col-md-6 social-container my-2">                 <p> Signed in via:  {{ ass.provider }} </p>                 <p> Name:  {{ ass.extra_data.name }} </p>                 <p> Provider url: <a href="{{ass.extra_data.profile_url}}">link</a></p>             </div>           {% endif %}           <!-- Add from here -->           {% if ass.provider == 'instagram' %}             <div class="col-md-6 text-center">               <img src="{{ ass.extra_data.user.profile_picture }}" alt="" width="150" height="150" style="border-radius: 50%">             </div>             <div class="col-md-6 social-container my-2">               <p>Signed in via: {{ ass.provider }} </p>               <p> Name:  {{ ass.extra_data.user.full_name }} </p>               <p>Provider url: <a href="https://instagram.com/{{ ass.username }}">link</a></p>           {% endif %}           <!-- End here -->         {% endfor %}         <div class="col-sm-12 mt-2 text-center">             <button class="btn btn-danger">                 <a href="{% url 'logout' %}">Logout</a>             </button>         </div>         <!-- End here -->     </div>     {% endblock %} 

Hãy cập nhật URL của nút * Đăng nhập bằng Instagram * trong file login.html :

    <!-- templates/login.html -->          <button class="btn btn-danger  mb-2">             <a href="{% url 'social:begin' 'instagram' %}">Login with Instagram</a>         </button> 

Bây giờ ta có thể khởi động server , truy cập http: // localhost: 8000 / login và thử đăng nhập bằng Instagram:

Ảnh chụp màn hình đăng nhập Instagram với cảnh báo

Lưu ý : Ứng dụng Instagram đang ở chế độ sandbox (thử nghiệm). Để làm cho nó hoạt động, bạn sẽ phải gửi nó để được xem xét. Bạn có thể tìm hiểu thêm về điều này ở đây .

Sau khi ứng dụng được ủy quyền, user sẽ đăng nhập và được chuyển hướng đến trang chủ:

Trang đăng nhập Instagram được ủy quyền

Bước 4 - Xác thực Linkedin

Ta sẽ cài đặt xác thực LinkedIn trong ba bước:

  • Nhận thông tin đăng nhập API

  • Cài đặt chương trình backend

  • Cài đặt giao diện user

Nhận thông tin đăng nhập API

Hãy truy cập trang nhà phát triển Linkedin và nhấp vào Tạo ứng dụng :

Trang LinkedIn Developers
Điền vào chi tiết ứng dụng:

LinkedIn tạo một trang ứng dụng mới

Hầu hết các trường này là bắt buộc và bạn sẽ phải điền vào chúng với dữ liệu có cấu trúc hợp lệ.

Khi ứng dụng đã được tạo thành công, bạn sẽ được chuyển hướng đến trang tổng quan của ứng dụng. Tại đây, thêm http: // localhost: 8000 / social-auth / complete / linkedin-oauth2 / làm URL chuyển hướng và cập nhật ứng dụng:

Trang khóa xác thực ứng dụng

Hãy ghi lại ID khách hàng và Bí mật, ta cần nó khi cài đặt chương trình backend .

Cài đặt chương trình backend

Hãy thêm mã này vào file settings.py :

    # settings.py      #[...]      # add this code     SOCIAL_AUTH_LINKEDIN_OAUTH2_KEY = YOUR_CLIENT_ID         #Client ID     SOCIAL_AUTH_LINKEDIN_OAUTH2_SECRET = YOUR_CLIENT_SECRET  #Client Secret     SOCIAL_AUTH_LINKEDIN_OAUTH2_SCOPE = ['r_basicprofile', 'r_emailaddress']     SOCIAL_AUTH_LINKEDIN_OAUTH2_FIELD_SELECTORS = ['email-address', 'formatted-name', 'public-profile-url', 'picture-url']     SOCIAL_AUTH_LINKEDIN_OAUTH2_EXTRA_DATA = [         ('id', 'id'),         ('formattedName', 'name'),         ('emailAddress', 'email_address'),         ('pictureUrl', 'picture_url'),         ('publicProfileUrl', 'profile_url'),     ]      #[...] 

Thay thế các khóa YOUR_CLIENT_ * bằng các giá trị từ ứng dụng LinkedIn của bạn.

SOCIAL_AUTH_LINKEDIN_OAUTH2_SCOPE chứa các quyền cần thiết để truy cập vào dữ liệu của user , tương tự như những gì ta đã thấy khi cài đặt xác thực qua Facebook.

SOCIAL_AUTH_LINKEDIN_OAUTH_FIELD_SELECTORS chứa danh sách dữ liệu sẽ được trả lại khi user được xác thực thành công qua Linkedin. Nó tương tự như mảng SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS cho Facebook. Bạn có thể tìm thấy danh sách đầy đủ các mục dữ liệu có thể được yêu cầu tại đây.

SOCIAL_AUTH_LINKEDIN_OAUTH2_EXTRA_DATA chứa dữ liệu mà ta muốn lưu trữ trong database để tham khảo sau này.

Cài đặt giao diện user

Hãy thay thế nội dung của file home.html bằng mã bên dưới:

    <!-- home.html -->      {% extends 'base.html' %}     {% block title %} Home {% endblock %}     {% block content %}     <div class="row">         <div class="col-sm-12 mb-3">             <h4 class="text-center">Welcome {{ user.username }}</h4>         </div>         <!-- Add from here -->         {% for ass in backends.associated %}           {% if ass.provider == 'facebook' %}             <div class="col-md-6 text-center">                 <img src="{{ass.extra_data.picture.data.url}}" alt="" width="150" height="150" style="border-radius: 50%">             </div>             <div class="col-md-6 social-container my-2">                 <p> Signed in via:  {{ ass.provider }} </p>                 <p> Name:  {{ ass.extra_data.name }} </p>                 <p> Provider url: <a href="{{ass.extra_data.profile_url}}">link</a></p>             </div>           {% endif %}           {% if ass.provider == 'instagram' %}             <div class="col-md-6 text-center">               <img src="{{ ass.extra_data.user.profile_picture }}" alt="" width="150" height="150" style="border-radius: 50%">             </div>             <div class="col-md-6 social-container my-2">               <p>Signed in via: {{ ass.provider }} </p>               <p> Name:  {{ ass.extra_data.user.full_name }} </p>               <p>Provider url: <a href="https://instagram.com/{{ ass.username }}">link</a></p>           {% endif %}           <!-- Add from here -->           {% if ass.provider == 'linkedin-oauth2' %}             <div class="col-md-6 text-center">                 <img src="{{ass.extra_data.picture_url}}" alt="" width="150" height="150" style="border-radius: 50%">             </div>             <div class="col-md-6 social-container my-2">                 <p> Signed in via:  Linkedin </p>                 <p> Name:  {{ ass.extra_data.name }} </p>                 <p> Provider url: <a href="{{ass.extra_data.profile_url}}">link</a></p>             </div>           {% endif %}           <!-- End here -->         {% endfor %}         <div class="col-sm-12 mt-2 text-center">             <button class="btn btn-danger">                 <a href="{% url 'logout' %}">Logout</a>             </button>         </div>         <!-- End here -->     </div>     {% endblock %} 

Ta cũng sẽ cập nhật URL của nút Đăng nhập bằng LinkedIn trong file login.html :

    <!-- templates/login.html -->          <button class="btn btn-info mb-2">            <a href="{% url 'social:begin' 'linkedin-oauth2' %}">Login with LinkedIn</a>         </button> 

Bây giờ ta có thể khởi động server , truy cập http: // localhost: 8000 / login và thử đăng nhập bằng LinkedIn:

Ủy quyền trước của LinkedIn auth
Khi ta cho phép ứng dụng bằng cách nhấp vào Cho phép , ta sẽ được dẫn đến trang chủ:

Tích hợp xác thực LinkedIn

Kết luận

Ta đã đến phần cuối của hướng dẫn này và đã học cách cài đặt xác thực xã hội trong Django bằng cách sử dụng thư viện social-auth-app-django với cấu hình tối thiểu. Ta cũng đã học cách yêu cầu dữ liệu user bổ sung sau khi user đã được xác thực thông qua nhà cung cấp mạng xã hội.

Như ta đã thảo luận ở phần đầu của bài viết này, tầm quan trọng của xác thực xã hội trong các ứng dụng web hiện đại không thể bị nhấn mạnh quá mức.

Mã cho bài viết này có sẵn tại đây trên GitHub.


Tags:

Các tin liên quan