Skip to content

Commit 399cb42

Browse files
committed
reverting changes made in 24ba9dc since dynamic group search might induce too much stress on the ldap server and there is a reset command for the client to remove its cached token
1 parent c4bd8b6 commit 399cb42

File tree

3 files changed

+37
-38
lines changed

3 files changed

+37
-38
lines changed

ldap/ldap.go

+7-14
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,7 @@ func NewInstance(
6161
return s
6262
}
6363

64-
func (s *Ldap) Authenticate(dn, password string) error {
65-
l, err := ldap.DialURL(s.ldapURL)
66-
if err != nil {
67-
return err
68-
}
69-
70-
defer l.Close()
71-
72-
// Bind as the user to verify their password
73-
err = l.Bind(dn, password)
74-
return err
75-
}
76-
77-
func (s *Ldap) Search(username string) (*auth.UserInfo, error) {
64+
func (s *Ldap) Search(username, password string) (*auth.UserInfo, error) {
7865
l, err := ldap.DialURL(s.ldapURL)
7966
if err != nil {
8067
return nil, err
@@ -114,6 +101,12 @@ func (s *Ldap) Search(username string) (*auth.UserInfo, error) {
114101
return nil, fmt.Errorf("Too many entries returned")
115102
}
116103

104+
// Bind as the user to verify their password
105+
err = l.Bind(result.Entries[0].DN, password)
106+
if err != nil {
107+
return nil, err
108+
}
109+
117110
var extra map[string]auth.ExtraValue
118111

119112
for _, item := range s.extraAttributes {

server/server.go

+7-16
Original file line numberDiff line numberDiff line change
@@ -98,21 +98,20 @@ func (s *Instance) authenticate() http.HandlerFunc {
9898
}
9999

100100
log.Debug().Str("username", credentials.Username).Msg("Received valid authentication request.")
101-
user, err := s.l.Search(credentials.Username)
101+
user, err := s.l.Search(credentials.Username, credentials.Password)
102102
if err != nil {
103103
writeExecCredentialError(res, ErrUnauthorized)
104104
return
105105
}
106106

107-
err = s.l.Authenticate(credentials.Username, credentials.Password)
107+
log.Debug().Str("username", credentials.Username).Msg("Successfully authenticated.")
108+
109+
token, err := types.NewToken(user, s.ttl)
108110
if err != nil {
109-
writeExecCredentialError(res, ErrUnauthorized)
111+
writeExecCredentialError(res, ErrServerError)
110112
return
111113
}
112114

113-
log.Debug().Str("username", credentials.Username).Msg("Successfully authenticated.")
114-
115-
token := types.NewToken([]byte(user.UID), s.ttl)
116115
tokenData, err := token.Payload(s.k)
117116
if err != nil {
118117
writeExecCredentialError(res, ErrServerError)
@@ -189,17 +188,9 @@ func (s *Instance) validate() http.HandlerFunc {
189188
log.Debug().Msg("TokenReview is not valid.")
190189
tr.Status.Authenticated = false
191190
} else {
192-
username, err := token.GetUsername()
193-
if err != nil {
194-
log.Debug().Str("error", err.Error()).Msg("Could not extract username.")
195-
196-
writeTokenReviewError(res, ErrServerError, tr)
197-
return
198-
}
199-
200-
user, err := s.l.Search(username)
191+
user, err := token.GetUser()
201192
if err != nil {
202-
log.Debug().Str("error", err.Error()).Msg("Could not get a user from username.")
193+
log.Debug().Str("error", err.Error()).Msg("Could not extract user.")
203194

204195
writeTokenReviewError(res, ErrServerError, tr)
205196
return

types/token.go

+23-8
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,39 @@ package types
33
import (
44
"crypto/rsa"
55
"encoding/base64"
6+
"encoding/json"
67
"fmt"
78
"time"
89

910
"github.com/lestrrat-go/jwx/jwa"
1011
"github.com/lestrrat-go/jwx/jwt"
1112
"github.com/rs/zerolog/log"
13+
14+
auth "k8s.io/api/authentication/v1"
1215
)
1316

1417
type Token struct {
1518
token jwt.Token
1619
}
1720

18-
func NewToken(data []byte, ttl int64) *Token {
21+
func NewToken(user *auth.UserInfo, ttl int64) (*Token, error) {
1922
now := time.Now()
2023

24+
data, err := json.Marshal(user)
25+
if err != nil {
26+
return nil, err
27+
}
28+
2129
t := jwt.New()
2230
t.Set(jwt.IssuedAtKey, now.Unix())
2331
t.Set(jwt.ExpirationKey, now.Add(time.Duration(ttl)*time.Second).Unix())
24-
t.Set("username", data)
32+
t.Set("user", data)
2533

2634
token := &Token{
2735
token: t,
2836
}
2937

30-
return token
38+
return token, nil
3139
}
3240

3341
func Parse(payload []byte, key *rsa.PrivateKey) (*Token, error) {
@@ -48,19 +56,26 @@ func Parse(payload []byte, key *rsa.PrivateKey) (*Token, error) {
4856
return token, nil
4957
}
5058

51-
func (t *Token) GetUsername() (string, error) {
52-
if v, ok := t.token.Get("username"); ok {
59+
func (t *Token) GetUser() (*auth.UserInfo, error) {
60+
if v, ok := t.token.Get("user"); ok {
61+
var user auth.UserInfo
62+
5363
log.Debug().Str("data", fmt.Sprintf("%v", v)).Msg("Got user data.")
5464

5565
data, err := base64.StdEncoding.WithPadding(base64.NoPadding).DecodeString(fmt.Sprintf("%v", v))
5666
if err != nil {
57-
return "", err
67+
return nil, err
68+
}
69+
70+
err = json.Unmarshal(data, &user)
71+
if err != nil {
72+
return nil, err
5873
}
5974

60-
return string(data), nil
75+
return &user, nil
6176
}
6277

63-
return "", fmt.Errorf("Could not get username attribute of jwt token")
78+
return nil, fmt.Errorf("Could not get user attribute of jwt token")
6479
}
6580

6681
func (t *Token) IsValid() bool {

0 commit comments

Comments
 (0)