@@ -459,6 +459,55 @@ func (g *Goic) SignOut(tok *Token, redir string, res http.ResponseWriter, req *h
459
459
return nil
460
460
}
461
461
462
+ // RevokeToken revokes a Token so that it is no longer usable
463
+ func (g * Goic ) RevokeToken (tok * Token ) error {
464
+ p , ok := g .providers [tok .Provider ]
465
+ if ! ok || ! p .CanRevoke () {
466
+ return ErrProviderSupport
467
+ }
468
+
469
+ tk , hint := tok .AccessToken , "access_token"
470
+ if tk == "" && tok .RefreshToken != "" {
471
+ tk , hint = tok .RefreshToken , "refresh_token"
472
+ }
473
+ if tk == "" {
474
+ return ErrTokenAccessKey
475
+ }
476
+
477
+ qry := url.Values {}
478
+ qry .Add ("token" , tk )
479
+ qry .Add ("token_type_hint" , hint )
480
+
481
+ req , err := http .NewRequest ("POST" , p .wellKnown .RevokeURI , strings .NewReader (qry .Encode ()))
482
+ if err != nil {
483
+ return err
484
+ }
485
+
486
+ req .Header .Set ("Content-Type" , "application/x-www-form-urlencoded" )
487
+ req .Header .Set ("Authorization" , p .AuthBasicHeader ())
488
+ res , err := http .DefaultClient .Do (req )
489
+ if err != nil {
490
+ return err
491
+ }
492
+ defer res .Body .Close ()
493
+
494
+ body , err := ioutil .ReadAll (res .Body )
495
+ if err != nil {
496
+ return err
497
+ }
498
+
499
+ var revoke map [string ]interface {}
500
+ if err := json .Unmarshal (body , & revoke ); err != nil {
501
+ return err
502
+ }
503
+ if e , ok := revoke ["error" ].(map [string ]string ); ok {
504
+ if msg , ok := e ["message" ]; ok {
505
+ return errors .New (msg )
506
+ }
507
+ }
508
+ return nil
509
+ }
510
+
462
511
// logIf logs if verbose is set
463
512
func (g * Goic ) logIf (s string , v ... interface {}) {
464
513
if g .verbose {
0 commit comments