You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Django allauth实现GitHub SSO并限制仅组织成员登录?

限制GitHub组织成员登录Django allauth应用

allauth本身没有直接的配置选项来限制仅特定GitHub组织成员登录,需要通过自定义逻辑实现,以下是具体步骤:

1. 配置GitHub OAuth权限

首先确保你的GitHub OAuth应用请求了read:org权限,这样才能获取用户的组织信息。在Django settings中更新SOCIALACCOUNT_PROVIDERS:

SOCIALACCOUNT_PROVIDERS = {
    'github': {
        'SCOPE': [
            'user',
            'read:org',  # 必须添加该权限以读取用户所属组织
        ],
    }
}

2. 自定义SocialAccount适配器

通过重写allauth的适配器方法,在用户登录/注册时验证其组织身份:

步骤2.1 创建适配器类

在你的Django应用中新建adapters.py文件,编写自定义适配器:

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from allauth.socialaccount.models import SocialLogin
from django.core.exceptions import PermissionDenied
import requests

class GitHubOrganizationAdapter(DefaultSocialAccountAdapter):
    # 替换为你的目标GitHub组织名称
    ALLOWED_ORG = "your-target-org-name"

    def pre_social_login(self, request, sociallogin: SocialLogin):
        # 仅处理GitHub登录请求
        if sociallogin.account.provider != "github":
            return

        # 获取GitHub访问令牌
        access_token = sociallogin.account.extra_data.get("access_token")
        if not access_token:
            raise PermissionDenied("无法验证你的GitHub身份")

        # 调用GitHub API获取用户所属组织
        headers = {"Authorization": f"token {access_token}"}
        resp = requests.get("https://api.github.com/user/orgs", headers=headers)
        if resp.status_code != 200:
            raise PermissionDenied("无法获取你的组织信息")

        # 检查是否属于允许的组织
        user_orgs = [org["login"] for org in resp.json()]
        if self.ALLOWED_ORG not in user_orgs:
            raise PermissionDenied("你无权登录该应用,仅目标组织成员可访问")

步骤2.2 配置使用自定义适配器

在Django settings中指定适配器路径:

SOCIALACCOUNT_ADAPTER = "your-app-name.adapters.GitHubOrganizationAdapter"

3. 处理权限拒绝异常

当用户不属于指定组织时,PermissionDenied异常会被抛出,你可以通过Django的异常处理机制在模板中显示错误提示。比如在templates/account/error.html中添加对应的提示内容,或者自定义视图捕获该异常。

补充说明

  • 该逻辑会在每次登录时验证组织身份,即使用户之前已注册,若后续被移除出组织也会被拒绝登录,安全性更高。
  • GitHub API有调用次数限制,但普通应用场景下足以满足需求。

内容的提问来源于stack exchange,提问作者jm-ginkgo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:32:41