目前就是一个小项目。有 web 端和小程序端,所以想使用 jwt 作为鉴权的介质。
我的想法如下:
jwt 中携带的 payload 的数据结构为:
{
"user": {
"name": "xxx",
"uid: "123"
},
"uuid": "xxxxx"
}
其中,user 是存放当前登录用户的用户名和 UID。uuid 则是存放在 redis 的 key 值。
鉴权过程:
uuid
,去 redis 中获取数据,若不存在,则校验失败。user.name
和 user.uid
,若不匹配,则校验失败。不知道这样能不能保证一定的安全性问题?
1
Exceptions 2018-10-12 14:47:24 +08:00
jwt 验下签名就可以了吧,主要是防篡改。
|
2
qq976739120 2018-10-12 14:51:53 +08:00
我觉得吧,小项目搞个 uuid 做标识就够了....真的蛮方便的
|
3
bk201 2018-10-12 15:33:22 +08:00
用户修改密码了怎么办?
|
4
DavidNineRoc 2018-10-12 16:26:18 +08:00
都没必要这么多信息,jwt 里直接存用户数据表的 id 字段就行了。
如果你的第三步对比,是指拿到数据库对比那就没必要存储这么多信息。只需要一个 id,然后登录的时候查询数据库用户。 如果想存 redis,直接 key 是 token,value 是 用户 id。设置过期时间,如果用户修改密码之后的,直接让这个 token 过期。 |
5
FakeLeung OP @bk201
对噢,那就得改改了。 redis 里改成 hashmap , uid 为 key,uuid 为 value。修改密码,则直接删除 key 为 uid 的 hashmap。这样可以不。 @qq976739120 直接 uuid 当 token 使吗? @Exceptions 那 payload 里面不存东西吗? @DavidNineRoc 就是懒得再去 db 查,想直接对比在 reids 中存下的信息。 |
6
Exceptions 2018-10-12 17:37:19 +08:00
@FakeLeung payload 存东西呀,只不过存一些不敏感的数据,比如 uid,昵称。需要更详细就去查表或者查 redis。
你第二步和第三步验证其实就是多于的,只要你验签成功,你私钥又没泄露,那么数据就没篡改过。 第四步更新时间就随意了,可以给个短点的不断去更新,也可以给个长点的,失效就重新登录。 |
7
YaphetYin 2018-10-12 17:43:55 +08:00 via iPhone
不是很明白这个初衷为站外 oauth 授权诞生的东西怎么会一直有人站内使用,不可撤销了解一下?
|
8
qq976739120 2018-10-12 17:56:03 +08:00
@FakeLeung 对啊,然后 redis 里面 uuid: 用户的一些常用信息
|
9
FakeLeung OP @qq976739120 噢噢,虽然现在也是这样。但是有个问题,就是移动端较多,这么样,每次一个 uuid,会不会很占内存。(虽然也没什么用户)
|
10
znood 2018-10-13 07:24:30 +08:00
首先楼主需要明白 [认证] 和 [鉴权] 的区别
认证是对用户访问的人员认证,表明访问者是谁;而鉴权是在认证的基础上检查该用户是否对资源有访问权限。 所以你应该只需要认证,而认证中不需要 payload 也能获取到用户名;因为 token 是你用私有 key 签发给用户的,只需要用 public 证书验证 token 是否有效,然后从 token 中取用户名即可。 |