github.com/hs0210/hashicorp-terraform@v0.11.12-beta1/svchost/auth/credentials.go (about)

     1  // Package auth contains types and functions to manage authentication
     2  // credentials for service hosts.
     3  package auth
     4  
     5  import (
     6  	"net/http"
     7  
     8  	"github.com/hashicorp/terraform/svchost"
     9  )
    10  
    11  // Credentials is a list of CredentialsSource objects that can be tried in
    12  // turn until one returns credentials for a host, or one returns an error.
    13  //
    14  // A Credentials is itself a CredentialsSource, wrapping its members.
    15  // In principle one CredentialsSource can be nested inside another, though
    16  // there is no good reason to do so.
    17  type Credentials []CredentialsSource
    18  
    19  // NoCredentials is an empty CredentialsSource that always returns nil
    20  // when asked for credentials.
    21  var NoCredentials CredentialsSource = Credentials{}
    22  
    23  // A CredentialsSource is an object that may be able to provide credentials
    24  // for a given host.
    25  //
    26  // Credentials lookups are not guaranteed to be concurrency-safe. Callers
    27  // using these facilities in concurrent code must use external concurrency
    28  // primitives to prevent race conditions.
    29  type CredentialsSource interface {
    30  	// ForHost returns a non-nil HostCredentials if the source has credentials
    31  	// available for the host, and a nil HostCredentials if it does not.
    32  	//
    33  	// If an error is returned, progress through a list of CredentialsSources
    34  	// is halted and the error is returned to the user.
    35  	ForHost(host svchost.Hostname) (HostCredentials, error)
    36  }
    37  
    38  // HostCredentials represents a single set of credentials for a particular
    39  // host.
    40  type HostCredentials interface {
    41  	// PrepareRequest modifies the given request in-place to apply the
    42  	// receiving credentials. The usual behavior of this method is to
    43  	// add some sort of Authorization header to the request.
    44  	PrepareRequest(req *http.Request)
    45  
    46  	// Token returns the authentication token.
    47  	Token() string
    48  }
    49  
    50  // ForHost iterates over the contained CredentialsSource objects and
    51  // tries to obtain credentials for the given host from each one in turn.
    52  //
    53  // If any source returns either a non-nil HostCredentials or a non-nil error
    54  // then this result is returned. Otherwise, the result is nil, nil.
    55  func (c Credentials) ForHost(host svchost.Hostname) (HostCredentials, error) {
    56  	for _, source := range c {
    57  		creds, err := source.ForHost(host)
    58  		if creds != nil || err != nil {
    59  			return creds, err
    60  		}
    61  	}
    62  	return nil, nil
    63  }