ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

django-allauth 集成 Patreon 第三方登录:VERSION/SCOPE 配置与 OAuth2 源码实现解析

django-allauth 集成 Patreon 第三方登录:VERSION/SCOPE 配置与 OAuth2 源码实现解析 django-allauth 集成 Patreon 第三方登录VERSION/SCOPE 配置与 OAuth2 源码实现解析【免费下载链接】django-allauthIntegrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication. Mirror of https://codeberg.org/allauth/django-allauth/项目地址: https://gitcode.com/gh_mirrors/dj/django-allauth本文是一份面向 Django 开发者的 Patreon 社交登录接入指南。文档主体来自 Patreon 提供商文档讲解在 django-allauth 中通过SOCIALACCOUNT_PROVIDERS[patreon]完成 Patreon 应用注册、API 版本v1/v2选择、权限范围SCOPE配置以及本地回调调试。读完本文你将掌握 Patreon 提供商的完整配置方法并能理解其 OAuth2 适配器在 provider.py 与 views.py 中的底层实现包括用户资料字段映射和 v2 版本下赞助层级pledge level的提取逻辑。Patreon 提供商的核心配置项在 django-allauth 中启用 Patreon 登录只需在 Django 项目的settings.py中向SOCIALACCOUNT_PROVIDERS字典添加patreon条目。官方配置如下SOCIALACCOUNT_PROVIDERS { patreon: { VERSION: v1, SCOPE: [pledges-to-me, users, my-campaign], } }两个配置项的含义与行为VERSIONPatreon API 版本取值v1或v2默认v1。从源码看该值在 constants.py 中被读取API_VERSION settings.SOCIALACCOUNT_PROVIDERS.get(patreon, {}).get(VERSION, v1)随后USE_API_V2 True if API_VERSION v2 else False。该标志决定 API 请求基础 URL 的构造API_URL fhttps://www.patreon.com/api/oauth2/{API_VERSION if USE_API_V2 else api}。也就是说v2 版本请求形如https://www.patreon.com/api/oauth2/v2/...而 v1 版本请求形如https://www.patreon.com/api/oauth2/api/...。SCOPEOAuth2 授权时向 Patreon 申请的权限范围列表。使用 API v1 时默认值为上述示例中的[pledges-to-me, users, my-campaign]使用 API v2 时默认值切换为[identity, identity[email], campaigns, campaigns.members]。该默认逻辑体现在 provider.py 的get_default_scope()方法中当USE_API_V2为真时返回 v2 范围否则返回 v1 范围。如果你在配置中显式给出SCOPE则会覆盖上述默认值若不写SCOPE则按 VERSION 自动选择。Patreon 应用注册与回调地址配置接入前需在 Patreon 开发者平台完成以下准备工作应用注册前往 Patreon 的客户端注册页面文档原文为https://www.patreon.com/portal/registration/register-clients获取 API 所需的 Client IDkey和 Client Secretsecret。API 文档Patreon 客户端文档位于https://www.patreon.com/platform/documentation/clients可用于核对各版本接口的请求/响应格式。开发环境回调 URL本地联调时将 Patreon 应用的回调地址配置为http://127.0.0.1:8000/accounts/patreon/login/callback/这个回调地址对应 django-allauth 为 Patreon 生成的默认 URL 模式。在 urls.py 中Patreon 复用default_urlpatterns(PatreonProvider)由 oauth2/urls.py 生成两条路由login/→ 触发 OAuth2 授权跳转view 名patreon_loginlogin/callback/→ 处理 Patreon 授权回调view 名patreon_callback。因此完整的登录 URL 为/accounts/patreon/login/回调 URL 为/accounts/patreon/login/callback/。在SOCIALACCOUNT_PROVIDERS之外还需要在 Django 项目的INSTALLED_APPS中加入allauth.socialaccount.providers.patreon并在 Django admin 后台的 Social Applications 中创建一条指向 Patreon 提供商的记录填入上面获取到的 Client ID 与 Client SecretKey/Secret。OAuth2 适配器端点与资料获取的源码解析Patreon 提供商继承 django-allauth 通用的 OAuth2 基类其适配器定义在 views.py 的PatreonOAuth2Adapter中access_token_url https://www.patreon.com/api/oauth2/token authorize_url https://www.patreon.com/oauth2/authorizeauthorize_url用于将未登录用户重定向到 Patreon 授权页access_token_url用于在回调阶段用授权码换取访问令牌access token。profile_url则根据 API 版本动态构造v1 版本请求current_user端点https://www.patreon.com/api/oauth2/api/current_userv2 版本请求identity端点并附加includememberships以及一组用户字段email,first_name,full_name,image_url,last_name,social_connections,thumb_url,url,vanity以便一次请求拿到资料与会员关系。complete_login()方法展示了完整的令牌使用流程携带Authorization: Bearer token请求头调用profile_url解析响应 JSON 中的data节点然后交给sociallogin_from_response()完成用户匹配与登录。值得注意的是在 API v2 模式下还会追加一次额外请求来获取赞助层级pledge levelif USE_API_V2: try: memberships extra_data[relationships][memberships] member_id memberships[data][0][id] member_url ( {}/members/{}?include currently_entitled_tiersfields%5Btier%5Dtitle ).format(API_URL, member_id) resp_member sess.get(member_url, headersheaders) resp_data resp_member.json() pledge_title resp_data[included][0][attributes][title] extra_data[pledge_level] pledge_title except (KeyError, IndexError): extra_data[pledge_level] None这段代码会从relationships.memberships.data[0].id取出用户的第一条会员记录再请求该会员当前享有的 tier 标题写入extra_data[pledge_level]如果用户没有会员关系KeyError/IndexError则安全地置为None不会中断整个登录流程。这让开发者无需额外 API 调用即可判断当前登录用户的 Patreon 赞助档位。用户资料字段映射从 extra_data 到 Django 用户登录完成后django-allauth 通过 provider.py 中的PatreonProvider将 Patreon 返回的资料映射到 Django 用户模型extract_uid(data)返回data[id]即 Patreon 用户唯一 ID作为社交账号的标识。extract_common_fields(data)从data[attributes]中提取email、full_name、first_name、last_name分别映射为email、fullname、first_name、last_name字段。PatreonAccount.get_avatar_url()读取attributes.thumb_url作为用户头像 URL方便模板中直接展示。PatreonAccount.to_str()优先使用attributes.email作为账号的字符串表示如后台列表、调试输出缺失时回退到基类实现。测试用例 tests/apps/socialaccount/providers/patreon/tests.py 中的 mock 响应与上述字段一一对应full_name: John Interwebs、email: johnexample.com、thumb_url: https://c8.patreon.com/100/123456并且get_expected_to_str()返回johnexample.com直接印证了to_str()的取数逻辑。开发者可参照该 mock 结构理解 Patreon 用户 API 的返回格式便于调试或自定义资料同步。常见问题与注意事项VERSION 切换的影响VERSION不仅改变数据端点还会改变默认 SCOPE 与字段结构。v1 的current_user与 v2 的identity返回的 JSON 结构不同v2 中用户数据始终包裹在data节点内切换版本前请核对 Patreon 客户端文档 中列出的 API 文档地址。SCOPE 权限不足v2 模式下若未申请campaigns.members权限会员/赞助层级请求可能返回空数据此时pledge_level会按容错逻辑被置为None登录本身不受影响。本地回调地址127.0.0.1:8000仅适用于本地开发部署到生产环境后需要在 Patreon 应用后台同步更新为线上域名对应的回调地址。令牌安全access_token_url通过服务器端请求换取令牌令牌仅保存在 Django 侧SocialToken模型不会暴露给浏览器端。总结通过SOCIALACCOUNT_PROVIDERS[patreon]的VERSION与SCOPE两个配置项django-allauth 即可完成对 Patreon OAuth2 的接入底层由 constants.py 决定 API 版本与基础 URL由 views.py 完成授权、取令牌与资料拉取并由 provider.py 完成用户字段映射与赞助层级暴露。开发者只需注册 Patreon 应用、配置回调地址、在 admin 中录入 Client ID/Secret即可让站点用户通过 Patreon 账号一键登录并依据extra_data[pledge_level]实现会员权益相关的业务逻辑。【免费下载链接】django-allauthIntegrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication. Mirror of https://codeberg.org/allauth/django-allauth/项目地址: https://gitcode.com/gh_mirrors/dj/django-allauth创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表