providers/proxy: add initial header token auth (#4421)
* initial implementation Signed-off-by: Jens Langhammer <jens@goauthentik.io> * check for openid/profile claims Signed-off-by: Jens Langhammer <jens@goauthentik.io> * include jwks sources in proxy provider Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add web ui for jwks Signed-off-by: Jens Langhammer <jens@goauthentik.io> * only show sources with JWKS data configured Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix introspection tests Signed-off-by: Jens Langhammer <jens@goauthentik.io> * start basic Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add basic auth Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add docs, update admonitions Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add client_id to api, add tab for auth Signed-off-by: Jens Langhammer <jens@goauthentik.io> * update locale Signed-off-by: Jens Langhammer <jens@goauthentik.io> Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
		
							
								
								
									
										59
									
								
								internal/outpost/proxyv2/application/auth_basic.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								internal/outpost/proxyv2/application/auth_basic.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | ||||
| package application | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| type TokenResponse struct { | ||||
| 	AccessToken string `json:"access_token"` | ||||
| 	IDToken     string `json:"id_token"` | ||||
| } | ||||
|  | ||||
| func (a *Application) attemptBasicAuth(username, password string) *Claims { | ||||
| 	values := url.Values{ | ||||
| 		"grant_type": []string{"client_credentials"}, | ||||
| 		"client_id":  []string{a.oauthConfig.ClientID}, | ||||
| 		"username":   []string{username}, | ||||
| 		"password":   []string{password}, | ||||
| 		"scope":      []string{strings.Join(a.oauthConfig.Scopes, " ")}, | ||||
| 	} | ||||
| 	req, err := http.NewRequest("POST", a.endpoint.TokenURL, strings.NewReader(values.Encode())) | ||||
| 	if err != nil { | ||||
| 		a.log.WithError(err).Warning("failed to create token request") | ||||
| 		return nil | ||||
| 	} | ||||
| 	req.Header.Set("Content-Type", "application/x-www-form-urlencoded") | ||||
| 	res, err := a.httpClient.Do(req) | ||||
| 	if err != nil || res.StatusCode > 200 { | ||||
| 		a.log.WithError(err).Warning("failed to send token request") | ||||
| 		return nil | ||||
| 	} | ||||
| 	var token TokenResponse | ||||
| 	err = json.NewDecoder(res.Body).Decode(&token) | ||||
| 	if err != nil { | ||||
| 		a.log.WithError(err).Warning("failed to parse token response") | ||||
| 		return nil | ||||
| 	} | ||||
| 	// Parse and verify ID Token payload. | ||||
| 	idToken, err := a.tokenVerifier.Verify(context.Background(), token.IDToken) | ||||
| 	if err != nil { | ||||
| 		a.log.WithError(err).Warning("failed to verify token") | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Extract custom claims | ||||
| 	var claims *Claims | ||||
| 	if err := idToken.Claims(&claims); err != nil { | ||||
| 		a.log.WithError(err).Warning("failed to convert token to claims") | ||||
| 		return nil | ||||
| 	} | ||||
| 	if claims.Proxy == nil { | ||||
| 		claims.Proxy = &ProxyClaims{} | ||||
| 	} | ||||
| 	claims.RawToken = token.IDToken | ||||
| 	return claims | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Jens L
					Jens L