package Ġcom . menu xx . sso . auth Ċ Ċ import Ġio . json web token . Claims Ċ import Ġio . json web token . Expired Jwt Exception Ċ import Ġio . json web token . Jw ts Ċ import Ġio . json web token . Signature Algorithm Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . security . core . user details . UserDetails Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . util . Date Ċ Ċ /** Ċ Ġ* Ġä½ľèĢħ : Ġy in ch ang sh eng @ gmail . com Ċ Ġ* ĠåĪĽå»º äºİ : Ġ 2 0 1 7 / 1 2 / 1 8 Ċ Ġ* Ġ å¾®ä¿¡ : Ġy in 8 0 8 7 1 9 0 1 Ċ Ġ* Ċ Ġ* Ġåľ¨ Ġ å¾®ä¿¡ åħ¬ ä¼Ĺ åı· ä¸Ń Ġsubject Ġ ä»£è¡¨ Ġopen id Ċ Ġ* Ġåľ¨ Ġæ Ļ ® éĢļ Ġapi Ġä¸Ń Ġsubject Ġ ä»£è¡¨ Ġ æīĭæľº åı· Ċ Ġ*/ Ċ class ĠToken Processor ( private Ġval Ġsecret : ĠString , Ġprivate Ġval Ġexpiration : ĠInt ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Token Processor :: class . java ) ĊĊĠĠĠ Ġprivate Ġfun Ġget Claims From Token Ignore Exception ( token : ĠString ) Ġ: ĠCla ims ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ w ts . parser () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Signing Key ( secret . toByteArray ( Charset . forName (" UTF - 8 "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Claims J ws ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠExp ired Jwt Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . claims ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æīĢæľī ĠCla ims ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Claims From Token ( token : ĠString ) Ġ: ĠCla ims ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ w ts . parser () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Signing Key ( secret . toByteArray ( Charset . forName (" UTF - 8 "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Claims J ws ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ Ġ èº«ä»½ Ġkey ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Principal From Token ( token : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Claims From Token ( token )?. subject ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ Ġtoken ĠçļĦ åĪĽå»º æĹ¥æľŁ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Created Date From Token ( token : ĠString ) Ġ: ĠDate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDate ( get Claims From Token ( token )?. get (" created ") Ġas ĠLong ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ Ġtoken ĠçļĦ è¿ĩ æľŁ æĹ¶éĹ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Expiration Date From Token ( token : ĠString ) Ġ: ĠDate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Claims From Token ( token )?. expiration ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Audience From Token ( token : ĠString ) Ġ: ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Claims From Token ( token )?. get (" audience ") Ġas ĠString ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetUser type From Token ( token : ĠString ) Ġ: ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Claims From Token ( token )?. get (" user type ") Ġas ĠInt ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Current Date (): ĠDate Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDate ( System . currentTimeMillis ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¾ĹåĪ° è¿ĩ æľŁ æĹ¶éĹ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgen Expiration Date () Ġ: ĠDate Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDate ( System . currentTimeMillis () Ġ+ Ġexpiration Ġ* Ġ 1 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġtoken Ġæĺ¯åĲ¦ è¿ĩ æľŁ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Token Expired ( token : ĠString ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Expiration Date From Token ( token )?. before ( generate Current Date ()) Ġ?: Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠçĶŁæĪĲ Ġtoken ĊĠĠĠĠ Ġ* Ġopen Id ĠçĶ¨æĪ· åľ¨ å¾®ä¿¡ ä¸ŃçļĦ Ġopen id ĊĠĠĠĠ Ġ* Ġip Address ĠçĶ¨æĪ· å®¢æĪ·ç«¯ çļĦ Ġip Ġ åľ°åĿĢ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgen Token ( principal : ĠString , Ġuser Type : ĠInt , Ġip Address : ĠString ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclaims Ġ= Ġhash Map Of (" sub " Ġto Ġprincipal , Ġ" user type " Ġto Ġuser Type , Ġ" audience " Ġto Ġip Address , Ġ" created " Ġto Ġgenerate Current Date ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġgenerate Token ( claims ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĪ·æĸ° Ġtoken Ġ ä»¤ çīĮ ĊĠĠĠĠ Ġ* Ġ åİŁ èį ¯ åİŁ æĿ¥çļĦ Ġtoken ĊĠĠĠĠ Ġ* Ġä¼ļ åĪ·æĸ° åĪĽå»º æĹ¶éĹ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrefresh Token ( token : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclaims Ġ= Ġget Claims From Token Ignore Exception ( token ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclaims [" created "] Ġ= Ġgenerate Current Date () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgenerate Token ( claims . toMap ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Token ( claims : ĠMap < String , ĠAny >) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ w ts . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Claims ( claims ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Expiration ( gen Expiration Date ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sign With ( Signature Algorithm . HS 5 1 2 , Ġsecret . toByteArray ( Charset . forName (" UTF - 8 "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compact () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// did n 't Ġwant Ġto Ġhave Ġthis Ġmethod Ġthrow Ġthe Ġexception , Ġwould Ġrather Ġlog Ġit Ġand Ġsign Ġthe Ġtoken Ġlike Ġit Ġwas Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJ w ts . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Claims ( claims ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Expiration ( gen Expiration Date ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sign With ( Signature Algorithm . HS 5 1 2 , Ġsecret ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compact () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éªĮè¯ģ Ġtoken ĊĠĠĠĠ Ġ* Ġ 1 . Ġæł¹æį® çĶ¨æĪ· ç±»åŀĭ Ġ éªĮè¯ģ Ġ ä¸»è¦ģ ä¿¡æģ¯ æĺ¯åĲ¦ ä¸Ģèĩ´ Ġæĺ¯åĲ¦ ä¸Ģèĩ´ ĊĠĠĠĠ Ġ* Ġ 2 . Ġ éªĮè¯ģ Ġæĺ¯åĲ¦ è¿ĩ æľŁ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġvalidate Token ( token : ĠString , Ġuser Details : ĠUser Details ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauth User Ġ= Ġuser Details Ġas ĠAuth User ĊĠĠĠĠĠĠĠ Ġval Ġprincipal Ġ= Ġget Principal From Token ( token ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( auth User . user Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth User Type Normal Ġ-> Ġprincipal Ġ== Ġauth User . union id Ġ&& Ġ! this . is Token Expired ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth User Type Merchant Ġ-> Ġprincipal Ġ== Ġauth User . phoneNumber Ġ&& Ġ! this . is Token Expired ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth User Type Admin Ġ-> Ġprincipal Ġ== Ġauth User . userName Ġ&& Ġ! this . is Token Expired ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }