许多应用程序都提供了第三方登录的功能,以便用户可以使用他们已有的账户进行快速登录,提高用户体验。GitHub作为一个广受欢迎的代码托管平台,其OAuth认证也是众多开发者所倾向的一种用户认证方式。本文将详细介绍如何在一个Django项目中接入GitHub登录。
准备工作
在开始之前,你需要一个GitHub账户,并且在GitHub上创建一个OAuth应用。以下是创建过程的简要步骤:
- 登录你的GitHub账户。
- 访问 https://github.com/settings/developers 页面。
- 点击“New OAuth App”按钮创建一个新的应用。
- 填写应用详情,其中“Authorization callback URL”是GitHub在认证过程中会调用的URL,应指向你的Django应用。
- 创建应用后,记下生成的Client ID和Client Secret,这些信息将用于配置Django应用。
Django项目设置
首先,确保你已经安装了django
和social-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进行登录。
<!-- login.html --> <a href="{% url 'social:begin' 'github' %}">Login with GitHub</a>
这里我使用了social
命名空间下的begin
视图,传入'github'
作为参数,这将引导用户到GitHub进行认证。
完整的GitHub OAuth登录流程
至此,我完成了Django项目接入GitHub登录的所有必要步骤。下面是整个流程的概述:
- 用户点击登录页面的“Login with GitHub”链接。
- 用户被重定向到GitHub,请求授权。
- 用户在GitHub上授权应用。
- GitHub将用户重定向回你的Django应用,并携带一个授权码。
- Django应用使用授权码与GitHub交换访问令牌。
- Django应用使用访问令牌从GitHub获取用户信息。
- 如果用户是第一次登录,Django应用将创建一个新的用户对象;如果不是,将更新现有用户的信息。
- 用户被重定向到
LOGIN_REDIRECT_URL
定义的URL。
将Django项目与GitHub的OAuth认证相接入,从而实现一个安全且便捷的第三方登录功能。这不仅增加了应用的用户友好性,也提供了一种简化用户管理流程的方式