@@ -760,20 +760,18 @@ func (c *dockerClient) obtainBearerToken(ctx context.Context, challenge challeng
760
760
token , inCache = c .tokenCache [cacheKey ]
761
761
}()
762
762
if ! inCache || time .Now ().After (token .expirationTime ) {
763
- var (
764
- t * bearerToken
765
- err error
766
- )
763
+ token = & bearerToken {}
764
+
765
+ var err error
767
766
if c .auth .IdentityToken != "" {
768
- t , err = c .getBearerTokenOAuth2 (ctx , challenge , scopes )
767
+ err = c .getBearerTokenOAuth2 (ctx , token , challenge , scopes )
769
768
} else {
770
- t , err = c .getBearerToken (ctx , challenge , scopes )
769
+ err = c .getBearerToken (ctx , token , challenge , scopes )
771
770
}
772
771
if err != nil {
773
772
return "" , err
774
773
}
775
774
776
- token = t
777
775
func () { // A scope for defer
778
776
c .tokenCacheLock .Lock ()
779
777
defer c .tokenCacheLock .Unlock ()
@@ -783,16 +781,19 @@ func (c *dockerClient) obtainBearerToken(ctx context.Context, challenge challeng
783
781
return token .token , nil
784
782
}
785
783
786
- func (c * dockerClient ) getBearerTokenOAuth2 (ctx context.Context , challenge challenge ,
787
- scopes []authScope ) (* bearerToken , error ) {
784
+ // getBearerTokenOAuth2 obtains an "Authorization: Bearer" token using a pre-existing identity token per
785
+ // https://github.com/distribution/distribution/blob/main/docs/spec/auth/oauth.md for challenge and scopes,
786
+ // and writes it into dest.
787
+ func (c * dockerClient ) getBearerTokenOAuth2 (ctx context.Context , dest * bearerToken , challenge challenge ,
788
+ scopes []authScope ) error {
788
789
realm , ok := challenge .Parameters ["realm" ]
789
790
if ! ok {
790
- return nil , errors .New ("missing realm in bearer auth challenge" )
791
+ return errors .New ("missing realm in bearer auth challenge" )
791
792
}
792
793
793
794
authReq , err := http .NewRequestWithContext (ctx , http .MethodPost , realm , nil )
794
795
if err != nil {
795
- return nil , err
796
+ return err
796
797
}
797
798
798
799
// Make the form data required against the oauth2 authentication
@@ -817,26 +818,29 @@ func (c *dockerClient) getBearerTokenOAuth2(ctx context.Context, challenge chall
817
818
logrus .Debugf ("%s %s" , authReq .Method , authReq .URL .Redacted ())
818
819
res , err := c .client .Do (authReq )
819
820
if err != nil {
820
- return nil , err
821
+ return err
821
822
}
822
823
defer res .Body .Close ()
823
824
if err := httpResponseToError (res , "Trying to obtain access token" ); err != nil {
824
- return nil , err
825
+ return err
825
826
}
826
827
827
- return newBearerTokenFromHTTPResponseBody (res )
828
+ return dest . readFromHTTPResponseBody (res )
828
829
}
829
830
830
- func (c * dockerClient ) getBearerToken (ctx context.Context , challenge challenge ,
831
- scopes []authScope ) (* bearerToken , error ) {
831
+ // getBearerToken obtains an "Authorization: Bearer" token using a GET request, per
832
+ // https://github.com/distribution/distribution/blob/main/docs/spec/auth/token.md for challenge and scopes,
833
+ // and writes it into dest.
834
+ func (c * dockerClient ) getBearerToken (ctx context.Context , dest * bearerToken , challenge challenge ,
835
+ scopes []authScope ) error {
832
836
realm , ok := challenge .Parameters ["realm" ]
833
837
if ! ok {
834
- return nil , errors .New ("missing realm in bearer auth challenge" )
838
+ return errors .New ("missing realm in bearer auth challenge" )
835
839
}
836
840
837
841
authReq , err := http .NewRequestWithContext (ctx , http .MethodGet , realm , nil )
838
842
if err != nil {
839
- return nil , err
843
+ return err
840
844
}
841
845
842
846
params := authReq .URL .Query ()
@@ -864,22 +868,22 @@ func (c *dockerClient) getBearerToken(ctx context.Context, challenge challenge,
864
868
logrus .Debugf ("%s %s" , authReq .Method , authReq .URL .Redacted ())
865
869
res , err := c .client .Do (authReq )
866
870
if err != nil {
867
- return nil , err
871
+ return err
868
872
}
869
873
defer res .Body .Close ()
870
874
if err := httpResponseToError (res , "Requesting bearer token" ); err != nil {
871
- return nil , err
875
+ return err
872
876
}
873
877
874
- return newBearerTokenFromHTTPResponseBody (res )
878
+ return dest . readFromHTTPResponseBody (res )
875
879
}
876
880
877
- // newBearerTokenFromHTTPResponseBody parses a http.Response to obtain a bearerToken .
881
+ // readFromHTTPResponseBody sets token data by parsing a http.Response .
878
882
// The caller is still responsible for ensuring res.Body is closed.
879
- func newBearerTokenFromHTTPResponseBody ( res * http.Response ) ( * bearerToken , error ) {
883
+ func ( bt * bearerToken ) readFromHTTPResponseBody ( res * http.Response ) error {
880
884
blob , err := iolimits .ReadAtMost (res .Body , iolimits .MaxAuthTokenBodySize )
881
885
if err != nil {
882
- return nil , err
886
+ return err
883
887
}
884
888
885
889
var token struct {
@@ -895,12 +899,10 @@ func newBearerTokenFromHTTPResponseBody(res *http.Response) (*bearerToken, error
895
899
if len (bodySample ) > bodySampleLength {
896
900
bodySample = bodySample [:bodySampleLength ]
897
901
}
898
- return nil , fmt .Errorf ("decoding bearer token (last URL %q, body start %q): %w" , res .Request .URL .Redacted (), string (bodySample ), err )
902
+ return fmt .Errorf ("decoding bearer token (last URL %q, body start %q): %w" , res .Request .URL .Redacted (), string (bodySample ), err )
899
903
}
900
904
901
- bt := & bearerToken {
902
- token : token .Token ,
903
- }
905
+ bt .token = token .Token
904
906
if bt .token == "" {
905
907
bt .token = token .AccessToken
906
908
}
@@ -913,7 +915,7 @@ func newBearerTokenFromHTTPResponseBody(res *http.Response) (*bearerToken, error
913
915
token .IssuedAt = time .Now ().UTC ()
914
916
}
915
917
bt .expirationTime = token .IssuedAt .Add (time .Duration (token .ExpiresIn ) * time .Second )
916
- return bt , nil
918
+ return nil
917
919
}
918
920
919
921
// detectPropertiesHelper performs the work of detectProperties which executes
0 commit comments