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



目录
相关文章
|
5月前
|
开发工具 数据安全/隐私保护 git
Github新的认证方式
Github新的认证方式
145 0
|
存储 API 数据安全/隐私保护
12-SpringSecurity:通过OAuth2集成Github登录
12-SpringSecurity:通过OAuth2集成Github登录
451 0
12-SpringSecurity:通过OAuth2集成Github登录
|
4月前
|
存储 安全 API
在django中创建项目时应用基础鉴权
【6月更文挑战第7天】本文探讨了在django中的API权限管理,即用户认证的两种方法:基础认证和会话认证。Django REST Framework默认使用会话认证,但也提供基础、令牌和JWT等其他选项。根据项目需求,应谨慎选择适合的认证方案。
76 3
在django中创建项目时应用基础鉴权
|
10月前
|
API Python
Django实现jwt方式登录
jwt的概念这边就不再阐述了,就是cookie的替代品 view.py
55 0
|
10月前
|
Python
django auth模块使用jwt进行登录不能更新last_login!
今天使用django自带的用户系统,进行jwt,重写了user模型,使用手机登录,于是就想用django自带的登录验证... 哎,一切折腾都在于不熟悉
56 0
|
安全 Java 网络安全
SpringSecurity:通过OAuth2集成Github
Spring Securtity OAuth2集成Github完成身份证认证
214 0
SpringSecurity:通过OAuth2集成Github
|
JSON 安全 Java
Spring Security OAuth 实现 GitHub 快捷登录
Spring Security 5中集成了OAuth的客户端模块,该模块包含以下三个子模块
Spring Security OAuth 实现 GitHub 快捷登录
|
JSON 数据格式 Python
Python:OAuth2第三方登录之Github
Python:OAuth2第三方登录之Github
213 0
|
关系型数据库 MySQL Python
GitHub上两个适合入门的Django开源项目
最近GitHub推荐了几个很不错的项目给我,其中有两个适合Django的入门,我也仔细的看过源码并且实际的跑了起来。整体的逻辑比较简单,比较适合刚入门的朋友借鉴学习。
671 0
GitHub上两个适合入门的Django开源项目
|
应用服务中间件 API nginx
django 搭建 oauth 开放平台
使用 (oauth2 server django)django2.1 + oauth server,搭建oauth server端,构建基础 开放平台。
652 0
django 搭建 oauth 开放平台