请教一下 v2 的后端大佬,关于 jwt 鉴权的。

2018-10-12 14:35:43 +08:00
 FakeLeung

目前就是一个小项目。有 web 端和小程序端,所以想使用 jwt 作为鉴权的介质。

我的想法如下:

jwt 中携带的 payload 的数据结构为:

{
	"user": {
    	"name": "xxx",
        "uid: "123"
    },
    "uuid": "xxxxx"
}

其中,user 是存放当前登录用户的用户名和 UID。uuid 则是存放在 redis 的 key 值。

鉴权过程:

  1. 解析 jwt,若出错,则校验失败。
  2. 解析成功,拿到 uuid,去 redis 中获取数据,若不存在,则校验失败。
  3. 获取成功,对比 user.nameuser.uid,若不匹配,则校验失败。
  4. 刷新 jwt 的过期时间。(是否需要进行?)

不知道这样能不能保证一定的安全性问题?

3929 次点击
所在节点    程序员
14 条回复
Exceptions
2018-10-12 14:47:24 +08:00
jwt 验下签名就可以了吧,主要是防篡改。
qq976739120
2018-10-12 14:51:53 +08:00
我觉得吧,小项目搞个 uuid 做标识就够了....真的蛮方便的
bk201
2018-10-12 15:33:22 +08:00
用户修改密码了怎么办?
DavidNineRoc
2018-10-12 16:26:18 +08:00
都没必要这么多信息,jwt 里直接存用户数据表的 id 字段就行了。
如果你的第三步对比,是指拿到数据库对比那就没必要存储这么多信息。只需要一个 id,然后登录的时候查询数据库用户。
如果想存 redis,直接 key 是 token,value 是 用户 id。设置过期时间,如果用户修改密码之后的,直接让这个 token 过期。
FakeLeung
2018-10-12 16:39:14 +08:00
@bk201
对噢,那就得改改了。
redis 里改成 hashmap , uid 为 key,uuid 为 value。修改密码,则直接删除 key 为 uid 的 hashmap。这样可以不。


@qq976739120
直接 uuid 当 token 使吗?

@Exceptions
那 payload 里面不存东西吗?

@DavidNineRoc
就是懒得再去 db 查,想直接对比在 reids 中存下的信息。
Exceptions
2018-10-12 17:37:19 +08:00
@FakeLeung payload 存东西呀,只不过存一些不敏感的数据,比如 uid,昵称。需要更详细就去查表或者查 redis。
你第二步和第三步验证其实就是多于的,只要你验签成功,你私钥又没泄露,那么数据就没篡改过。
第四步更新时间就随意了,可以给个短点的不断去更新,也可以给个长点的,失效就重新登录。
YaphetYin
2018-10-12 17:43:55 +08:00
不是很明白这个初衷为站外 oauth 授权诞生的东西怎么会一直有人站内使用,不可撤销了解一下?
qq976739120
2018-10-12 17:56:03 +08:00
@FakeLeung 对啊,然后 redis 里面 uuid: 用户的一些常用信息
FakeLeung
2018-10-12 20:48:49 +08:00
@qq976739120 噢噢,虽然现在也是这样。但是有个问题,就是移动端较多,这么样,每次一个 uuid,会不会很占内存。(虽然也没什么用户)
znood
2018-10-13 07:24:30 +08:00
首先楼主需要明白 [认证] 和 [鉴权] 的区别
认证是对用户访问的人员认证,表明访问者是谁;而鉴权是在认证的基础上检查该用户是否对资源有访问权限。

所以你应该只需要认证,而认证中不需要 payload 也能获取到用户名;因为 token 是你用私有 key 签发给用户的,只需要用 public 证书验证 token 是否有效,然后从 token 中取用户名即可。
lusirui
2018-10-13 10:37:14 +08:00
@znood 请教下认证和鉴权对应的英文是哪个,我看都是 authentication
ioiogoo
2018-10-13 11:01:19 +08:00
@lusirui 认证 (authentication) 授权 (authorization)
FakeLeung
2018-10-13 11:05:46 +08:00
@znood
你所说的 token 是指?
znood
2018-10-13 11:20:58 +08:00
@FakeLeung 楼主说的 jwt

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/497047

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX