作者jtorngl (DDFL)
看板java
标题[问题] 请问 access token 使用问题
时间Sat Jun 27 11:13:43 2020
※状况概述:
最近在研究 Spring Security 和 OAuth2 授权
目前的需求情境是:存取 API 需要登入
而 token 会储存在 client,每次呼叫 API 时传送该 token
登入可以使用注册的帐密,也可以透过第三方登入
使用帐密登入,目前登入验证成功後,会建立一个 JWT 回传至 client
而第三方登入,Spring Security 的 OAuth2 filter
会从导页至登入页,到取得 access token 直接处理完
并且把 access token 和其它资讯存在 session 的样子
目前 client 的开发人员是决定由他自己去取得 access token
第一个问题是
1. client 直接取得第三方的 access token
存取 API 时,server 需要验证该 access token 是否有效
然後不希望每次 request 都要重验 access token 有效性
验证成功後建个 mapping 储存在 cache
2. client 只要取得 authentication code 就好
再由 server 拿 code 去换 access token
server 成功取得 access token 後储存在 cache
想请问实务上的实做方式是哪种?或是是其它方式?
第二个问题是
目前只会存取自己 web 的服务,不需要存取第三方的 API
那不管问题一如何取得 access token
是否可以重新建一个 JWT 给 client
例如我希望 token 的有效期限是 30 分钟
从第三方的 token 取得需要的资讯,然後重新建一份 JWT 给 client
每次 request 检查是否过期,再决定是 server 直接重取
或是请 user 再重新登入
以前都是碰 Struts2 / Spring MVC + JSP 的环境
现在对於 SPA / APP + RESTful API 的开发模式蛮陌生的
还有很多问题需要犁清,不过还是想先确认上述二个问题实做是否有误
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.43.69.88 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1593227626.A.365.html
1F:→ ssccg: 2的多出server拿code换token是避免access token流到client 06/27 15:07
2F:→ ssccg: 提昇安全性(例如防止XSS攻击偷走token),因为code换token会 06/27 15:08
3F:→ ssccg: 再验证一次是合法的server 06/27 15:10
请问是建议第2个方式比较好吗
因为我们client开发人员认为他直接去拿第三方access token就好了
而server端基於不信任client传来的资料,是一定要再验证过的
若第三方的access token 被 user 以外的管道拿到
表示该管道就可以呼叫第三方的API取得user的资料了的意思
所以还是client拿code,让server去换access token比较好吗
4F:→ ssccg: 第二个问题,基本上确认token正确後,本来server端就可以用 06/27 15:11
5F:→ ssccg: 自己的登入方式处理,你要另发server自己的JWT token或传统 06/27 15:11
6F:→ ssccg: 的http session都可以,本来就不会只靠access token 06/27 15:12
7F:→ ssccg: access token是还要存取第三方的resource server时才用的 06/27 15:16
会部署在多server的环境,所以选择传token的方式
session的方式没做过在多server的环境,除非存资料库吧
或是要查一下多server的session实做方式
还有很多安全性方面的问题要确认,先感谢了
※ 编辑: jtorngl (114.43.69.88 台湾), 06/27/2020 17:29:33
8F:→ ssccg: 主要还是看应用场景,最小授权原则,如果client没必要直接 07/04 13:29
9F:→ ssccg: 用到access token就不要让client端拿到 07/04 13:30
10F:→ ssccg: 如果没有任何资讯会存在server session中的话,的确只用 07/04 13:31
11F:→ ssccg: token做成完全stateless会比较方便 07/04 13:31
12F:推 new122851: 跨多server的session管理可以用redis效率比存RDB好 08/01 18:20