在Django中使用第三方登录:Google,Facebook,微信等等

2023-04-11 00:00:00 django 第三方 登录

在Django中使用第三方登录需要借助第三方登录的API或SDK,这些API或SDK可以让我们快速接入第三方登录,并获取用户的相关信息。

下面以Google登录为例,介绍如何在Django中使用第三方登录:

  1. 创建Google API项目

首先需要创建Google API项目,具体步骤如下:

  • 登陆Google Cloud Console;
  • 创建新项目;
  • 在左侧菜单中选择“API和服务” -> “凭据”;
  • 点击“创建凭据” -> “OAuth客户端ID”;
  • 选择应用类型为“Web应用程序”;
  • 设置授权重定向URI,例如:http://localhost:8000/google/auth_callback/;
  • 创建OAuth客户端ID。
  1. 安装第三方库

在Django项目中安装Google第三方库,可以使用以下命令:

pip install google-auth google-auth-oauthlib google-auth-httplib2
  1. 编写授权登录视图

在Django中,可以使用类视图来处理授权登录逻辑,具体代码如下:

from django.urls import reverse_lazy
from django.conf import settings
from django.shortcuts import redirect
from django.views.generic import View
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import Flow


class GoogleAuthView(View):
    def get(self, request):
        flow = Flow.from_client_config(
            settings.GOOGLE_CLIENT_CONFIG,
            scopes=settings.GOOGLE_AUTH_SCOPES,
            redirect_uri=request.build_absolute_uri(reverse_lazy("google_auth_callback")),
        )
        authorization_url, _ = flow.authorization_url(prompt="consent")
        return redirect(authorization_url)


class GoogleAuthCallbackView(View):
    def get(self, request):
        flow = Flow.from_client_config(
            settings.GOOGLE_CLIENT_CONFIG,
            scopes=settings.GOOGLE_AUTH_SCOPES,
            redirect_uri=request.build_absolute_uri(reverse_lazy("google_auth_callback")),
        )
        flow.fetch_token(authorization_response=request.build_absolute_uri())
        credentials = flow.credentials
        # TODO: 处理授权登录逻辑
        return redirect("/")

其中,GOOGLE_CLIENT_CONFIGGOOGLE_AUTH_SCOPES需要在Django settings中配置,具体配置如下:

GOOGLE_CLIENT_CONFIG = {
    "web": {
        "client_id": "your_client_id",
        "project_id": "your_project_id",
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://oauth2.googleapis.com/token",
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
        "client_secret": "your_client_secret",
        "redirect_uris": ["http://localhost:8000/google/auth_callback/"],
        "javascript_origins": ["http://localhost:8000"],
    }
}

GOOGLE_AUTH_SCOPES = ["openid", "profile", "email"]
  1. 获取用户信息

完成授权登录后,我们可以获取用户的相关信息,具体代码如下:

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build


def get_google_user_info(credentials):
    if not credentials.valid:
        if credentials.expired and credentials.refresh_token:
            credentials.refresh(Request())
    service = build("oauth2", "v2", credentials=credentials)
    user_info = service.userinfo().get().execute()
    return user_info

其中,需要传入授权登录后的credentials参数。

总结:

以上就是在Django中使用Google第三方登录的全部流程,同样的,Facebook,微信等第三方登录也有相应的API或SDK来提供支持,流程类似。

相关文章