diff --git a/CHANGELOG.md b/CHANGELOG.md index 8500cb8df..f011aa8c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +## v11.0.0 + +### Breaking Changes + +- To handle differences between ADFS and AAD the following fields have had their types changed from `string` to `json.Number` + - ExpiresIn + - ExpiresOn + - NotBefore + ## v10.15.5 ### Bug Fixes diff --git a/autorest/adal/token.go b/autorest/adal/token.go index 32aea8389..c32f19320 100644 --- a/autorest/adal/token.go +++ b/autorest/adal/token.go @@ -29,7 +29,6 @@ import ( "net" "net/http" "net/url" - "strconv" "strings" "sync" "time" @@ -101,14 +100,22 @@ type Token struct { AccessToken string `json:"access_token"` RefreshToken string `json:"refresh_token"` - ExpiresIn string `json:"expires_in"` - ExpiresOn string `json:"expires_on"` - NotBefore string `json:"not_before"` + ExpiresIn json.Number `json:"expires_in"` + ExpiresOn json.Number `json:"expires_on"` + NotBefore json.Number `json:"not_before"` Resource string `json:"resource"` Type string `json:"token_type"` } +func newToken() Token { + return Token{ + ExpiresIn: "0", + ExpiresOn: "0", + NotBefore: "0", + } +} + // IsZero returns true if the token object is zero-initialized. func (t Token) IsZero() bool { return t == Token{} @@ -116,12 +123,12 @@ func (t Token) IsZero() bool { // Expires returns the time.Time when the Token expires. func (t Token) Expires() time.Time { - s, err := strconv.Atoi(t.ExpiresOn) + s, err := t.ExpiresOn.Float64() if err != nil { s = -3600 } - expiration := date.NewUnixTimeFromSeconds(float64(s)) + expiration := date.NewUnixTimeFromSeconds(s) return time.Time(expiration).UTC() } @@ -414,6 +421,7 @@ func NewServicePrincipalTokenWithSecret(oauthConfig OAuthConfig, id string, reso } spt := &ServicePrincipalToken{ inner: servicePrincipalToken{ + Token: newToken(), OauthConfig: oauthConfig, Secret: secret, ClientID: id, @@ -653,6 +661,7 @@ func newServicePrincipalTokenFromMSI(msiEndpoint, resource string, userAssignedI spt := &ServicePrincipalToken{ inner: servicePrincipalToken{ + Token: newToken(), OauthConfig: OAuthConfig{ TokenEndpoint: *msiEndpointURL, }, diff --git a/autorest/adal/token_test.go b/autorest/adal/token_test.go index 5a2ab8c02..8268c6953 100644 --- a/autorest/adal/token_test.go +++ b/autorest/adal/token_test.go @@ -495,8 +495,8 @@ func TestServicePrincipalTokenRefreshUnmarshals(t *testing.T) { t.Fatalf("adal: ServicePrincipalToken#Refresh returned an unexpected error (%v)", err) } else if spt.inner.Token.AccessToken != "accessToken" || spt.inner.Token.ExpiresIn != "3600" || - spt.inner.Token.ExpiresOn != expiresOn || - spt.inner.Token.NotBefore != expiresOn || + spt.inner.Token.ExpiresOn != json.Number(expiresOn) || + spt.inner.Token.NotBefore != json.Number(expiresOn) || spt.inner.Token.Resource != "resource" || spt.inner.Token.Type != "Bearer" { t.Fatalf("adal: ServicePrincipalToken#Refresh failed correctly unmarshal the JSON -- expected %v, received %v", @@ -684,13 +684,13 @@ func TestNewServicePrincipalTokenFromManualTokenSecret(t *testing.T) { RedirectURI: "redirect", } - spt, err := NewServicePrincipalTokenFromManualTokenSecret(TestOAuthConfig, "id", "resource", *token, secret, nil) + spt, err := NewServicePrincipalTokenFromManualTokenSecret(TestOAuthConfig, "id", "resource", token, secret, nil) if err != nil { t.Fatalf("Failed creating new SPT: %s", err) } - if !reflect.DeepEqual(*token, spt.inner.Token) { - t.Fatalf("Tokens do not match: %s, %s", *token, spt.inner.Token) + if !reflect.DeepEqual(token, spt.inner.Token) { + t.Fatalf("Tokens do not match: %s, %s", token, spt.inner.Token) } if !reflect.DeepEqual(secret, spt.inner.Secret) { @@ -822,7 +822,7 @@ func TestMarshalInnerToken(t *testing.T) { t.Fatalf("tokens don't match: %s, %s", tokenJSON, testTokenJSON) } - var t1 *Token + var t1 Token err = json.Unmarshal(tokenJSON, &t1) if err != nil { t.Fatalf("failed to unmarshal token: %+v", err) @@ -833,14 +833,6 @@ func TestMarshalInnerToken(t *testing.T) { } } -func newToken() *Token { - return &Token{ - AccessToken: "ASECRETVALUE", - Resource: "https://azure.microsoft.com/", - Type: "Bearer", - } -} - func newTokenJSON(expiresOn string, resource string) string { return fmt.Sprintf(`{ "access_token" : "accessToken", @@ -855,11 +847,13 @@ func newTokenJSON(expiresOn string, resource string) string { } func newTokenExpiresIn(expireIn time.Duration) *Token { - return setTokenToExpireIn(newToken(), expireIn) + t := newToken() + return setTokenToExpireIn(&t, expireIn) } func newTokenExpiresAt(expireAt time.Time) *Token { - return setTokenToExpireAt(newToken(), expireAt) + t := newToken() + return setTokenToExpireAt(&t, expireAt) } func expireToken(t *Token) *Token { @@ -868,7 +862,7 @@ func expireToken(t *Token) *Token { func setTokenToExpireAt(t *Token, expireAt time.Time) *Token { t.ExpiresIn = "3600" - t.ExpiresOn = strconv.Itoa(int(expireAt.Sub(date.UnixEpoch()).Seconds())) + t.ExpiresOn = json.Number(strconv.Itoa(int(expireAt.Sub(date.UnixEpoch()).Seconds()))) t.NotBefore = t.ExpiresOn return t } @@ -885,7 +879,7 @@ func newServicePrincipalToken(callbacks ...TokenRefreshCallback) *ServicePrincip func newServicePrincipalTokenManual() *ServicePrincipalToken { token := newToken() token.RefreshToken = "refreshtoken" - spt, _ := NewServicePrincipalTokenFromManualToken(TestOAuthConfig, "id", "resource", *token) + spt, _ := NewServicePrincipalTokenFromManualToken(TestOAuthConfig, "id", "resource", token) return spt } diff --git a/autorest/azure/cli/token.go b/autorest/azure/cli/token.go index 83b81c34b..ec3704823 100644 --- a/autorest/azure/cli/token.go +++ b/autorest/azure/cli/token.go @@ -54,7 +54,7 @@ func (t Token) ToADALToken() (converted adal.Token, err error) { AccessToken: t.AccessToken, Type: t.TokenType, ExpiresIn: "3600", - ExpiresOn: strconv.Itoa(int(difference.Seconds())), + ExpiresOn: json.Number(strconv.Itoa(int(difference.Seconds()))), RefreshToken: t.RefreshToken, Resource: t.Resource, } diff --git a/version/version.go b/version/version.go index 94de7c51e..180bbbbf2 100644 --- a/version/version.go +++ b/version/version.go @@ -20,7 +20,7 @@ import ( ) // Number contains the semantic version of this SDK. -const Number = "v10.15.5" +const Number = "v11.0.0" var ( userAgent = fmt.Sprintf("Go/%s (%s-%s) go-autorest/%s",