-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathadvanced_auth_client.go
95 lines (83 loc) · 2.84 KB
/
advanced_auth_client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package httpclient
import (
"context"
"time"
"gopkg.in/h2non/gentleman.v2/plugin"
"gopkg.in/h2non/gentleman.v2/plugins/headers"
)
// OidcTokenProvider provides OIDC tokens
type OidcTokenProvider interface {
ProvideToken(ctx context.Context) (string, error)
ProvideTokenForRealm(ctx context.Context, realm string) (string, error)
}
// RestClient interface
type RestClient interface {
Get(data interface{}, plugins ...plugin.Plugin) error
Post(data interface{}, plugins ...plugin.Plugin) (string, error)
Delete(plugins ...plugin.Plugin) error
Put(plugins ...plugin.Plugin) error
}
type MultiRealmTokenClient struct {
client *Client
tokenProvider OidcTokenProvider
realm string
}
func NewMultiRealmTokenClient(addrAPI string, reqTimeout time.Duration, tokenProvider OidcTokenProvider) (*MultiRealmTokenClient, error) {
var client, err = New(addrAPI, reqTimeout)
if err != nil {
return nil, err
}
return &MultiRealmTokenClient{
client: client,
tokenProvider: tokenProvider,
realm: "",
}, nil
}
func (mrtc *MultiRealmTokenClient) ForRealm(realm string) RestClient {
return &MultiRealmTokenClient{
client: mrtc.client,
tokenProvider: mrtc.tokenProvider,
realm: realm,
}
}
func (mrtc *MultiRealmTokenClient) withRealmAuth(next func(pluginsWithAuth ...plugin.Plugin) (string, error), plugins ...plugin.Plugin) (string, error) {
var token string
var err error
if mrtc.realm != "" {
token, err = mrtc.tokenProvider.ProvideTokenForRealm(context.Background(), mrtc.realm)
} else {
token, err = mrtc.tokenProvider.ProvideToken(context.Background())
}
if err != nil {
return "", err
}
plugins = append(plugins, headers.Set("Authorization", "Bearer "+token))
return next(plugins...)
}
// Get is a HTTP GET method.
func (mrtc *MultiRealmTokenClient) Get(data interface{}, plugins ...plugin.Plugin) error {
var _, err = mrtc.withRealmAuth(func(pluginsWithAuth ...plugin.Plugin) (string, error) {
return "", mrtc.client.Get(data, pluginsWithAuth...)
}, plugins...)
return err
}
// Post is a HTTP POST method
func (mrtc *MultiRealmTokenClient) Post(data interface{}, plugins ...plugin.Plugin) (string, error) {
return mrtc.withRealmAuth(func(pluginsWithAuth ...plugin.Plugin) (string, error) {
return mrtc.client.Post(data, pluginsWithAuth...)
}, plugins...)
}
// Delete is a HTTP DELETE method
func (mrtc *MultiRealmTokenClient) Delete(plugins ...plugin.Plugin) error {
var _, err = mrtc.withRealmAuth(func(pluginsWithAuth ...plugin.Plugin) (string, error) {
return "", mrtc.client.Delete(pluginsWithAuth...)
}, plugins...)
return err
}
// Put is a HTTP PUT method
func (mrtc *MultiRealmTokenClient) Put(plugins ...plugin.Plugin) error {
var _, err = mrtc.withRealmAuth(func(pluginsWithAuth ...plugin.Plugin) (string, error) {
return "", mrtc.client.Put(pluginsWithAuth...)
}, plugins...)
return err
}