package Ġcom . money forward . ag gre . send a . yahoo . demo Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġokhttp 3 . Form Body Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġorg . springframework . context . annotation . Scope Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ Service Ċ @ Scope (" singleton ") Ċ class ĠAuth Service Ġ{ ĊĊĠĠĠ Ġ@ Value ("\ ${ app . yahoo . token _ endpoint }") ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtoken URL : ĠString ĊĊĠĠĠ Ġ@ Value ("\ ${ app . yahoo . client _ id }") ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclient ID : ĠString ĊĊĠĠĠ Ġ@ Value ("\ ${ app . yahoo . se crete }") ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclient Sec re te : ĠString ĊĊĠĠĠ Ġ@ Value ("\ ${ app . yahoo . redirect _ uri }") ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġredirect URL : ĠString ĊĊĠĠĠ Ġ@ Value ("\ ${ app . yahoo . user _ info _ endpoint }") ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠuserInfo URL : ĠString ĊĊĠĠĠ Ġprivate Ġval Ġbasic Auth : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠBase 6 4 . get Encoder (). encode ToString ("${ client ID }:${ client Sec re te }". toByteArray ( Charsets . UTF _ 8 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠhttpClient : ĠOk HttpClient Ġby Ġlazy { ĊĠĠĠĠĠĠĠ ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect Timeout ( 1 0 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequire Successful Body ( res : ĠResponse ): ĠString { ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( res . code ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 0 Ġ-> Ġres . body ?. string () Ġ?: Ġthrow ĠApp Exception (" empty Ġresponse Ġbody Ġfrom Ġauthorization Ġend - point ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 0 Ġ-> Ġres . body ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠGson (). fromJson ( it . string (), ĠAPI Error :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAuth API Exception ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?: Ġthrow ĠResponse Exception ( 4 0 0 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠResponse Exception ( res . code , Ġres . body ?. string ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget AccessToken ( code : ĠString ): ĠAccess Token { ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠForm Body . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" grant _ type ", Ġ" authorization _ code ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" redirect _ uri ", Ġredirect URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" code ", Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( token URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" Authorization "," Basic Ġ$ basic Auth ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠhttpClient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠ Ġreturn ĠGson (). fromJson ( require Successful Body ( res ), ĠAccess Token :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh AccessToken ( old : ĠAccess Token ): ĠAccess Token { ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠForm Body . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" grant _ type ", Ġ" refresh _ token ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" refresh _ token ", Ġold . refresh Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( token URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" Authorization "," Basic Ġ$ basic Auth ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠhttpClient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠ Ġval Ġrefresh Ġ= ĠGson (). fromJson ( require Successful Body ( res ), ĠToken Refresh :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġold . update ( refresh ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetUser Info ( token : ĠAccess Token ): ĠUser Attr { ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( userInfo URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" Authorization ", Ġ" Bearer Ġ${ token . accessToken }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠhttpClient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠ Ġreturn ĠGson (). fromJson ( require Successful Body ( res ), ĠUser Attr :: class . java ) ĊĠĠĠ Ġ} Ċ Ċ }