converted @googleapis.com to ++standard-refreshing

This commit is contained in:
Anton Dyudin 2016-04-07 17:46:48 -07:00
parent d90b71dde9
commit 6c39ca4739
2 changed files with 50 additions and 40 deletions

View File

@ -97,9 +97,9 @@
|= a/httr ^- {exp/@u axs/token}
(grab-json a (ot 'expires_in'^ni 'access_token'^so ~):jo)
::
++ grab-refresh-token
|= a/httr ^- {exp/@u ref/token axs/token}
(grab-json a (ot 'expires_in'^ni 'refresh_token'^so 'access_token'^so ~):jo)
++ grab-both-tokens
|= a/httr ^- {exp/@u axs/token ref/token}
(grab-json a (ot 'expires_in'^ni 'access_token'^so 'refresh_token'^so ~):jo)
::
++ auth
?~ tok ~|(%no-bearer-token !!)
@ -111,26 +111,35 @@
++ add-auth-header
|= request/{url/purl meth hed/math (unit octs)}
^+ request
:: =. url.request [| `6.000 [%& /localhost]] :: for use with unix nc
:: =. p.url.request [| `6.000 [%& /localhost]] :: for use with unix nc
~& add-auth-header+(earn url.request)
request(hed (~(add ja hed.request) %authorization header:auth))
::
++ add-auth-query
|= {token-name/cord request/{url/purl meth math (unit octs)}}
^+ request
:: =. url.request [| `6.000 [%& /localhost]] :: for use with unix nc
:: =. p.url.request [| `6.000 [%& /localhost]] :: for use with unix nc
~& add-auth-query+(earn url.request)
request(r.url [[token-name query:auth] r.url.request])
::
++ re
|_ ref/refresh
++ needs-refresh ?~(tok.ref | is-expired)
++ is-expired (lth expiry.ref (add now ~m59.s30))
++ is-expired (lth expiry.ref (add now ~m5))
++ update
|= exp/@u ^+ ref
ref(pending |, expiry (add now (mul ~s1 exp)))
::
++ update-if-needed
|= exchange-url/$@(@t purl)
^- {(unit hiss) refresh}
?~ tok.ref `ref
?. is-expired `ref
:_ ref(pending &)
`(token-request exchange-url 'refresh_token' refresh-token+tok.ref ~)
--
::
:: expected semantics, to be copied and modified if anything doesn't work
++ standard
|* {done/* save/$-(token *)}
|%
@ -174,29 +183,33 @@
::
:: See ++out-add-query-param:standard
++ out-refresh-or-add-query-param
|= {exchange/$@(@t purl) {knot (list cord) $@(@t purl)}}
?. ~(needs-refresh re ref) (out-add-query-param.s +<+)
=; exchange [[%send exchange] (save tok ref(pending &))]
(token-request exchange 'refresh_token' refresh-token+tok.ref ~)
|= {exchange/$@(@t purl) s-args/{knot (list cord) $@(@t purl)}}
::
|= a/hiss ^- core-move
=^ req ref (~(update-if-needed re ref) exchange)
?^ req [[%send u.req] (save tok ref)]
%.(a (out-add-query-param.s s-args))
::
:: See ++out-add-header:standard
++ out-refresh-or-add-header
|= {exchange/$@(@t purl) {(list cord) dialog/$@(@t purl)}}
?. ~(needs-refresh re ref) (out-add-header.s +<+)
=; exchange [[%send exchange] (save tok ref(pending &))]
(token-request exchange 'refresh_token' refresh-token+tok.ref ~)
|= {exchange/$@(@t purl) s-args/{(list cord) dialog/$@(@t purl)}}
::
|= a/hiss ^- core-move
=^ req ref (~(update-if-needed re ref) exchange)
?^ req [[%send u.req] (save tok ref)]
%.(a (out-add-header.s s-args))
::
++ res-handle-refreshed
++ res-save-after-refresh
|= a/httr ^- core-move
?. pending.ref [%give a]
=+ `{exp/@u axs/@t}`(grab-token-after-refresh a)
=+ `{exp/@u axs/token}`(grab-token-after-refresh a)
=. ref %.(exp ~(update re ref))
[[%redo ~] (save axs ref)]
::
++ in-code-to-token in-code-to-token.s
++ bak-save-both-tokens
|= a/httr ^- sec-move
=+ `{exp/@u axs/@t ref-new/@t}`(grab-refresh-token a)
|= a/httr ^- core-move
=+ `{exp/@u axs/token ref-new/token}`(grab-both-tokens a)
=. tok.ref ref-new
=. ref (~(update re ref) exp)
[[%redo ~] (save axs ref)]

View File

@ -18,38 +18,35 @@
++ auth-usr
|= usr/iden
=+ lon=(fall (slaw %t usr) usr)
=< .(state-usr &)
%- oauth2
:_ exchange='https://www.googleapis.com/oauth2/v4/token'
^= dialog
%+ add-query:interpolate 'https://accounts.google.com/o/oauth2/v2/auth'
%- hep-to-cab
%- quay:hep-to-cab
:~ login-hint+?~(lon '' (crip (rash lon suffix-email)))
access-type+%offline
response-type+%code
prompt+%consent
==
--
!:
::::
::
|_ {bal/(bale keys:oauth2) user-state}
++ auth-re ~(. (re:auth .) ref |=(a/_ref +>(ref a)))
++ auth ~(. (auth-usr usr.bal) bal scopes)
++ scopes
:~ 'https://mail.google.com'
'https://www.googleapis.com/auth/plus.me'
'https://www.googleapis.com/auth/userinfo.email'
==
::
++ out (out-fix-expired:auth-re (out-math:auth ber))
++ res |=(a/httr ((res-handle-refreshed:auth-re save-access res-give:auth) a))
::
++ save-access |=(a/cord:[token:oauth2] +>(ber a))
::
++ in
|= a/quay
(in-code:auth a)
++ bak |=(a/httr ((bak-save-tokens:auth-re save-access) a))
++ upd *user-state
++ exchange-url 'https://www.googleapis.com/oauth2/v4/token'
--
!:
::::
::
|_ {bal/(bale keys:oauth2) own/user-state}
++ auth
=+ a=~(standard-refreshing oauth2 bal ber.own)
(a(state-usr &) ..auth ref.own |=(a/user-state ..auth(own a)))
::
++ out (out-refresh-or-add-header:auth exchange-url scopes dialog-url)
++ dialog-url (auth-usr usr.bal)
::
++ res res-save-after-refresh:auth
::
++ in (in-code-to-token:auth exchange-url)
++ bak bak-save-both-tokens:auth
:: ++ upd *user-state
--