diff --git a/azuredevops/connection.go b/azuredevops/connection.go index eb76f53c..72a35233 100644 --- a/azuredevops/connection.go +++ b/azuredevops/connection.go @@ -7,6 +7,7 @@ import ( "context" "crypto/tls" "encoding/base64" + "fmt" "strings" "sync" "time" @@ -25,6 +26,17 @@ func NewPatConnection(organizationUrl string, personalAccessToken string) *Conne } } +// Creates a new Azure DevOps connection instance using a bearer access token generated by OAuth flows. +func NewBearerConnection(organizationUrl string, bearerAccessToken string) *Connection { + authorizationString := CreateBearerAuthHeaderValue(bearerAccessToken) + organizationUrl = normalizeUrl(organizationUrl) + return &Connection{ + AuthorizationString: authorizationString, + BaseUrl: organizationUrl, + SuppressFedAuthRedirect: true, + } +} + func NewAnonymousConnection(organizationUrl string) *Connection { organizationUrl = normalizeUrl(organizationUrl) return &Connection{ @@ -49,7 +61,11 @@ type Connection struct { func CreateBasicAuthHeaderValue(username, password string) string { auth := username + ":" + password - return "Basic " + base64.StdEncoding.EncodeToString([]byte(auth)) + return fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(auth))) +} + +func CreateBearerAuthHeaderValue(bearerToken string) string { + return fmt.Sprintf("Bearer %s", bearerToken) } func normalizeUrl(url string) string { diff --git a/azuredevops/v6/connection.go b/azuredevops/v6/connection.go index eb76f53c..72a35233 100644 --- a/azuredevops/v6/connection.go +++ b/azuredevops/v6/connection.go @@ -7,6 +7,7 @@ import ( "context" "crypto/tls" "encoding/base64" + "fmt" "strings" "sync" "time" @@ -25,6 +26,17 @@ func NewPatConnection(organizationUrl string, personalAccessToken string) *Conne } } +// Creates a new Azure DevOps connection instance using a bearer access token generated by OAuth flows. +func NewBearerConnection(organizationUrl string, bearerAccessToken string) *Connection { + authorizationString := CreateBearerAuthHeaderValue(bearerAccessToken) + organizationUrl = normalizeUrl(organizationUrl) + return &Connection{ + AuthorizationString: authorizationString, + BaseUrl: organizationUrl, + SuppressFedAuthRedirect: true, + } +} + func NewAnonymousConnection(organizationUrl string) *Connection { organizationUrl = normalizeUrl(organizationUrl) return &Connection{ @@ -49,7 +61,11 @@ type Connection struct { func CreateBasicAuthHeaderValue(username, password string) string { auth := username + ":" + password - return "Basic " + base64.StdEncoding.EncodeToString([]byte(auth)) + return fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(auth))) +} + +func CreateBearerAuthHeaderValue(bearerToken string) string { + return fmt.Sprintf("Bearer %s", bearerToken) } func normalizeUrl(url string) string { diff --git a/azuredevops/v7/connection.go b/azuredevops/v7/connection.go index eb76f53c..72a35233 100644 --- a/azuredevops/v7/connection.go +++ b/azuredevops/v7/connection.go @@ -7,6 +7,7 @@ import ( "context" "crypto/tls" "encoding/base64" + "fmt" "strings" "sync" "time" @@ -25,6 +26,17 @@ func NewPatConnection(organizationUrl string, personalAccessToken string) *Conne } } +// Creates a new Azure DevOps connection instance using a bearer access token generated by OAuth flows. +func NewBearerConnection(organizationUrl string, bearerAccessToken string) *Connection { + authorizationString := CreateBearerAuthHeaderValue(bearerAccessToken) + organizationUrl = normalizeUrl(organizationUrl) + return &Connection{ + AuthorizationString: authorizationString, + BaseUrl: organizationUrl, + SuppressFedAuthRedirect: true, + } +} + func NewAnonymousConnection(organizationUrl string) *Connection { organizationUrl = normalizeUrl(organizationUrl) return &Connection{ @@ -49,7 +61,11 @@ type Connection struct { func CreateBasicAuthHeaderValue(username, password string) string { auth := username + ":" + password - return "Basic " + base64.StdEncoding.EncodeToString([]byte(auth)) + return fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(auth))) +} + +func CreateBearerAuthHeaderValue(bearerToken string) string { + return fmt.Sprintf("Bearer %s", bearerToken) } func normalizeUrl(url string) string {