GitHub OAuth认证的Django应用

简介: 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进行登录。

<!-- login.html -->
<a href="{% url 'social:begin' 'github' %}">Login with GitHub</a>

这里我使用了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认证相接入,从而实现一个安全且便捷的第三方登录功能。这不仅增加了应用的用户友好性,也提供了一种简化用户管理流程的方式



目录
相关文章
|
1月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
75 1
|
1月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
37 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
2月前
|
存储 安全 开发工具
GitHub 支持双因素认证(2FA)
【9月更文挑战第29天】
389 6
|
1月前
|
监控 应用服务中间件 网络安全
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
105 0
|
1月前
|
存储 开发框架 JSON
【查漏补缺】Django模型字段类型及其应用
【查漏补缺】Django模型字段类型及其应用
18 0
|
3月前
|
中间件 数据库连接 UED
Django中间件秘籍:如何用几行代码让你的应用变得超级强大?
【8月更文挑战第31天】中间件是Django框架的核心特性,位于视图与HTTP服务器之间,允许全局处理请求和响应,增强Web应用功能。通过实现`MiddlewareMixin`类的方法,如`process_request`和`process_response`,可以轻松实现请求预处理或响应后处理。中间件应用场景广泛,包括用户认证、CSRF防护和数据库连接管理等。创建并配置中间件需将其加入`settings.py`的`MIDDLEWARE`列表,顺序决定执行优先级。合理利用中间件能提高代码重用性和应用性能,带来更好的用户体验。
52 0
|
3月前
|
jenkins 持续交付
jenkins学习笔记之九:jenkins认证集成github
jenkins学习笔记之九:jenkins认证集成github
|
3月前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
4月前
|
前端开发 JavaScript API
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
【7月更文挑战第17天】现代Web开发趋势中,前后端分离配合WebSocket满足实时通信需求。Django Channels扩展了Django,支持WebSocket连接和异步功能。通过安装Channels、配置设置、定义路由和消费者,能在Django中实现WebSocket交互。前端使用WebSocket API连接后端,实现双向数据流,如在线聊天功能。集成Channels提升Web应用的实时性和用户体验,适应实时交互场景的需求。**
186 6
|
4月前
|
安全 开发者 Python
告别迷茫,Django/Flask深入应用指南,让你的Web梦想照进现实!
【7月更文挑战第13天】在Python Web开发中,Django和Flask框架各具特色。Django适合快速构建企业级应用,提供ORM、模板引擎等全面功能;而Flask轻量灵活,适用于小项目和原型开发。通过实例,了解如何启动Django和Flask的基本应用,从创建项目到运行服务器。选择框架应考虑项目需求和个人偏好,不断学习与实践将助你实现Web梦想。
50 1