作者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/m.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