前后端分离, JWT 还是 Oauth2?

2018-03-20 10:19:30 +08:00
 bayker

自己内部的一套系统,不存在提供第三方调用。

采用前后端分离, 使用 JWT 还是 oauth2?

第一次使用,不是太明白,JWT 怎么实现 token 刷新,token 过期,后端禁用?

26862 次点击
所在节点    前端开发
25 条回复
EPr2hh6LADQWqRVH
2018-03-20 10:38:43 +08:00
没法过期,参考证书的 CRL 机制。
EPr2hh6LADQWqRVH
2018-03-20 10:39:40 +08:00
不是没法过期,是没法提前禁用,嗯,就是你说的后端禁用
bolide2005
2018-03-20 10:46:24 +08:00
这两个就不是一个应用场景,理论上来说你可以都用,用户登录使用 oauth2,给用户邮箱发送验证链接用 jwt
jwt 的设计中包含了 expire time,方案是放在 jwt 的 payload 中; token 刷新预留一个 path 就 ok 了,访问这个 path,提取并验证用户信息后发一个新的 token 返回给客户端;后端禁用在 jwt 的设计中是不能实现的,当然你可以在数据库里保存 token 并标记,但这违反了 jwt 的设计原则,要真是有这样的需求,说明你的使用场景不适合 jwt
ycz0926
2018-03-20 10:53:29 +08:00
oauth2
方便后续接入其他系统
ycz0926
2018-03-20 10:53:56 +08:00
@ycz0926 结合 sso
mdluo
2018-03-20 10:57:39 +08:00
你可能并不需要 OAuth2: https://git.io/vxGxy
notreami
2018-03-20 12:24:18 +08:00
根据你的项目,直接一个唯一 id,生成 token,每次请求都去校验下这个 token 就可以了。
brelian
2018-03-20 13:15:09 +08:00
如果 token 要刷新不建议用 JWT,验证登录态后每次都需要重新颁发 token 吧。
feverzsj
2018-03-20 13:17:05 +08:00
session id 是最好的
javlib
2018-03-20 13:40:48 +08:00
我感觉 JWT 的好处是不需要在服务端存储用户 token,这个更适合给程序调用使用,比如临时获取一个 JWT,过期时间是 1 个小时,过期后重新获取。
JWT 给用户用不是很合适,如果你需要这些功能
1 对 token 刷新使用期限
2 支持 token 失效
JWT 就不好用了。
bayker
2018-03-20 13:51:59 +08:00
感谢大家回复,
请问
@avastms
@brelian
那怎么实现像 session 20 分钟未向服务端请求就过期呢?比如登陆了管理系统后台,如果一直没过期,就存在不安全啊?
@javlib
是否使用 oauth2 能实现?
nl101531
2018-03-20 13:54:21 +08:00
@bolide2005 可以下发 token 的时候保存用户版本,然后改密码用户版本自增。实现吊销功能。
mdluo
2018-03-20 13:54:34 +08:00
很明显这种没有第三方参与的场景是不适合用 OAuth 的,参考我上面 #6 的回复的链接

JWT 的过期和刷新也很好做,参考业界主流做法,AWS、Azure 和 Auth0 都是用 JWT 为载体,ID Token + Access Token + Refresh Token 的模式:

https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims

https://auth0.com/docs/tokens
phpcxy
2018-03-20 13:59:41 +08:00
jwt 除了后端禁用外其他都可以实现到
bayker
2018-03-20 14:04:43 +08:00
@phpcxy 需求是 只要有持续与服务器交互,过期时间都会往后延续,除非间隔了 20 分钟都未交互,token 就过期。
或者在另一台电脑修改了密码,以前登陆的地方都失效?
bayker
2018-03-20 14:07:27 +08:00
@bolide2005 感谢,明白了 jwt 的使用场景?意思是 jwt 不适合做用户鉴定? 但 oauth2 感觉在自己内部系统间使用好像也不适合?
bayker
2018-03-20 14:19:50 +08:00
@mdluo 能给一个 ID Token + Access Token + Refresh Token 的文章吗? 明白了不适合 oauth2 但没明白 jwt 的解决方案。
whypool
2018-03-20 14:38:40 +08:00
jwt 就行,现在都玩微服务,可以很好和其他服务互相配合
一套 jwt 机制,配合现在多客户端(web,android,ios,weixin),基本上可以做到无缝切换
bayker
2018-03-20 14:41:06 +08:00
@whypool 请问 jwt #15 楼的需求怎么实现呢? 后端用数据库记录 需要过期的 token?
whypool
2018-03-20 14:49:56 +08:00
@bayker jwt 一般不存数据库,而是放缓存,比如 reids
如果有交互就重置一下有效期就行,或者自己写个对比一下时间戳

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

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

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

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

© 2021 V2EX