最近写了一个单点登录系统,这里做一些总结.
github地址:(欢迎来star一发^_^) https://github.com/calmkart/Django-sso-server
1.流程原理
<1>.系统管理流程
管理员在初始化系统时,填写ldap相关设置以及管理员账号相关设置,之后管理员账号可以在管理员后台调整相关配置 其中: a.系统初始化时将自动生成rsa公私钥,系统中所有涉及的密码,都会经过aes加密存放在数据库中,包括rsa私钥也会经过aes加密存放 b.在取用密码时将调用aes解密,加密的salt写在了common/crypto.py中,也可以自己替换
<2>.用户流程
用户登录sso系统,验证ldap账号成功后,将用户信息以
now = time.time()
user_info = "{0}|||||{1}".format(ldap_username, now)
的形式,通过rsa公钥加密写入cookie中,key为sso_user
response.set_cookie('sso_user', rsa.crypto(
public_key, user_info), domain=options.objects.all()[0].cookie_domain)
其他需要接入sso系统的子系统可以通过sso系统的api,来判断用户是否可以登录
url: /api/auth
method: POST
post_json_data: {"sso_user":cookie}
return: {"status":True/False, "msg":username}
本sso系统已提供了相关装饰器,可在管理后台-添加站点的帮助栏查看
import requests
def auth_login(func):
'''
装饰器,用于需要登录的views functions,将读取cookie并调用sso的api获取username
也可手动编写相关装饰器
sso系统的登录鉴权api为"http://sso域名/api/auth"(如"http://sso.calmkart.com/api/auth")
用POST方法以json形式将sso_cookie传给上述api,
返回{"status":True, "msg":{username}}则登录成功
否则{"status":False, "msg":{exception}}则登录失败
'''
def _auth(request):
cookie = request.COOKIES.get("sso_user", "")
if cookie=="":
return HttpResponseRedirect("{http://sso站域名/}")
r = request.post("{http://sso站域名/api/auth}",data={"sso_cookie":cookie})
if r.json()["status"]==False:
return HttpResponseRedirect("{http://sso站域名}")
else:
username = r.json()["msg"]
if username == "" or username == "error":
return HttpResponseRedirect("{http://sso站域名/}")
else:
return func(request, username)
return _auth
用户拥有cookie后登陆系统,系统将解cookie,并获取当前时间,若时间不超过最大时间,则返回username
<3>.企业扫码登陆流程
在管理后台配置企业微信扫码登陆相关参数,通过企业微信相关js api,生成二维码,用户扫码后,企业微信后台将用户请求重定向到/api/wxlogin (method:get)上,并加上携带有用户username信息的code参数,成功则写cookie。
2.common相关模块原理
参见本blog其他博文
历史评论 (9 条)
以下评论来自原 WordPress 站点,仅作存档展示。