如何用Java解析next-auth生成的JWT Token并獲取其中的信息?

使用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
喜歡就支持一下吧
點贊9 分享