Skip to content

[P0 Bug] 钉钉 SSO 登录失败 "NoneType" object is not subscriptable #685

@Clawiee

Description

@Clawiee

Bug: 钉钉 SSO 登录认证失败 "NoneType" object is not subscriptable

Pre-checks

  • I have searched existing issues and this is not a duplicate.
  • This issue affects 生产环境,钉钉登录功能完全不可用

Deployment Method

Docker / Self-hosted

Description

钉钉 SSO 登录时报错 Auth failed: 'NoneType' object is not subscriptable,无法正常登录。

Steps to Reproduce

  1. 在钉钉客户端或网页端点击"钉钉登录"
  2. 完成钉钉授权
  3. 系统跳转回 Clawith 后报错

Error Message

Auth failed: 'NoneType' object is not subscriptable

Root Cause (Suspected)

用户邮箱同步时出现重复身份冲突:

Sync complete: 411 depts, 3457 members synced.
Warning: Member manager3382: 
(sqlalchemy.dialects.postgresql.asyncpg.IntegrityError) 
duplicate key value violates unique constraint "ix_identities_email" 
DETAIL: Key (email)=(xiaoan@fu18.cn) already exists.

分析

  1. 用户之前已用邮箱 xiaoan@fu18.cn 注册过 Clawith 账号
  2. 钉钉同步也产生了相同邮箱的身份记录
  3. 数据库唯一约束冲突导致身份合并失败
  4. 认证流程中某个字段变为 None,触发 NoneType 错误

Environment

  • Clawith 版本:[请填写]
  • 部署方式:Docker
  • 钉钉配置:已配置 DINGTALK_CLIENT_ID, DINGTALK_CLIENT_SECRET 等环境变量

Expected Behavior

钉钉 SSO 应该正常工作,用户可以通过钉钉扫码登录。

Actual Behavior

认证失败,报 NoneType 错误,用户无法登录。

Impact

  • 严重程度:P0
  • 钉钉登录功能完全不可用
  • 影响所有使用钉钉 SSO 的用户
  • 如果用户的唯一登录方式是钉钉 SSO,将无法访问系统

Suggested Fix

  1. 在身份认证流程中添加空值检查,避免 NoneType 错误
  2. 处理邮箱重复场景时给出明确提示,而非静默失败
  3. 考虑在钉钉同步时使用 ON CONFLICT DO UPDATE 代替直接 INSERT
  4. 添加钉钉 SSO 登录的完整单元测试覆盖

Additional Context

错误堆栈表明问题发生在认证回调处理阶段,当尝试访问某个应为字典/对象的字段时,该字段实际为 None。


请产研团队优先排查此问题,非常紧急。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions