首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  程序员

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

  •  
  •   FakeLeung · 9 天前 · 1385 次点击

    目前就是一个小项目。有 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 的过期时间。(是否需要进行?)

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

    14 回复  |  直到 2018-10-13 11:20:58 +08:00
        1
    Exceptions   9 天前
    jwt 验下签名就可以了吧,主要是防篡改。
        2
    qq976739120   9 天前
    我觉得吧,小项目搞个 uuid 做标识就够了....真的蛮方便的
        3
    bk201   9 天前
    用户修改密码了怎么办?
        4
    DavidNineRoc   9 天前
    都没必要这么多信息,jwt 里直接存用户数据表的 id 字段就行了。
    如果你的第三步对比,是指拿到数据库对比那就没必要存储这么多信息。只需要一个 id,然后登录的时候查询数据库用户。
    如果想存 redis,直接 key 是 token,value 是 用户 id。设置过期时间,如果用户修改密码之后的,直接让这个 token 过期。
        5
    FakeLeung   9 天前
    @bk201
    对噢,那就得改改了。
    redis 里改成 hashmap , uid 为 key,uuid 为 value。修改密码,则直接删除 key 为 uid 的 hashmap。这样可以不。


    @qq976739120
    直接 uuid 当 token 使吗?

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

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

    所以你应该只需要认证,而认证中不需要 payload 也能获取到用户名;因为 token 是你用私有 key 签发给用户的,只需要用 public 证书验证 token 是否有效,然后从 token 中取用户名即可。
        11
    lusirui   8 天前
    @znood 请教下认证和鉴权对应的英文是哪个,我看都是 authentication
        12
    ioiogoo   8 天前
    @lusirui 认证 (authentication) 授权 (authorization)
        13
    FakeLeung   8 天前
    @znood
    你所说的 token 是指?
        14
    znood   8 天前
    @FakeLeung 楼主说的 jwt
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   533 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 83ms · UTC 21:41 · PVG 05:41 · LAX 14:41 · JFK 17:41
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1