...
1
2
3
4
5
6
7
8
9
10
11
12
13 package chttp
14
15 import (
16 "fmt"
17 "net/http"
18 "strings"
19
20 "github.com/go-kivik/kivik/v4"
21 )
22
23
24 type basicAuth struct {
25 Username string
26 Password string
27
28
29
30 transport http.RoundTripper
31 }
32
33 var (
34 _ authenticator = &basicAuth{}
35 _ kivik.Option = (*basicAuth)(nil)
36 )
37
38 func (a *basicAuth) Apply(target interface{}) {
39 if auth, ok := target.(*authenticator); ok {
40
41
42 *auth = &basicAuth{
43 Username: a.Username,
44 Password: a.Password,
45 }
46 }
47 }
48
49 func (a *basicAuth) String() string {
50 return fmt.Sprintf("[BasicAuth{user:%s,pass:%s}]", a.Username, strings.Repeat("*", len(a.Password)))
51 }
52
53
54
55 func (a *basicAuth) RoundTrip(req *http.Request) (*http.Response, error) {
56 req.SetBasicAuth(a.Username, a.Password)
57 return a.transport.RoundTrip(req)
58 }
59
60
61 func (a *basicAuth) Authenticate(c *Client) error {
62 a.transport = c.Transport
63 if a.transport == nil {
64 a.transport = http.DefaultTransport
65 }
66 c.Transport = a
67 return nil
68 }
69
70 type jwtAuth struct {
71 Token string
72
73 transport http.RoundTripper
74 }
75
76 var _ kivik.Option = (*jwtAuth)(nil)
77
78 func (a *jwtAuth) Apply(target interface{}) {
79 if auth, ok := target.(*authenticator); ok {
80
81
82 *auth = &jwtAuth{
83 Token: a.Token,
84 }
85 }
86 }
87
88 func (a *jwtAuth) String() string {
89 token := a.Token
90 const unmaskedLen = 3
91 if len(token) > unmaskedLen {
92 token = token[:unmaskedLen] + strings.Repeat("*", len(token)-unmaskedLen)
93 }
94 return fmt.Sprintf("[JWTAuth{token:%s}]", token)
95 }
96
97
98 func (a *jwtAuth) RoundTrip(req *http.Request) (*http.Response, error) {
99 req.Header.Set("Authorization", "Bearer "+a.Token)
100 return a.transport.RoundTrip(req)
101 }
102
103
104 func (a *jwtAuth) Authenticate(c *Client) error {
105 a.transport = c.Transport
106 if a.transport == nil {
107 a.transport = http.DefaultTransport
108 }
109 c.Transport = a
110 return nil
111 }
112
View as plain text