- 后端
- 认证鉴权
- 身份认证
【免费下载链接】django-allauth
Integrated 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/
Untappd 是面向精酿啤酒爱好者与商家的社交平台,其开放 API 提供了标准的 OAuth2 授权流程。django-allauth 在allauth.socialaccount.providers.untappd模块中内置了该提供者(Provider)的完整实现,你只需完成应用注册、SocialApp 配置并正确设置USER_AGENT,即可让 Django 项目获得“用 Untappd 账号登录”的能力。读完本文,你将掌握 Untappd 应用在 Untappd 官方后台的注册步骤、django-allauth 中SOCIALACCOUNT_PROVIDERS与 Django Admin 的配置方法,并能从源码层面理解该提供者针对 Untappd 非标准 OAuth2 行为所做的特殊适配。
Untappd 提供者概览
在接入之前,先了解当前仓库中该提供者的代码布局。与大多数 OAuth2 提供者一样,Untappd 提供者由四个核心文件组成:
- provider.py:定义
UntappdProvider(继承自OAuth2Provider),负责用户标识(uid)、公共字段与邮箱的提取; - client.py:定义
UntappdOAuth2Client,重写了访问令牌(access token)的获取逻辑; - views.py:定义
UntappdOAuth2Adapter,声明授权、令牌与用户信息接口的端点; - urls.py:通过
default_urlpatterns(UntappdProvider)生成标准的/accounts/untappd/login/与/accounts/untappd/login/callback/路由。
从 views.py 可以看到,Untappd 提供者本质上是标准的 OAuth2 实现:
class UntappdOAuth2Adapter(OAuth2Adapter): client_class = UntappdOAuth2Client provider_id = "untappd" access_token_url = "https://untappd.com/oauth/authorize/" # nosec access_token_method = "GET" # nosec authorize_url = "https://untappd.com/oauth/authenticate/" user_info_url = "https://api.untappd.com/v4/user/info/"注意两个细节:Untappd 的 access token 端点使用GET方法(绝大多数 OAuth2 提供者使用 POST),并且授权端点与令牌端点位于不同的路径(authenticate/与authorize/)。这些差异已被适配器封装,接入方无需关心。
在 Untappd 注册应用
在 Django 中配置任何东西之前,先到 Untappd 官方后台创建一个 API 应用,注册入口为:
https://untappd.com/api/register?register=new创建应用的表单中需要填写development callback URL(开发回调地址),本地开发时可填写:
http://127.0.0.1:8000/accounts/untappd/login/callback/生产环境上线时,需要把回调地址替换为你的正式域名,例如:
http://yoursite.com/accounts/untappd/login/callback/回调地址的路径后缀固定为accounts/untappd/login/callback/,它由 urls.py 中的默认 URL 模式生成,与 django-allauth 其它提供者保持一致。login/callback/之前的域名部分随你的站点环境变化,Untappd 侧登记的回调地址必须与实际部署域名一致,否则授权回调会被拒绝。
在 Django Admin 中配置 SocialApp
应用创建完成后,Untappd 的 API 后台(dashboard)会提供Client ID与Client Secret两项凭据:
https://untappd.com/api/dashboard接下来在 Django 管理后台(Admin)中添加一个 SocialApp 记录,字段填写如下:
| 字段 | 取值 |
|---|---|
| Provider | Untappd |
| Name | Untappd |
| Client id | 取自 Untappd 后台的 “Client ID” |
| Secret key | 取自 Untappd 后台的 “Client Secret” |
| Sites | 选择你的站点 |
其中 Provider 一项在 Admin 中实际显示为Untappd,对应 provider.py 中定义的id = "untappd"、name = "Untappd"。Sites 必须正确关联,只有被选中的站点域名才会在授权流程中通过request.build_absolute_uri(...)生成回调地址。
覆盖 User-Agent 以符合 Untappd API 规则
这是 Untappd 提供者区别于大多数提供者的关键配置点。Untappd 官方 API 要求客户端请求携带符合特定格式的 User-Agent,格式为:
<platform>:<app ID>:<version string>例如django:myappid:1.0。如果使用默认的 User-Agent,应用将面临额外的速率限制(rate limiting)风险。django-allauth 在 client.py 中明确注释“Allow custom User Agent to comply with Untappd API”,并通过SOCIALACCOUNT_PROVIDERS读取该配置:
settings = app_settings.PROVIDERS.get(UntappdProvider.id, {}) headers = {"User-Agent": settings.get("USER_AGENT", "django-allauth")}也就是说,不配置时默认值为django-allauth,配置后则使用你的自定义值。请在项目的settings.py中按如下方式设置:
SOCIALACCOUNT_PROVIDERS = { 'untappd': { 'USER_AGENT': 'django:myappid:1.0', } }将myappid替换为你在 Untappd 后台的应用 ID,1.0替换为你的应用版本号。该USER_AGENT会被用于访问令牌请求(见 client.py 中对sess.request(...)的调用),从而规避 Untappd 对非规范 UA 的额外限流。
源码级原理:Untappd 对 OAuth2 的非常规实现
Untappd 的 OAuth2 流程与 RFC 标准存在三处显著差异,django-allauth 为此专门定制了客户端逻辑,理解这些差异有助于你排查接入过程中的问题。
1. 使用redirect_url而非redirect_uri
标准 OAuth2 使用redirect_uri参数传递回调地址,而 Untappd 要求使用redirect_url。这一点在 client.py 的类注释中被明确记录,并在两个位置落实:
- 授权阶段,provider.py 重写
get_auth_params_from_request,将redirect_url设置为当前请求的绝对回调地址:
params["redirect_url"] = request.build_absolute_uri( reverse(f"{self.id}_callback") )- 令牌阶段,client.py 构造请求体时同样使用
redirect_url字段。
2. Access token 嵌套在response对象中
标准实现中,令牌端点的响应体直接返回{"access_token": "..."};而 Untappd 会多包一层response。因此 client.py 中做了如下处理:
if resp.status_code == HTTPStatus.OK: access_token = resp.json()["response"] if not access_token or "access_token" not in access_token: raise OAuth2Error(f"Error retrieving access token: {resp.content}")即从resp.json()["response"]中取出内层字典,再检查其中是否包含access_token字段,否则抛出OAuth2Error。测试用例 tests/apps/socialaccount/providers/untappd/tests.py 中的get_login_response_json精确复现了这一响应结构。
3. 用户信息响应同样被response.user包裹
登录完成后,适配器在 views.py 中调用complete_login请求用户信息接口,并把整个 JSON 交给提供者解析:
def complete_login(self, request, app, token, **kwargs): with get_adapter().get_requests_session() as sess: resp = sess.get(self.user_info_url, params={"access_token": token.token}) extra_data = resp.json() return self.get_provider().sociallogin_from_response(request, extra_data)对应的字段提取逻辑都假定数据位于data["response"]["user"]之下:
- extract_uid 取
user["uid"]作为本地用户唯一标识; - extract_common_fields 提取
user_name作为用户名,拼接first_name与last_name作为显示名; - extract_email_addresses 从
user["settings"]["email_address"]提取邮箱,并直接标记为verified=True、primary=True——即 Untappd 返回的邮箱被视为已验证邮箱,可参与SOCIALACCOUNT_EMAIL_AUTHENTICATION(默认False)等邮箱认证流程的判断。
此外,UntappdAccount账户类(provider.py)还提供了get_profile_url(取自untappd_url)与get_avatar_url(取自user_avatar),供模板展示用户主页链接与头像。测试用例 tests.py 中的完整 mock 响应展示了 Untappd 用户信息 JSON 的真实结构,包括uid、user_name、first_name、last_name、user_avatar、untappd_url、settings.email_address等字段,可作为你调试时的参考样例。
验证与常见排查点
接入完成后,可通过以下方式验证配置是否生效:
- 启动 Django 开发服务器,访问
/accounts/untappd/login/发起授权跳转,确认浏览器被重定向到https://untappd.com/oauth/authenticate/; - 完成 Untappd 侧授权后,回调地址应落在
/accounts/untappd/login/callback/,随后重定向到你的登录成功页或登录失败页; - 在 Django Admin 的 Social accounts 列表中检查是否成功创建了 SocialAccount 记录,其
uid应等于 Untappd 用户 JSON 中的uid。
常见问题排查:
- 回调 404 或 redirect 报错:检查 Untappd 后台登记的回调域名是否与
Sites中站点域名一致,且路径必须以/accounts/untappd/login/callback/结尾; - 收到额外的速率限制:确认已在
SOCIALACCOUNT_PROVIDERS['untappd']中设置符合<platform>:<app ID>:<version string>格式的USER_AGENT; - 邮箱未入库:Untappd 用户需在
settings.email_address字段中公开邮箱,若该字段为空,extract_email_addresses会因 KeyError 抛出异常,这是 Untappd API 数据本身导致的限制(源码中 views.py 也留有 “TODO: get and store the email from the user info json” 的待办注释)。
小结
Untappd 提供者的接入要点可归纳为三步:在 Untappd 后台注册应用并登记回调地址、在 Django Admin 中配置 SocialApp(Client ID / Client Secret / Sites)、在SOCIALACCOUNT_PROVIDERS中覆盖USER_AGENT。其底层实现(provider.py、client.py、views.py)为 Untappd 的非常规 OAuth2 行为——redirect_url参数、GET 方式取令牌、嵌套response结构——做了完整适配,接入方只需关注配置层面即可快速上线。若需了解SOCIALACCOUNT_PROVIDERS的通用配置机制,可参阅 docs/socialaccount/configuration.rst 与 docs/socialaccount/provider_configuration.rst。
- 后端
- 认证鉴权
- 身份认证
【免费下载链接】django-allauth
Integrated 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/
相关推荐
django-allauth 集成 Box 社交登录:OAuth2 配置、回调地址与源码级实现解析
django allauth 集成 Box 社交登录:OAuth2 配置、回调地址与源码级实现解析 django allauth 是一套集成了认证、注册、账户管
后端认证鉴权身份认证Label Studio 医疗影像目标检测标注:Bounding Box 模板与区域级条件标注实战
Label Studio 医疗影像目标检测标注:Bounding Box 模板与区域级条件标注实战 本文以 Label Studio 官方使用场景模板「Obje
后端认证鉴权身份认证django-allauth 接入 Instagram 社交登录:OAuth2 应用注册与回调 URL 配置指南
django allauth 接入 Instagram 社交登录:OAuth2 应用注册与回调 URL 配置指南 Instagram 是 django alla
后端认证鉴权身份认证
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考