package Ġcom . ml ree f . rest . feature . auth Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . github . scribe java . apis .* Ċ import Ġcom . github . scribe java . core . builder . Service Builder Ċ import Ġcom . github . scribe java . core . builder . api . DefaultApi 1 0 a Ċ import Ġcom . github . scribe java . core . builder . api . DefaultApi 2 0 Ċ import Ġcom . github . scribe java . core . model .* Ċ import Ġcom . github . scribe java . core . oauth . AccessToken Request Params Ċ import Ġcom . github . scribe java . core . oauth . OAuth 1 0 a Service Ċ import Ġcom . github . scribe java . core . oauth . OAuth 2 0 Service Ċ import Ġcom . github . scribe java . core . oauth . OAuth Service Ċ import Ġcom . ml ree f . rest . OAuth Configuration Ċ import Ġcom . ml ree f . rest . config . security . oauth .* Ċ import Ġcom . ml ree f . rest . domain . Account External Ċ import Ġcom . ml ree f . rest . domain . Account Token Ċ import Ġcom . ml ree f . rest . exceptions . Authentication Exception Ċ import Ġcom . ml ree f . rest . exceptions . Feature NotSupported Ċ import Ġcom . ml ree f . rest . exceptions . Internal Exception Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . AZURE _ CODE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . AZURE _ ERROR _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . AZURE _ PROFILE _ EMAIL _ KEY _ 1 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . AZURE _ PROFILE _ EMAIL _ KEY _ 2 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . AZURE _ PROFILE _ FIRST NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . AZURE _ PROFILE _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . AZURE _ PROFILE _ LAST NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . AZURE _ PROFILE _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . AZURE _ STATE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . FACE BOOK _ CODE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . FACE BOOK _ ERROR _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . FACE BOOK _ PROFILE _ AV AT AR _ KEY _ 1 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . FACE BOOK _ PROFILE _ AV AT AR _ KEY _ 2 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . FACE BOOK _ PROFILE _ AV AT AR _ KEY _ 3 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . FACE BOOK _ PROFILE _ EMAIL _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . FACE BOOK _ PROFILE _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . FACE BOOK _ PROFILE _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . FACE BOOK _ STATE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . F RE EL AN CER _ CODE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . F RE EL AN CER _ ERROR _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . F RE EL AN CER _ PROFILE _ AV AT AR _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . F RE EL AN CER _ PROFILE _ EMAIL _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . F RE EL AN CER _ PROFILE _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . F RE EL AN CER _ PROFILE _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . F RE EL AN CER _ PROFILE _ ROOT _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . F RE EL AN CER _ PROFILE _ USERNAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . F RE EL AN CER _ STATE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GITHUB _ CODE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GITHUB _ ERROR _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GITHUB _ PROFILE _ AV AT AR _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GITHUB _ PROFILE _ EMAIL _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GITHUB _ PROFILE _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GITHUB _ PROFILE _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GITHUB _ PROFILE _ RE POS _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GITHUB _ PROFILE _ USERNAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GITHUB _ STATE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GIT LAB _ CODE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GIT LAB _ ERROR _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GIT LAB _ PROFILE _ AV AT AR _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GIT LAB _ PROFILE _ EMAIL _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GIT LAB _ PROFILE _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GIT LAB _ PROFILE _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GIT LAB _ PROFILE _ RE POS _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GIT LAB _ PROFILE _ USERNAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GIT LAB _ STATE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GOOGLE _ CODE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GOOGLE _ ERROR _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GOOGLE _ PROFILE _ AV AT AR _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GOOGLE _ PROFILE _ EMAIL _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GOOGLE _ PROFILE _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GOOGLE _ PROFILE _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . GOOGLE _ STATE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ CODE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ ERROR _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PREFERRED _ LOCAL E Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ AV AT AR _ KEY _ 1 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ AV AT AR _ KEY _ 2 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ EMAIL _ KEY _ 1 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ EMAIL _ KEY _ 2 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ EMAIL _ KEY _ 3 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ FIRST _ NAME _ KEY _ 1 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ FIRST _ NAME _ KEY _ 2 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ LAST _ NAME _ KEY _ 1 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ LAST _ NAME _ KEY _ 2 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ LOCAL IZED _ FIRST _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ PROFILE _ LOCAL IZED _ LAST _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LINK ED IN _ STATE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LI VE _ CODE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LI VE _ ERROR _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LI VE _ PROFILE _ EMAIL _ KEY _ 1 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LI VE _ PROFILE _ EMAIL _ KEY _ 2 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LI VE _ PROFILE _ EMAIL _ KEY _ 3 Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LI VE _ PROFILE _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LI VE _ PROFILE _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . LI VE _ STATE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . STACK EX CHANGE _ CODE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . STACK EX CHANGE _ ERROR _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . STACK EX CHANGE _ PROFILE _ ACCOUNT _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . STACK EX CHANGE _ PROFILE _ AV AT AR _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . STACK EX CHANGE _ PROFILE _ EMAIL _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . STACK EX CHANGE _ PROFILE _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . STACK EX CHANGE _ PROFILE _ ROOT _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . STACK EX CHANGE _ STATE _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . TW IT TER _ O AUTH _ TOKEN _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . TW IT TER _ O AUTH _ VER IFIER _ PARAM _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . TW IT TER _ PROFILE _ AV AT AR _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . TW IT TER _ PROFILE _ EMAIL _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . TW IT TER _ PROFILE _ ID _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . TW IT TER _ PROFILE _ NAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . Token Keys . TW IT TER _ PROFILE _ USERNAME _ KEY Ċ import Ġcom . ml ree f . rest . feature . auth . helpers . Fre el ancer Api 2 0 Ċ import Ġcom . ml ree f . rest . feature . auth . helpers . Git Lab Api Ċ import Ġcom . ml ree f . rest . feature . cache s . Social Auth Cache Ċ import Ġcom . ml ree f . rest . utils . Random Utils Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ Ċ /** Ċ Ġ* Ġhttps :// github . com / scribe java / scribe java Ċ Ġ*/ Ċ Ċ @ Service Ċ class ĠSocial Service ( ĊĠĠĠ Ġprivate Ġval Ġo Auth Client Settings Storage : ĠOAuth Client Settings Storage , ĊĠĠĠ Ġprivate Ġval Ġo Auth Configuration : ĠOAuth Configuration , ĊĠĠĠ Ġprivate Ġval Ġauth Service : ĠAuth Service , ĊĠĠĠ Ġprivate Ġval Ġuser Resolver Service : ĠUser Resolver Service , ĊĠĠĠ Ġprivate Ġval ĠobjectMapper : ĠObjectMapper , ĊĠĠĠ Ġprivate Ġval Ġsocial Auth Cache : ĠSocial Auth Cache , Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( this :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ LENGTH Ġ= Ġ 3 0 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRED I RECT _ URL Ġ= Ġ"/ api / v 1 / social / login /" ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠT WIT TER _ PROFILE _ URL Ġ= Ġ" https :// api . twitter . com / 1 . 1 / account / verify _ credentials . json ? include _ email = true & include _ entities = false " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFACE BOOK _ PROFILE _ URL Ġ= Ġ" https :// graph . facebook . com / v 3 . 2 / me ? fields = id , name , email , picture . type ( large )" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG ITHUB _ PROFILE _ URL Ġ= Ġ" https :// api . github . com / user " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGOOGLE _ PROFILE _ URL Ġ= Ġ" https :// www . googleapis . com / oauth 2 / v 3 / userinfo " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGIT LAB _ PROFILE _ URL Ġ= Ġ" https :// gitlab . com / oauth / userinfo " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMIC ROS OFT _ LI VE _ PROFILE _ URL Ġ= Ġ" https :// apis . live . net / v 5 . 0 / me "; ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠF RE EL AN CER _ PROFILE _ URL Ġ= Ġ" https :// www . fre el ancer . com / api / users / 0 . 1 / self " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠF RE EL AN CER _ TEST _ PROFILE _ URL Ġ= Ġ" https :// www . fre el ancer - sandbox . com / api / users / 0 . 1 / self " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAZ URE _ PROFILE _ URL Ġ= Ġ" https :// graph . microsoft . com / v 1 . 0 / me " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTACK EX CHANGE _ PROFILE _ URL Ġ= Ġ" https :// api . stack exchange . com / 2 . 2 / me "; ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLINK ED IN _ PROFILE _ URL Ġ= Ġ" https :// api . linkedin . com / v 2 / me " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLINK ED IN _ EMAIL _ URL Ġ= Ġ" https :// api . linkedin . com / v 2 / email Address ? q = members & projection =( elements *( handle ~ )) " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ PAGE _ TO _ RE DIRECT _ ON _ SUCCESS Ġ= Ġ"/ dashboard " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ PAGE _ TO _ RE DIRECT _ ON _ FAILURE Ġ= Ġ"/ login " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Authentication Redirect Path ( clientId : ĠString , Ġrequest : ĠHttpServletRequest , Ġresponse : ĠHttpServletResponse ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( clientId . trim (). toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ITHUB _ CLIENT Ġ-> Ġprocess Github Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGOOGLE _ CLIENT Ġ-> Ġprocess Google Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT WIT TER _ CLIENT Ġ-> Ġprocess Twitter Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFACE BOOK _ CLIENT Ġ-> Ġprocess Facebook Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLINK ED IN _ CLIENT Ġ-> Ġprocess Linked In Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGIT LAB _ CLIENT Ġ-> Ġprocess Git lab Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLI VE _ CLIENT Ġ-> Ġprocess Microsoft Live Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF RE EL AN CER _ CLIENT Ġ-> Ġprocess Fre el ancer Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAZ URE _ CLIENT Ġ-> Ġprocess Microsoft Azure Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTACK EX CHANGE _ CLIENT Ġ-> Ġprocess Stack Exchange Authorization ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠFeature NotSupported (" OAuth Ġclient Ġ$ clientId Ġis Ġnot Ġimplemented ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget After Login Redirect Path ( clientId : ĠString , Ġrequest : ĠHttpServletRequest , Ġresponse : ĠHttpServletResponse ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( clientId . trim (). toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ITHUB _ CLIENT Ġ-> Ġprocess Github Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGOOGLE _ CLIENT Ġ-> Ġprocess Google Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT WIT TER _ CLIENT Ġ-> Ġprocess Twitter Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFACE BOOK _ CLIENT Ġ-> Ġprocess Facebook Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLINK ED IN _ CLIENT Ġ-> Ġprocess Linked In Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGIT LAB _ CLIENT Ġ-> Ġprocess Git lab Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLI VE _ CLIENT Ġ-> Ġprocess Microsoft Live Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF RE EL AN CER _ CLIENT Ġ-> Ġprocess Fre el ancer Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAZ URE _ CLIENT Ġ-> Ġprocess Microsoft Azure Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTACK EX CHANGE _ CLIENT Ġ-> Ġprocess Stack Exchange Login ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠFeature NotSupported (" OAuth Ġclient Ġ$ clientId Ġis Ġnot Ġimplemented ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Github Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( getService For Client ( request , ĠG ITHUB _ CLIENT ) Ġas ĠOAuth 2 0 Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Authorization Url ( generate State Code ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Google Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠGOOGLE _ CLIENT ) Ġas ĠOAuth 2 0 Service ĊĠĠĠĠĠĠĠ Ġval Ġadditional Params : ĠMutable Map < String , ĠString > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġadditional Params [" access _ type "] Ġ= Ġ" offline " ĊĠĠĠĠĠĠĠ Ġadditional Params [" prompt "] Ġ= Ġ" consent " ĊĊĠĠĠĠĠĠĠ Ġreturn Ġservice . create Authorization Url Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. state ( generate State Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. additional Params ( additional Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Twitter Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( getService For Client ( request , ĠT WIT TER _ CLIENT ) Ġas ĠOAuth 1 0 a Service ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Authorization Url ( it . request Token ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Facebook Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( getService For Client ( request , ĠFACE BOOK _ CLIENT ) Ġas ĠOAuth 2 0 Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Authorization Url ( generate State Code ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Linked In Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( getService For Client ( request , ĠLINK ED IN _ CLIENT ) Ġas ĠOAuth 2 0 Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Authorization Url ( generate State Code ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Git lab Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( getService For Client ( request , ĠGIT LAB _ CLIENT ) Ġas ĠOAuth 2 0 Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Authorization Url ( generate State Code ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Microsoft Live Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( getService For Client ( request , ĠLI VE _ CLIENT ) Ġas ĠOAuth 2 0 Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Authorization Url ( generate State Code ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Fre el ancer Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠF RE EL AN CER _ CLIENT ) Ġas ĠOAuth 2 0 Service ĊĠĠĠĠĠĠĠ Ġval Ġadditional Params : ĠMutable Map < String , ĠString > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġadditional Params [" advanced _ scopes "] Ġ= Ġ" fl n : user _ information " ĊĊĠĠĠĠĠĠĠ Ġreturn Ġservice . create Authorization Url Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. state ( generate State Code ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. additional Params ( additional Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Microsoft Azure Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( getService For Client ( request , ĠAZ URE _ CLIENT ) Ġas ĠOAuth 2 0 Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Authorization Url ( generate State Code ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Stack Exchange Authorization ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( getService For Client ( request , ĠSTACK EX CHANGE _ CLIENT ) Ġas ĠOAuth 2 0 Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Authorization Url ( generate State Code ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġprocess Github Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Github Ġlogin ") ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠG ITHUB _ CLIENT ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequest . parameter Map [ GITHUB _ STATE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrequest . parameter Map [ GITHUB _ CODE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġrequest . parameter Map [ GITHUB _ ERROR _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthentication Exception (" Cannot Ġauthentication Ġuser Ġin Ġ$ clientId . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert State Code ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 2 0 Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠOAuth 2 AccessToken Ġ= Ġservice . get AccessToken ( code ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠOAuth Request ( Verb . GET , ĠG ITHUB _ PROFILE _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġreq ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( req ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GITHUB _ PROFILE _ ID _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GITHUB _ PROFILE _ EMAIL _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GITHUB _ PROFILE _ NAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GITHUB _ PROFILE _ USERNAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GITHUB _ PROFILE _ RE POS _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GITHUB _ PROFILE _ AV AT AR _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠGithub Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Google Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Google Ġlogin ") ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠGOOGLE _ CLIENT ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequest . parameter Map [ GOOGLE _ STATE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrequest . parameter Map [ GOOGLE _ CODE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġrequest . parameter Map [ GOOGLE _ ERROR _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthentication Exception (" Cannot Ġauthentication Ġuser Ġin Ġ$ clientId . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert State Code ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 2 0 Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= Ġservice . get AccessToken ( code ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . refresh AccessToken ( this . refresh Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠOAuth Request ( Verb . GET , ĠGOOGLE _ PROFILE _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġreq ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( req ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GOOGLE _ PROFILE _ ID _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GOOGLE _ PROFILE _ EMAIL _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GOOGLE _ PROFILE _ NAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GOOGLE _ PROFILE _ AV AT AR _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠGoogle Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Twitter Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠT WIT TER _ CLIENT ĊĠĠĠĠĠĠĠ Ġlog . debug (" Twitter Ġlogin ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoauth Token Ġ= Ġrequest . parameter Map [ TW IT TER _ O AUTH _ TOKEN _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoauth Verifier Ġ= Ġrequest . parameter Map [ TW IT TER _ O AUTH _ VER IFIER _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 1 0 a Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠOAuth 1 AccessToken Ġ= Ġservice . get AccessToken ( OAuth 1 Request Token ( oauth Token , Ġ""), Ġoauth Verifier ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠOAuth Request ( Verb . GET , ĠT WIT TER _ PROFILE _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġreq ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( req ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body [ TW IT TER _ PROFILE _ ID _ KEY ]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body [ TW IT TER _ PROFILE _ EMAIL _ KEY ]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body [ TW IT TER _ PROFILE _ NAME _ KEY ]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body [ TW IT TER _ PROFILE _ USERNAME _ KEY ]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body [ TW IT TER _ PROFILE _ AV AT AR _ KEY ]. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠTwitter Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Facebook Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Facebook Ġlogin ") ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠFACE BOOK _ CLIENT ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequest . parameter Map [ FACE BOOK _ STATE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrequest . parameter Map [ FACE BOOK _ CODE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġrequest . parameter Map [ FACE BOOK _ ERROR _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthentication Exception (" Cannot Ġauthentication Ġuser Ġin Ġ$ clientId . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert State Code ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 2 0 Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠOAuth 2 AccessToken Ġ= Ġservice . get AccessToken ( code ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠOAuth Request ( Verb . GET , ĠFACE BOOK _ PROFILE _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġreq ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( req ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( FACE BOOK _ PROFILE _ ID _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( FACE BOOK _ PROFILE _ EMAIL _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( FACE BOOK _ PROFILE _ NAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( FACE BOOK _ PROFILE _ AV AT AR _ KEY _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get OrNull ( FACE BOOK _ PROFILE _ AV AT AR _ KEY _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get OrNull ( FACE BOOK _ PROFILE _ AV AT AR _ KEY _ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠFacebook Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Linked In Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Linked In Ġlogin ") ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠLINK ED IN _ CLIENT ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequest . parameter Map [ LINK ED IN _ STATE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrequest . parameter Map [ LINK ED IN _ CODE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġrequest . parameter Map [ LINK ED IN _ ERROR _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthentication Exception (" Cannot Ġauthentication Ġuser Ġin Ġ$ clientId . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert State Code ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 2 0 Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠOAuth 2 AccessToken Ġ= Ġservice . get AccessToken ( code ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Request Ġ= ĠOAuth Request ( Verb . GET , ĠLINK ED IN _ PROFILE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Request . add Header (" x - li - format ", Ġ" json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Request . add Header (" Accept - Language ", Ġ" ru - RU ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġprofile Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( profile Request ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Request Ġ= ĠOAuth Request ( Verb . GET , ĠLINK ED IN _ EMAIL _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Request . add Header (" x - li - format ", Ġ" json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Request . add Header (" Accept - Language ", Ġ" ru - RU ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġemail Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Body Ġ= Ġservice . execute ( email Request ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfirstName Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( LINK ED IN _ PROFILE _ FIRST _ NAME _ KEY _ 1 )?. get OrNull ( LINK ED IN _ PROFILE _ FIRST _ NAME _ KEY _ 2 )?. get OrNull ( LINK ED IN _ PREFERRED _ LOCAL E ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġprofile Body . get OrNull ( LINK ED IN _ PROFILE _ LOCAL IZED _ FIRST _ NAME _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġextract Ġfirst Ġname Ġfrom ĠLinked In Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. as Text () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlastName Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( LINK ED IN _ PROFILE _ LAST _ NAME _ KEY _ 1 )?. get OrNull ( LINK ED IN _ PROFILE _ LAST _ NAME _ KEY _ 2 )?. get OrNull ( LINK ED IN _ PREFERRED _ LOCAL E ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġprofile Body . get OrNull ( LINK ED IN _ PROFILE _ LOCAL IZED _ LAST _ NAME _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġextract Ġlast Ġname Ġfrom ĠLinked In Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. as Text () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrNull ( LINK ED IN _ PROFILE _ EMAIL _ KEY _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get OrNull ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get OrNull ( LINK ED IN _ PROFILE _ EMAIL _ KEY _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get OrNull ( LINK ED IN _ PROFILE _ EMAIL _ KEY _ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġextract Ġemail Ġfrom ĠLinked In Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Image Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OrNull ( LINK ED IN _ PROFILE _ AV AT AR _ KEY _ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get OrNull ( LINK ED IN _ PROFILE _ AV AT AR _ KEY _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . as Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġextract Ġimage Ġpath Ġfrom ĠLinked In Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( LINK ED IN _ PROFILE _ ID _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ firstName Ġ?: Ġ"" } Ġ${ lastName Ġ?: Ġ"" }". trim (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Image , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠLinked In Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Git lab Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Git lab Ġlogin ") ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠGIT LAB _ CLIENT ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequest . parameter Map [ GIT LAB _ STATE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrequest . parameter Map [ GIT LAB _ CODE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġrequest . parameter Map [ GIT LAB _ ERROR _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthentication Exception (" Cannot Ġauthentication Ġuser Ġin Ġ$ clientId . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert State Code ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 2 0 Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠOAuth 2 AccessToken Ġ= Ġservice . get AccessToken ( code ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠOAuth Request ( Verb . GET , ĠGIT LAB _ PROFILE _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġreq ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( req ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GIT LAB _ PROFILE _ ID _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GIT LAB _ PROFILE _ EMAIL _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GIT LAB _ PROFILE _ NAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GIT LAB _ PROFILE _ USERNAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GIT LAB _ PROFILE _ RE POS _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( GIT LAB _ PROFILE _ AV AT AR _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠGit lab Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Microsoft Live Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Microsoft ĠLive Ġlogin ") ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠLI VE _ CLIENT ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequest . parameter Map [ LI VE _ STATE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrequest . parameter Map [ LI VE _ CODE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġrequest . parameter Map [ LI VE _ ERROR _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthentication Exception (" Cannot Ġauthentication Ġuser Ġin ĠMicrosoft ĠLive . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert State Code ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 2 0 Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠOAuth 2 AccessToken Ġ= Ġservice . get AccessToken ( code ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠOAuth Request ( Verb . GET , ĠMIC ROS OFT _ LI VE _ PROFILE _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġreq ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( req ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( LI VE _ PROFILE _ EMAIL _ KEY _ 1 )?. get OrNull ( LI VE _ PROFILE _ EMAIL _ KEY _ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġprofile Body . get OrNull ( LI VE _ PROFILE _ EMAIL _ KEY _ 1 )?. get OrNull ( LI VE _ PROFILE _ EMAIL _ KEY _ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġextract Ġemail Ġfrom ĠMicrosoft ĠLive Ġtoken ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. as Text () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( LI VE _ PROFILE _ ID _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( LI VE _ PROFILE _ NAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠMicrosoft ĠLive Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Fre el ancer Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Fre el ancer Ġlogin ") ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠF RE EL AN CER _ CLIENT ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequest . parameter Map [ F RE EL AN CER _ STATE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrequest . parameter Map [ F RE EL AN CER _ CODE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġrequest . parameter Map [ F RE EL AN CER _ ERROR _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthentication Exception (" Cannot Ġauthentication Ġuser Ġin Ġ$ clientId . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert State Code ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 2 0 Service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= Ġo Auth Client Settings Storage . get OAuth Client Settings ( clientId ) Ġ?: Ġthrow ĠFeature NotSupported (" Settings Ġfor Ġclient Ġ$ clientId Ġnot Ġfound ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Token Params Ġ= ĠAccess Token Request Params ( code ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . extra Parameters Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ id " Ġto Ġsettings . clientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ secret " Ġto Ġsettings . client Secret , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠOAuth 2 AccessToken Ġ= Ġservice . get AccessToken ( request Token Params ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠOAuth Request ( Verb . GET , Ġif Ġ( settings . test ) ĠF RE EL AN CER _ TEST _ PROFILE _ URL Ġelse ĠF RE EL AN CER _ PROFILE _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġreq ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq . add Header (" fre el ancer - oauth - v 1 ", ĠaccessToken . accessToken ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( req ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġprofile Body . get OrNull ( F RE EL AN CER _ PROFILE _ ROOT _ KEY )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OrNull ( F RE EL AN CER _ PROFILE _ ID _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OrNull ( F RE EL AN CER _ PROFILE _ EMAIL _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OrNull ( F RE EL AN CER _ PROFILE _ NAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OrNull ( F RE EL AN CER _ PROFILE _ USERNAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OrNull ( F RE EL AN CER _ PROFILE _ AV AT AR _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId . ĠInc orrect Ġjson Ġreceived ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠFre el ancer Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Microsoft Azure Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Microsoft ĠAzure Ġlogin ") ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠAZ URE _ CLIENT ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequest . parameter Map [ AZURE _ STATE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrequest . parameter Map [ AZURE _ CODE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġrequest . parameter Map [ AZURE _ ERROR _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthentication Exception (" Cannot Ġauthentication Ġuser Ġin Ġ$ clientId . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert State Code ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 2 0 Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠOAuth 2 AccessToken Ġ= Ġservice . get AccessToken ( code ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠOAuth Request ( Verb . GET , ĠAZ URE _ PROFILE _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġreq ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( req ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġprofile Body . get OrNull ( AZURE _ PROFILE _ EMAIL _ KEY _ 1 )?. as Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġprofile Body . get OrNull ( AZURE _ PROFILE _ EMAIL _ KEY _ 2 )?. as Text ()?. take If Ġ{ Ġit . contains ("@ ") Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġprofile Body . get OrNull ( AZURE _ PROFILE _ NAME _ KEY )?. as Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"${ profile Body . get OrNull ( AZURE _ PROFILE _ FIRST NAME _ KEY )?. as Text ()} Ġ${ profile Body . get OrNull ( AZURE _ PROFILE _ LAST NAME _ KEY )?. as Text ()} ". trim () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( AZURE _ PROFILE _ ID _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Body . get OrNull ( AZURE _ PROFILE _ EMAIL _ KEY _ 2 )?. as Text ()?. take If Ġ{ Ġ! it . contains ("@ ") Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠMicrosoft ĠAzure Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Stack Exchange Login ( request : ĠHttpServletRequest ): ĠPair < String , ĠAccount Token ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Stack Exchange Ġlogin ") ĊĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= ĠSTACK EX CHANGE _ CLIENT ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġrequest . parameter Map [ STACK EX CHANGE _ STATE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrequest . parameter Map [ STACK EX CHANGE _ CODE _ PARAM _ KEY ]?. get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġrequest . parameter Map [ STACK EX CHANGE _ ERROR _ PARAM _ KEY ]?. get ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuthentication Exception (" Cannot Ġauthentication Ġuser Ġin Ġ$ clientId . Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert State Code ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget Service For Client ( request , ĠclientId ) Ġas ĠOAuth 2 0 Service ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= Ġo Auth Client Settings Storage . get OAuth Client Settings ( clientId ) Ġ?: Ġthrow ĠFeature NotSupported (" Settings Ġfor Ġclient Ġ$ clientId Ġnot Ġfound ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Token Params Ġ= ĠAccess Token Request Params ( code ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . extra Parameters Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ id " Ġto Ġsettings . clientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" client _ secret " Ġto Ġsettings . client Secret , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken : ĠOAuth 2 AccessToken Ġ= Ġservice . get AccessToken ( request Token Params ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠOAuth Request ( Verb . GET , Ġ"$ STACK EX CHANGE _ PROFILE _ URL ? site = stackoverflow & key =${ settings . client Key }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . sign Request ( accessToken , Ġreq ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Body Ġ= Ġservice . execute ( req ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠobjectMapper . read Tree ( resp . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġprofile Body . get OrNull ( STACK EX CHANGE _ PROFILE _ ROOT _ KEY )?. get OrNull ( 0 )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OrNull ( STACK EX CHANGE _ PROFILE _ ACCOUNT _ ID _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OrNull ( STACK EX CHANGE _ PROFILE _ EMAIL _ KEY )?. as Text (), Ġ// Ġcurrently Ġno Ġemail Ġis Ġreturned ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OrNull ( STACK EX CHANGE _ PROFILE _ NAME _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get OrNull ( STACK EX CHANGE _ PROFILE _ AV AT AR _ KEY )?. as Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local AccessToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken . local RefreshToken (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠAuthentication Exception (" Cannot Ġlogin Ġuser Ġfor Ġclient Ġ$ clientId . ĠInc orrect Ġjson Ġreceived ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Success Red irection () Ġto Ġtoken ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġperform ĠStack Ġexchange Ġlogin : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Failure Red irection () Ġto Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Service For Client ( request : ĠHttpServletRequest , ĠclientId : ĠString ): ĠOAuth Service ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġo Auth Client Settings Storage . get OAuth Client Settings ( clientId )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Ġ= Ġget Api For Client ( clientId , Ġit . test ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Builder ( it . clientId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. api Secret ( it . client Secret ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. callback ( get Redirect Url For Client ( request , ĠclientId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . scope ?. join ToString (" Ġ") ?. let Ġ{ Ġthis . with Scope ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( api ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDefault Api 1 0 a Ġ-> Ġit . build ( api ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDefault Api 2 0 Ġ-> Ġit . build ( api ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠInternal Exception (" Unknown Ġoauth Ġapi Ġversion ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Api For Client ( clientId : ĠString , Ġtest : ĠBoolean Ġ= Ġfalse ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( clientId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ITHUB _ CLIENT Ġ-> ĠGitHub Api . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGOOGLE _ CLIENT Ġ-> ĠGoogle Api 2 0 . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFACE BOOK _ CLIENT Ġ-> ĠFacebook Api . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT WIT TER _ CLIENT Ġ-> ĠTwitter Api . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLINK ED IN _ CLIENT Ġ-> ĠLinked In Api 2 0 . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGIT LAB _ CLIENT Ġ-> ĠGitLab Api . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLI VE _ CLIENT Ġ-> ĠLive Api . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF RE EL AN CER _ CLIENT Ġ-> Ġif Ġ( test ) ĠFre el ancer Api 2 0 . Sandbox . instance () Ġelse ĠFre el ancer Api 2 0 . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAZ URE _ CLIENT Ġ-> ĠMicrosoft Azure Active Directory 2 0 Api . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTACK EX CHANGE _ CLIENT Ġ-> ĠStack Exchange Api . instance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠFeature NotSupported (" OAuth Ġclient Ġ$ clientId Ġis Ġnot Ġimplemented ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Imp erson ate Token ( ĊĠĠĠĠĠĠĠ ĠclientId : ĠString , ĊĠĠĠĠĠĠĠ Ġexternal Id : ĠString ?, ĊĠĠĠĠĠĠĠ Ġemail : ĠString ?, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġusername : ĠString ?, ĊĠĠĠĠĠĠĠ Ġrepos Url : ĠString ?, ĊĠĠĠĠĠĠĠ Ġavatar Url : ĠString ?, ĊĠĠĠĠĠĠĠ ĠaccessToken : ĠPair < String , ĠInstant ? >, ĊĠĠĠĠĠĠĠ Ġrefresh Token : ĠPair < String ?, ĠInstant ? >, ĊĠĠĠ Ġ): ĠAccount Token ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexternal Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġuser Resolver Service . resolve External Account ( clientId , Ġexternal Id Ġ= Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġlogin External User ( it . id , ĠaccessToken . first , ĠaccessToken . second , Ġrefresh Token . first , Ġrefresh Token . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġregister External User ( clientId , Ġusername , Ġemail , Ġname , Ġexternal Id , Ġrepos Url , Ġavatar Url )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin External User ( it . id , ĠaccessToken . first , ĠaccessToken . second , Ġrefresh Token . first , Ġrefresh Token . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlogin External User ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠUUID , ĊĠĠĠĠĠĠĠ ĠaccessToken : ĠString ?, ĊĠĠĠĠĠĠĠ ĠaccessToken Expiration : ĠInstant ?, ĊĠĠĠĠĠĠĠ Ġrefresh Token : ĠString ?, ĊĠĠĠĠĠĠĠ Ġrefresh Token Expiration : ĠInstant ?, ĊĠĠĠ Ġ): ĠAccount Token ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Service . login OAuth User ( userId , ĠaccessToken , ĠaccessToken Expiration , Ġrefresh Token , Ġrefresh Token Expiration ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġlogin Ġexternal Ġuser : ĠException : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister External User ( ĊĠĠĠĠĠĠĠ Ġo Auth Client : ĠString , ĊĠĠĠĠĠĠĠ Ġusername : ĠString ?, ĊĠĠĠĠĠĠĠ Ġemail : ĠString ?, ĊĠĠĠĠĠĠĠ Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġexternal Id : ĠString ?, ĊĠĠĠĠĠĠĠ Ġrepos Url : ĠString ?, ĊĠĠĠĠĠĠĠ Ġavatar Url : ĠString ?, ĊĠĠĠ Ġ): ĠAccount External ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Service . register OAuth User ( o Auth Client , Ġusername , Ġemail , Ġname , Ġexternal Id , Ġrepos Url , Ġavatar Url ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Cannot Ġregister Ġexternal Ġuser Ġfor Ġ$ o Auth Client : ĠException : Ġ$ ex ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate State Code (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRandom Utils . generate Random Alpha Numeric ( STATE _ LENGTH ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocial Auth Cache . put Code ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert State Code ( state : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsocial Auth Cache . getCode ( state Ġ?: Ġthrow ĠAuthentication Exception (" Incorrect Ġresponse . ĠState Ġwas Ġnot Ġprovided ")) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocial Auth Cache . ev ict Code ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠAuthentication Exception (" Incorrect Ġresponse . ĠState Ġwas Ġnot Ġfound Ġor Ġoutdated ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Redirect Url For Client ( request : ĠHttpServletRequest , ĠclientId : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ get Domain From Request ( request )} $ RE DIRECT _ URL $ clientId " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Domain From Request ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfinal Protocol Ġ= Ġo Auth Configuration . overwrite Redirect Protocol ?. take If Ġ{ Ġit . isNotBlank () Ġ} Ġ?: Ġrequest . scheme ĊĠĠĠĠĠĠĠ Ġval Ġfinal Domain Ġ= Ġo Auth Configuration . overwrite Redirect Domain ?. take If Ġ{ Ġit . isNotBlank () Ġ} Ġ?: Ġrequest . server Name ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ final Protocol :// $ final Domain ${ getPort String ( request )}" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Port String ( request : ĠHttpServletRequest ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfinal Port Ġ= Ġo Auth Configuration . overwrite Redirect Port ?. take If Ġ{ Ġit Ġ> Ġ 0 Ġ} Ġ?: Ġrequest . server Port ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( final Port Ġ! in ĠlistOf ( 8 0 , Ġ 4 4 3 )) Ġ": $ final Port " Ġelse Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Success Red irection () Ġ= Ġif Ġ( o Auth Configuration . redirect On Success . isNull Or Blank ()) ĠDEFAULT _ PAGE _ TO _ RE DIRECT _ ON _ SUCCESS Ġelse Ġo Auth Configuration . redirect On Success !! ĊĠĠĠ Ġprivate Ġfun Ġget Failure Red irection () Ġ= Ġif Ġ( o Auth Configuration . redirect On Failure . isNull Or Blank ()) ĠDEFAULT _ PAGE _ TO _ RE DIRECT _ ON _ FAILURE Ġelse Ġo Auth Configuration . redirect On Failure !! ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . get OrNull ( fieldName : ĠString ): ĠJsonNode ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ fieldName ]?. take If Ġ{ Ġ! it . as Text (). equals (" null ", Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n pe : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠJsonNode . get OrNull ( index : ĠInt ): ĠJsonNode ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . get ( index ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n pe : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠOAuth 2 AccessToken . local AccessToken (): ĠPair < String , ĠInstant ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . accessToken Ġto Ġthis . expires In ?. let Ġ{ ĠInstant . now (). plus Seconds ( it . to Long ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠOAuth 2 AccessToken . local RefreshToken (): ĠPair < String ?, ĠInstant ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . refresh Token Ġto Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠOAuth 1 AccessToken . local AccessToken (): ĠPair < String , ĠInstant ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . token Ġto Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠOAuth 1 AccessToken . local RefreshToken (): ĠPair < String ?, ĠInstant ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull Ġto Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠToken Keys Ġ{ ĊĠĠĠ Ġconst Ġval ĠG ITHUB _ STATE _ PARAM _ KEY Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠG ITHUB _ CODE _ PARAM _ KEY Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠG ITHUB _ ERROR _ PARAM _ KEY Ġ= Ġ" error _ description " ĊĊĠĠĠ Ġconst Ġval ĠGOOGLE _ STATE _ PARAM _ KEY Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠGOOGLE _ CODE _ PARAM _ KEY Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠGOOGLE _ ERROR _ PARAM _ KEY Ġ= Ġ" error _ description " ĊĊĠĠĠ Ġconst Ġval ĠT WIT TER _ O AUTH _ TOKEN _ PARAM _ KEY Ġ= Ġ" oauth _ token " ĊĠĠĠ Ġconst Ġval ĠT WIT TER _ O AUTH _ VER IFIER _ PARAM _ KEY Ġ= Ġ" oauth _ verifier " ĊĊĠĠĠ Ġconst Ġval ĠFACE BOOK _ STATE _ PARAM _ KEY Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠFACE BOOK _ CODE _ PARAM _ KEY Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠFACE BOOK _ ERROR _ PARAM _ KEY Ġ= Ġ" error _ description " ĊĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ STATE _ PARAM _ KEY Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ CODE _ PARAM _ KEY Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ ERROR _ PARAM _ KEY Ġ= Ġ" error _ description " ĊĊĠĠĠ Ġconst Ġval ĠGIT LAB _ STATE _ PARAM _ KEY Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠGIT LAB _ CODE _ PARAM _ KEY Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠGIT LAB _ ERROR _ PARAM _ KEY Ġ= Ġ" error _ description " ĊĊĠĠĠ Ġconst Ġval ĠLI VE _ STATE _ PARAM _ KEY Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠLI VE _ CODE _ PARAM _ KEY Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠLI VE _ ERROR _ PARAM _ KEY Ġ= Ġ" error _ description " ĊĊĠĠĠ Ġconst Ġval ĠAZ URE _ STATE _ PARAM _ KEY Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠAZ URE _ CODE _ PARAM _ KEY Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠAZ URE _ ERROR _ PARAM _ KEY Ġ= Ġ" error _ description " ĊĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ STATE _ PARAM _ KEY Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ CODE _ PARAM _ KEY Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ ERROR _ PARAM _ KEY Ġ= Ġ" error _ description " ĊĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ STATE _ PARAM _ KEY Ġ= Ġ" state " ĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ CODE _ PARAM _ KEY Ġ= Ġ" code " ĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ ERROR _ PARAM _ KEY Ġ= Ġ" error _ description " ĊĊĠĠĠ Ġconst Ġval ĠT WIT TER _ PROFILE _ ID _ KEY Ġ= Ġ" id " ĊĠĠĠ Ġconst Ġval ĠT WIT TER _ PROFILE _ NAME _ KEY Ġ= Ġ" name " ĊĠĠĠ Ġconst Ġval ĠT WIT TER _ PROFILE _ USERNAME _ KEY Ġ= Ġ" screen _ name " ĊĠĠĠ Ġconst Ġval ĠT WIT TER _ PROFILE _ EMAIL _ KEY Ġ= Ġ" email " ĊĠĠĠ Ġconst Ġval ĠT WIT TER _ PROFILE _ AV AT AR _ KEY Ġ= Ġ" profile _ image _ url _ https " ĊĊĠĠĠ Ġconst Ġval ĠFACE BOOK _ PROFILE _ ID _ KEY Ġ= Ġ" id " ĊĠĠĠ Ġconst Ġval ĠFACE BOOK _ PROFILE _ NAME _ KEY Ġ= Ġ" name " ĊĠĠĠ Ġconst Ġval ĠFACE BOOK _ PROFILE _ EMAIL _ KEY Ġ= Ġ" email " ĊĠĠĠ Ġconst Ġval ĠFACE BOOK _ PROFILE _ AV AT AR _ KEY _ 1 Ġ= Ġ" picture " ĊĠĠĠ Ġconst Ġval ĠFACE BOOK _ PROFILE _ AV AT AR _ KEY _ 2 Ġ= Ġ" data " ĊĠĠĠ Ġconst Ġval ĠFACE BOOK _ PROFILE _ AV AT AR _ KEY _ 3 Ġ= Ġ" url " ĊĊĠĠĠ Ġconst Ġval ĠG ITHUB _ PROFILE _ ID _ KEY Ġ= Ġ" id " ĊĠĠĠ Ġconst Ġval ĠG ITHUB _ PROFILE _ USERNAME _ KEY Ġ= Ġ" login " ĊĠĠĠ Ġconst Ġval ĠG ITHUB _ PROFILE _ NAME _ KEY Ġ= Ġ" name " ĊĠĠĠ Ġconst Ġval ĠG ITHUB _ PROFILE _ EMAIL _ KEY Ġ= Ġ" email " ĊĠĠĠ Ġconst Ġval ĠG ITHUB _ PROFILE _ AV AT AR _ KEY Ġ= Ġ" avatar _ url " ĊĠĠĠ Ġconst Ġval ĠG ITHUB _ PROFILE _ RE POS _ KEY Ġ= Ġ" repos _ url " ĊĊĠĠĠ Ġconst Ġval ĠGOOGLE _ PROFILE _ ID _ KEY Ġ= Ġ" sub " ĊĠĠĠ Ġconst Ġval ĠGOOGLE _ PROFILE _ NAME _ KEY Ġ= Ġ" name " ĊĠĠĠ Ġconst Ġval ĠGOOGLE _ PROFILE _ EMAIL _ KEY Ġ= Ġ" email " ĊĠĠĠ Ġconst Ġval ĠGOOGLE _ PROFILE _ AV AT AR _ KEY Ġ= Ġ" picture " ĊĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ ID _ KEY Ġ= Ġ" id " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ LOCAL IZED _ FIRST _ NAME _ KEY Ġ= Ġ" localized FirstName " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ LOCAL IZED _ LAST _ NAME _ KEY Ġ= Ġ" localized LastName " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ FIRST _ NAME _ KEY _ 1 Ġ= Ġ" firstName " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ FIRST _ NAME _ KEY _ 2 Ġ= Ġ" localized " ĊĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ LAST _ NAME _ KEY _ 1 Ġ= Ġ" lastName " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ LAST _ NAME _ KEY _ 2 Ġ= Ġ" localized " ĊĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PREFERRED _ LOCAL E Ġ= Ġ" en _ EN " ĊĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ EMAIL _ KEY _ 1 Ġ= Ġ" elements " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ EMAIL _ KEY _ 2 Ġ= Ġ" handle ~ " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ EMAIL _ KEY _ 3 Ġ= Ġ" email Address " ĊĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ AV AT AR _ KEY _ 1 Ġ= Ġ" profile Picture " ĊĠĠĠ Ġconst Ġval ĠLINK ED IN _ PROFILE _ AV AT AR _ KEY _ 2 Ġ= Ġ" display Image " ĊĊĠĠĠ Ġconst Ġval ĠGIT LAB _ PROFILE _ ID _ KEY Ġ= Ġ" sub " ĊĠĠĠ Ġconst Ġval ĠGIT LAB _ PROFILE _ USERNAME _ KEY Ġ= Ġ" nickname " ĊĠĠĠ Ġconst Ġval ĠGIT LAB _ PROFILE _ NAME _ KEY Ġ= Ġ" name " ĊĠĠĠ Ġconst Ġval ĠGIT LAB _ PROFILE _ EMAIL _ KEY Ġ= Ġ" email " ĊĠĠĠ Ġconst Ġval ĠGIT LAB _ PROFILE _ AV AT AR _ KEY Ġ= Ġ" picture " ĊĠĠĠ Ġconst Ġval ĠGIT LAB _ PROFILE _ RE POS _ KEY Ġ= Ġ" profile " ĊĊĠĠĠ Ġconst Ġval ĠLI VE _ PROFILE _ ID _ KEY Ġ= Ġ" id " ĊĠĠĠ Ġconst Ġval ĠLI VE _ PROFILE _ NAME _ KEY Ġ= Ġ" name " ĊĠĠĠ Ġconst Ġval ĠLI VE _ PROFILE _ EMAIL _ KEY _ 1 Ġ= Ġ" emails " ĊĠĠĠ Ġconst Ġval ĠLI VE _ PROFILE _ EMAIL _ KEY _ 2 Ġ= Ġ" preferred " ĊĠĠĠ Ġconst Ġval ĠLI VE _ PROFILE _ EMAIL _ KEY _ 3 Ġ= Ġ" account " ĊĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ PROFILE _ ROOT _ KEY Ġ= Ġ" result " ĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ PROFILE _ ID _ KEY Ġ= Ġ" id " ĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ PROFILE _ NAME _ KEY Ġ= Ġ" public _ name " ĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ PROFILE _ EMAIL _ KEY Ġ= Ġ" email " ĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ PROFILE _ AV AT AR _ KEY Ġ= Ġ" avatar " ĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ PROFILE _ USERNAME _ KEY Ġ= Ġ" username " ĊĠĠĠ Ġconst Ġval ĠF RE EL AN CER _ PROFILE _ ERROR _ KEY Ġ= Ġ" message " ĊĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ PROFILE _ ROOT _ KEY Ġ= Ġ" items " ĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ PROFILE _ USER _ ID _ KEY Ġ= Ġ" user _ id " ĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ PROFILE _ ACCOUNT _ ID _ KEY Ġ= Ġ" account _ id " ĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ PROFILE _ NAME _ KEY Ġ= Ġ" display _ name " ĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ PROFILE _ EMAIL _ KEY Ġ= Ġ" email " ĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ PROFILE _ AV AT AR _ KEY Ġ= Ġ" profile _ image " ĊĠĠĠ Ġconst Ġval ĠSTACK EX CHANGE _ PROFILE _ USERNAME _ KEY Ġ= Ġ" username " ĊĊĠĠĠ Ġconst Ġval ĠAZ URE _ PROFILE _ ID _ KEY Ġ= Ġ" id " ĊĠĠĠ Ġconst Ġval ĠAZ URE _ PROFILE _ NAME _ KEY Ġ= Ġ" displayName " ĊĠĠĠ Ġconst Ġval ĠAZ URE _ PROFILE _ EMAIL _ KEY _ 1 Ġ= Ġ" mail " ĊĠĠĠ Ġconst Ġval ĠAZ URE _ PROFILE _ EMAIL _ KEY _ 2 Ġ= Ġ" user Principal Name " ĊĠĠĠ Ġconst Ġval ĠAZ URE _ PROFILE _ FIRST NAME _ KEY Ġ= Ġ" given Name " ĊĠĠĠ Ġconst Ġval ĠAZ URE _ PROFILE _ LAST NAME _ KEY Ġ= Ġ" surname " Ċ Ċ } ĊĊ