【发布时间】:2011-09-28 08:25:36
【问题描述】:
我正在尝试仅使用 django auth 实现单点登录。
让我们假设两个 django 项目,在不同的子域上:site.com(auth) 和 app1.site.com(app1) site.com 中的 auth 表是 master。 site.com 处理:登录、注销、帐户注册等。
site.com 将 SESSION_COOKIE_DOMAIN 设置为 .site.com 以允许子域读取它
app1 会将 login_url 设置为 app1 项目中的一个视图,该视图执行以下操作:
- 检索 site.com 的 session_id 值(来自 cookie)
- 通过向以下网址发出请求来验证 session_id:site.com/validate/[session_id]/
- 如果为 False,则重定向到 site.com/login?next=[...]
- 如果为真,请求用户数据到:site.com/attributes/[session_id]/
- site.com/attributes/ 提供包含所有用户值的字典,使用共享 SSO_KEY 加密(加密方式与 django 编码和解码 session_id 相同)
现在,app1 有一个模型 SSO_User,它有两个字段,一个用户模型的外键和一个整数字段。 SSO_User 模型将本地身份验证用户链接到主身份验证表的 id。
使用从 site.com 检索到的 id,我们检查 SSO_User 是否存在现有本地用户,如果为真,我们只需更新值并登录;如果不存在,我们创建用户和 SSO_User 并登录。
app1(或任何其他子域)可以保留自己的个人资料信息,而不会干扰任何事情。
实现起来似乎很简单而且很安全,但在实现之前我想听听一些意见。你怎么看?
【问题讨论】:
标签: python django django-authentication