88 "fmt"
99 "net/http"
1010 "strings"
11+ "time"
1112
1213 "github.com/Azure/azure-sdk-for-go/sdk/azcore"
1314 armpolicy "github.com/Azure/azure-sdk-for-go/sdk/azcore/arm/policy"
@@ -26,6 +27,19 @@ type acquiringResourceState struct {
2627 tenant string
2728}
2829
30+ // acquire acquires or updates the resource; only one
31+ // thread/goroutine at a time ever calls this function
32+ func acquire (state acquiringResourceState ) (newResource azcore.AccessToken , newExpiration time.Time , err error ) {
33+ tk , err := state .p .cred .GetToken (state .ctx , azpolicy.TokenRequestOptions {
34+ Scopes : state .p .scopes ,
35+ TenantID : state .tenant ,
36+ })
37+ if err != nil {
38+ return azcore.AccessToken {}, time.Time {}, err
39+ }
40+ return tk , tk .ExpiresOn , nil
41+ }
42+
2943// BearerTokenPolicy authorizes requests with bearer tokens acquired from a TokenCredential.
3044type BearerTokenPolicy struct {
3145 auxResources map [string ]* temporal.Resource [azcore.AccessToken , acquiringResourceState ]
@@ -42,6 +56,10 @@ func NewBearerTokenPolicy(cred azcore.TokenCredential, opts *armpolicy.BearerTok
4256 opts = & armpolicy.BearerTokenOptions {}
4357 }
4458 p := & BearerTokenPolicy {cred : cred }
59+ p .auxResources = make (map [string ]* temporal.Resource [azcore.AccessToken , acquiringResourceState ], len (opts .AuxiliaryTenants ))
60+ for _ , t := range opts .AuxiliaryTenants {
61+ p .auxResources [t ] = temporal .NewResource (acquire )
62+ }
4563 p .scopes = make ([]string , len (opts .Scopes ))
4664 copy (p .scopes , opts .Scopes )
4765 p .btp = azruntime .NewBearerTokenPolicy (cred , opts .Scopes , & azpolicy.BearerTokenOptions {
0 commit comments