@@ -429,6 +429,7 @@ func WithClaims(claims string) interface {
429429 AcquireByAuthCodeOption
430430 AcquireByCredentialOption
431431 AcquireOnBehalfOfOption
432+ AcquireByUsernamePasswordOption
432433 AcquireSilentOption
433434 AuthCodeURLOption
434435 options.CallOption
@@ -437,6 +438,7 @@ func WithClaims(claims string) interface {
437438 AcquireByAuthCodeOption
438439 AcquireByCredentialOption
439440 AcquireOnBehalfOfOption
441+ AcquireByUsernamePasswordOption
440442 AcquireSilentOption
441443 AuthCodeURLOption
442444 options.CallOption
@@ -450,6 +452,8 @@ func WithClaims(claims string) interface {
450452 t .claims = claims
451453 case * acquireTokenOnBehalfOfOptions :
452454 t .claims = claims
455+ case * acquireTokenByUsernamePasswordOptions :
456+ t .claims = claims
453457 case * acquireTokenSilentOptions :
454458 t .claims = claims
455459 case * authCodeURLOptions :
@@ -496,6 +500,7 @@ func WithTenantID(tenantID string) interface {
496500 AcquireByAuthCodeOption
497501 AcquireByCredentialOption
498502 AcquireOnBehalfOfOption
503+ AcquireByUsernamePasswordOption
499504 AcquireSilentOption
500505 AuthCodeURLOption
501506 options.CallOption
@@ -504,6 +509,7 @@ func WithTenantID(tenantID string) interface {
504509 AcquireByAuthCodeOption
505510 AcquireByCredentialOption
506511 AcquireOnBehalfOfOption
512+ AcquireByUsernamePasswordOption
507513 AcquireSilentOption
508514 AuthCodeURLOption
509515 options.CallOption
@@ -517,6 +523,8 @@ func WithTenantID(tenantID string) interface {
517523 t .tenantID = tenantID
518524 case * acquireTokenOnBehalfOfOptions :
519525 t .tenantID = tenantID
526+ case * acquireTokenByUsernamePasswordOptions :
527+ t .tenantID = tenantID
520528 case * acquireTokenSilentOptions :
521529 t .tenantID = tenantID
522530 case * authCodeURLOptions :
@@ -592,6 +600,46 @@ func (cca Client) AcquireTokenSilent(ctx context.Context, scopes []string, opts
592600 return cca .base .AcquireTokenSilent (ctx , silentParameters )
593601}
594602
603+ // acquireTokenByUsernamePasswordOptions contains optional configuration for AcquireTokenByUsernamePassword
604+ type acquireTokenByUsernamePasswordOptions struct {
605+ claims , tenantID string
606+ authnScheme AuthenticationScheme
607+ }
608+
609+ // AcquireByUsernamePasswordOption is implemented by options for AcquireTokenByUsernamePassword
610+ type AcquireByUsernamePasswordOption interface {
611+ acquireByUsernamePasswordOption ()
612+ }
613+
614+ // AcquireTokenByUsernamePassword acquires a security token from the authority, via Username/Password Authentication.
615+ // NOTE: this flow is NOT recommended.
616+ //
617+ // Options: [WithClaims], [WithTenantID]
618+ func (cca Client ) AcquireTokenByUsernamePassword (ctx context.Context , scopes []string , username , password string , opts ... AcquireByUsernamePasswordOption ) (AuthResult , error ) {
619+ o := acquireTokenByUsernamePasswordOptions {}
620+ if err := options .ApplyOptions (& o , opts ); err != nil {
621+ return AuthResult {}, err
622+ }
623+ authParams , err := cca .base .AuthParams .WithTenant (o .tenantID )
624+ if err != nil {
625+ return AuthResult {}, err
626+ }
627+ authParams .Scopes = scopes
628+ authParams .AuthorizationType = authority .ATUsernamePassword
629+ authParams .Claims = o .claims
630+ authParams .Username = username
631+ authParams .Password = password
632+ if o .authnScheme != nil {
633+ authParams .AuthnScheme = o .authnScheme
634+ }
635+
636+ token , err := cca .base .Token .UsernamePassword (ctx , authParams )
637+ if err != nil {
638+ return AuthResult {}, err
639+ }
640+ return cca .base .AuthResultFromToken (ctx , authParams , token , true )
641+ }
642+
595643// acquireTokenByAuthCodeOptions contains the optional parameters used to acquire an access token using the authorization code flow.
596644type acquireTokenByAuthCodeOptions struct {
597645 challenge , claims , tenantID string
0 commit comments