因为有些场景下,比如单点登录(SSO),需要用户限制用户只在一个终端登录,所以可能存在需要将用户原有登陆状态过期的需求(比如不能同时在两台PC上登录QQ)。
既然,咱们不存在这个需求,那就不需要考虑这个了
一、认证部分
这是大致的认证流程:
1.用户使用用户名、密码登录;登录成功,则服务端签发access_token和refresh_token
(我的个人习惯是access_token有效期为30min,refresh_token为7day)
2.客户端每次请求时,带上access_token进行认证和授权(不携带refresh_token)
3.当access_token过期时,客户端可以通过refresh_token获取新的access_token
4.refresh_token过期时,用户需要重新登录
如果需要简化,我们可以去掉refresh_token,延长access_token的时效。当access_token过期时,直接重新登录
二、授权部分
授权使用,flask-httpauth
1.单权限
@app.route('/manage-content')
@auth.login_required(role=MANAGE_CONTENT)
def manage_content_only():
...
2.多权限
@app.route('/multi-permissions')
@auth.login_required(role=[[MANAGE_CONTENT, MANAGE_USER]])
def multi_permissions():
...
3.获取当前用户权限
@auth.get_user_roles
def get_user_roles(user):
user_permissions = []
for permission in permissions:
if user.permissions & permission:
user_permissions.append(permission)
return user_permissions
flask-httpauth的授权是基于角色的,如果要把参数名改为permission,我们可以fork一份代码自己修改。
作者不会介意…吧?
HTTPAuth在OpenAPI上有问题吧
不能通过APIFlask的能力解决吗?
这似乎多一层中括号?其他没问题
另外名字改成auth_required,因为可能后面会支持API key
不加中括号,多权限关系是any,只要满足一个就行;加了是and,必须具有列表里的所有权限才行
不用列表,用元组也可以
改名这个简单:
auth.auth_required = auth.login_required
另外,role这个参数名需要修改为permission吗
any的话用位或就可以: MANAGE_CONTENT | MANAGE_USER
即表示满足任意一个,目前不会有太复杂的逻辑关系式
role改成permission更恰当
双token吧
这个权限表示方式是Flask-HTTPAuth的,不过我们可以修改
哦,如果是支持的,就不用费劲改了
role和权限的表示方式都是Flask-HTTPAuth定义的
我试了一下,修改并不复杂
我个人建议还是修改一下,这样一致性会更好
auth.current_user
中需要包含哪些信息?
一般只存放用户的唯一标识,如 ID。
auth.current_user 不是一般会返回 User object 嘛?
一般不会是user的全部信息,也可能包含其他信息,会根据具体业务调整
这个不是在程序内部用来获取用户对象的属性吗?还是说你指的是开放给外部的 API 数据?
如果用JWT的话,其实差不多
这样说应该就没有歧义了,jwt的payload部分应该包含哪些信息?