GitHub OAuth认证的Django应用

许多应用程序都提供了第三方登录的功能,以便用户可以使用他们已有的账户进行快速登录,提高用户体验。GitHub作为一个广受欢迎的代码托管平台,其OAuth认证也是众多开发者所倾向的一种用户认证方式。本文将详细介绍如何在一个Django项目中接入GitHub登录。

准备工作

在开始之前,你需要一个GitHub账户,并且在GitHub上创建一个OAuth应用。以下是创建过程的简要步骤:

  1. 登录你的GitHub账户。
  2. 访问 https://github.com/settings/developers 页面。
  3. 点击“New OAuth App”按钮创建一个新的应用。
  4. 填写应用详情,其中“Authorization callback URL”是GitHub在认证过程中会调用的URL,应指向你的Django应用。
  5. 创建应用后,记下生成的Client ID和Client Secret,这些信息将用于配置Django应用。
Django项目设置

首先,确保你已经安装了djangosocial-auth-app-django包,这个包将帮助我们处理OAuth认证。

pip install django social-auth-app-django

在你的Django项目的settings.py中,添加下面的配置:

# settings.py

INSTALLED_APPS = [
    # ...
    'social_django',
    # ...
]

AUTHENTICATION_BACKENDS = (
    # ...
    'social_core.backends.github.GithubOAuth2',
    # ...
)

SOCIAL_AUTH_GITHUB_KEY = '你的GitHub应用的Client ID'
SOCIAL_AUTH_GITHUB_SECRET = '你的GitHub应用的Client Secret'

LOGIN_URL = 'login'
LOGOUT_URL = 'logout'
LOGIN_REDIRECT_URL = '/'

这里我配置了social_django应用,设置了GitHub作为认证后端,并填入了之前记下的Client ID和Client Secret。同时,定义了登录、登出和登录重定向的URL。

接着,将social_django的URL模式包含到你的项目中:

# urls.py

from django.urls import include, path

urlpatterns = [
    # ...
    path('social-auth/', include('social_django.urls', namespace='social')),
    # ...
]

这将添加social-auth应用需要的URL模式到你的项目中。

用户模型和视图

在Django中,你可能需要扩展默认的用户模型以存储GitHub返回的数据。以下是一个简单的用户模型扩展示例:

# models.py

from django.contrib.auth.models import User
from django.db import models

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    github_login = models.CharField(max_length=100)

    def __str__(self):
        return self.user.username

这里我创建了一个Profile模型,它与Django的内置User模型是一对一关系。为其添加了一个字段github_login,用于存储GitHub登录名。

接下来,需要创建更新用户资料的逻辑。当用户通过GitHub登录时,我希望创建或更新相应的用户资料。

# views.py

from .models import Profile
from django.contrib.auth.models import User
from social_core.exceptions import AuthForbidden
from social_django.models import UserSocialAuth

def save_profile(backend, user, response, *args, **kwargs):
    if backend.name == 'github':
        username = response.get('login')
        profile, created = Profile.objects.get_or_create(user=user)
        if created:
            profile.github_login = username
        else:
            profile.github_login = username or profile.github_login
        profile.save()

在代码中,我定义了一个函数save_profile,它将在用户通过GitHub登录后被调用。我检查了响应数据中的login字段,并更新了用户的Profile

此函数需要在settings.py中设置为一个动作:

# settings.py

SOCIAL_AUTH_PIPELINE = (
    # ...
    'path.to.your.views.save_profile',
    # ...
)

'path.to.your.views.save_profile'替换为你的save_profile函数所在的实际路径。

模板与登录链接

在你的Django模板中,你需要提供一个链接,让用户可以点击并通过GitHub进行登录。



<a href="{% url 'social:begin' 'github' %}">Login with GitHuba>

这里我使用了social命名空间下的begin视图,传入'github'作为参数,这将引导用户到GitHub进行认证。

完整的GitHub OAuth登录流程

至此,我完成了Django项目接入GitHub登录的所有必要步骤。下面是整个流程的概述:

  1. 用户点击登录页面的“Login with GitHub”链接。
  2. 用户被重定向到GitHub,请求授权。
  3. 用户在GitHub上授权应用。
  4. GitHub将用户重定向回你的Django应用,并携带一个授权码。
  5. Django应用使用授权码与GitHub交换访问令牌。
  6. Django应用使用访问令牌从GitHub获取用户信息。
  7. 如果用户是第一次登录,Django应用将创建一个新的用户对象;如果不是,将更新现有用户的信息。
  8. 用户被重定向到LOGIN_REDIRECT_URL定义的URL。

将Django项目与GitHub的OAuth认证相接入,从而实现一个安全且便捷的第三方登录功能。这不仅增加了应用的用户友好性,也提供了一种简化用户管理流程的方式

你可能感兴趣的:(github,django,sqlite)