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

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

  •  
  •   FakeLeung · 2018-10-12 14:35:43 +08:00 · 3908 次点击
    这是一个创建于 2237 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    所以你应该只需要认证,而认证中不需要 payload 也能获取到用户名;因为 token 是你用私有 key 签发给用户的,只需要用 public 证书验证 token 是否有效,然后从 token 中取用户名即可。
    lusirui
        11
    lusirui  
       2018-10-13 10:37:14 +08:00
    @znood 请教下认证和鉴权对应的英文是哪个,我看都是 authentication
    ioiogoo
        12
    ioiogoo  
       2018-10-13 11:01:19 +08:00
    @lusirui 认证 (authentication) 授权 (authorization)
    FakeLeung
        13
    FakeLeung  
    OP
       2018-10-13 11:05:46 +08:00
    @znood
    你所说的 token 是指?
    znood
        14
    znood  
       2018-10-13 11:20:58 +08:00
    @FakeLeung 楼主说的 jwt
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5720 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:35 · PVG 09:35 · LAX 17:35 · JFK 20:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.