使用Java解密next-auth生成的jwt Token并獲取信息
在使用next-auth生成jwt token時,我們會遇到一個問題:如何用java解析這些token并獲取其中的信息?這是一個非常實用的需求,特別是在需要進行跨平臺驗證和數據提取時。
我使用next-auth生成了jwt token,并設置了auth_secret=123456,如下所示:
callbacks: { // ref: https://authjs.dev/guides/basics/role-based-Access-control#persisting-the-role async jwt({token, user}) { return token }, // if you want to use the role in client components async Session({session,user, token}) { return session }, }
生成的jwt token如下:
eyjhbgcioijkaxiilcjlbmmioijbmju2q0jdluhtnteyiiwia2lkijoib0y4su1ycv9szuxryxhsevznzvnsuxc4vfnabnrrd1r0nmz1bnz1zzhbt2gtr2j1wkp4dnhhrllqb3fuavytrl92yzatwgxqujdarlrldkvon181vhcifq..dixteiywelvgcf5muhylqq.tscvrh0uxewydfj5g2sn_81ivsfsxpa5ffydycfw8w_n-qmyh3nbklp1cog1vbo2vbypsnormsfdi6nxzzyo264rvqscazdmrzl1lf-hldtuxupy8kugig828p1tpeipx8huemr_h6yk7mwgmfdqw7dtzbreyvfa-mtsmykq_10gigjglhfd-yzr7en_-77gqxoaryluoaizxge8iya3tmbytds9sgn55cvvnrdycak6gy4ptlmikw0pindsicgyzhyhjyrfb1vchzvmjwzelxpwrwbjgn52twmfc3xiowbvsfsyfvr0znt6mvdqw5lnytdq-tvucdwwm-xdrra5gw.bwaf05t99yvb1qybgbfvpik9t_zup2yq5xug26h7qng
然而,當我嘗試用java解析這個token時,報錯如下:
static void me() { string jwt = "eyjhbgcioijkaxiilcjlbmmioijbmju2q0jdluhtnteyiiwia2lkijoib0y4su1ycv9szuxryxhsevznzvnsuxc4vfnabnrrd1r0nmz1bnz1zzhbt2gtr2j1wkp4dnhhrllqb3fuavytrl92yzatwgxqujdarlrldkvon181vhcifq..dixteiywelvgcf5muhylqq.tscvrh0uxewydfj5g2sn_81ivsfsxpa5ffydycfw8w_n-qmyh3nbklp1cog1vbo2vbypsnormsfdi6nxzzyo264rvqscazdmrzl1lf-hldtuxupy8kugig828p1tpeipx8huemr_h6yk7mwgmfdqw7dtzbreyvfa-mtsmykq_10gigjglhfd-yzr7en_-77gqxoaryluoaizxge8iya3tmbytds9sgn55cvvnrdycak6gy4ptlmikw0pindsicgyzhyhjyrfb1vchzvmjwzelxpwrwbjgn52twmfc3xiowbvsfsyfvr0znt6mvdqw5lnytdq-tvucdwwm-xdrra5gw.bwaf05t99yvb1qybgbfvpik9t_zup2yq5xug26h7qng"; try { // 配置jwt解析器,設置簽名密鑰和允許的算法 claims claims = jwts.parserbuilder() .setsigningkey("123456") // 設置簽名密鑰 .setallowedclockskewseconds(60) // 允許的時間偏差(可選) .build() .parseclaimsjws(jwt) // 解析token,并自動驗證簽名 .getbody(); // 獲取claims對象 // 從claims對象中獲取你需要的信息 string subject = claims.getsubject(); // ... 獲取其他claim信息 system.out.println("subject: " + subject); // ... 打印其他信息 } catch (exception e) { // 處理異常,可能是簽名無效、token過期或其他問題 e.printstacktrace(); } }
報錯信息:
立即學習“Java免費學習筆記(深入)”;
io.jsonwebtoken.malformedjwtexception: jwt strings must contain exactly 2 period characters. found: 4 at io.jsonwebtoken.impl.defaultjwtparser.parse(defaultjwtparser.java:296) at io.jsonwebtoken.impl.defaultjwtparser.parse(defaultjwtparser.java:550) at io.jsonwebtoken.impl.defaultjwtparser.parseclaimsjws(defaultjwtparser.java:610) at io.jsonwebtoken.impl.immutablejwtparser.parseclaimsjws(immutablejwtparser.java:173) at com.seaurl.gatewaysvr.gatewayserverapplication.me(gatewayserverapplication.java:32) at com.seaurl.gatewaysvr.gatewayserverapplication.main(gatewayserverapplication.java:49)
問題在于next-auth生成的token是經過加密的,僅供當前應用使用。如果想要在第三方應用中使用token,可以在登錄后在session中設置一個自定義的token。例如:
session.accessToken = your_token
通過這種方式,我們可以在java中處理這些token,并獲取其中的信息。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END