@@ -6,15 +6,13 @@ import (
66 "net/http"
77
88 "github.com/coreos/go-oidc/v3/oidc"
9- "github.com/pkg/errors"
109)
1110
1211const (
1312 headerKeyAccessJWTAssertion = "Cf-Access-Jwt-Assertion"
1413)
1514
1615var (
17- ErrNoAccessToken = errors .New ("no access token provided in request" )
1816 cloudflareAccessCertsURL = "https://%s.cloudflareaccess.com"
1917)
2018
@@ -39,28 +37,43 @@ func NewJWTValidator(teamName string, certsURL string, audTags []string) *JWTVal
3937 verifier := oidc .NewVerifier (certsURL , keySet , config )
4038 return & JWTValidator {
4139 IDTokenVerifier : verifier ,
40+ audTags : audTags ,
4241 }
4342}
4443
45- func (v * JWTValidator ) Handle (ctx context.Context , r * http.Request ) error {
44+ func (v * JWTValidator ) Name () string {
45+ return "AccessJWTValidator"
46+ }
47+
48+ func (v * JWTValidator ) Handle (ctx context.Context , r * http.Request ) (* HandleResult , error ) {
4649 accessJWT := r .Header .Get (headerKeyAccessJWTAssertion )
4750 if accessJWT == "" {
48- return ErrNoAccessToken
51+ // log the exact error message here. the message is specific to the handler implementation logic, we don't gain anything
52+ // in passing it upstream. and each handler impl know what logging level to use for each.
53+ return & HandleResult {
54+ ShouldFilterRequest : true ,
55+ StatusCode : http .StatusForbidden ,
56+ Reason : "no access token in request" ,
57+ }, nil
4958 }
5059
5160 token , err := v .IDTokenVerifier .Verify (ctx , accessJWT )
5261 if err != nil {
53- return fmt . Errorf ( "Invalid token: %w" , err )
62+ return nil , err
5463 }
5564
56- // We want atleast one audTag to match
65+ // We want at least one audTag to match
5766 for _ , jwtAudTag := range token .Audience {
5867 for _ , acceptedAudTag := range v .audTags {
5968 if acceptedAudTag == jwtAudTag {
60- return nil
69+ return & HandleResult { ShouldFilterRequest : false }, nil
6170 }
6271 }
6372 }
6473
65- return fmt .Errorf ("Invalid token: %w" , err )
74+ return & HandleResult {
75+ ShouldFilterRequest : true ,
76+ StatusCode : http .StatusForbidden ,
77+ Reason : fmt .Sprintf ("Invalid token in jwt: %v" , token .Audience ),
78+ }, nil
6679}
0 commit comments