1package goth 2 3import ( 4 "context" 5 "fmt" 6 "net/http" 7 8 "golang.org/x/oauth2" 9) 10 11// Provider needs to be implemented for each 3rd party authentication provider 12// e.g. Facebook, Twitter, etc... 13type Provider interface { 14 Name() string 15 SetName(name string) 16 BeginAuth(state string) (Session, error) 17 UnmarshalSession(string) (Session, error) 18 FetchUser(Session) (User, error) 19 Debug(bool) 20 RefreshToken(refreshToken string) (*oauth2.Token, error) //Get new access token based on the refresh token 21 RefreshTokenAvailable() bool //Refresh token is provided by auth provider or not 22} 23 24const NoAuthUrlErrorMessage = "an AuthURL has not been set" 25 26// Providers is list of known/available providers. 27type Providers map[string]Provider 28 29var providers = Providers{} 30 31// UseProviders adds a list of available providers for use with Goth. 32// Can be called multiple times. If you pass the same provider more 33// than once, the last will be used. 34func UseProviders(viders ...Provider) { 35 for _, provider := range viders { 36 providers[provider.Name()] = provider 37 } 38} 39 40// GetProviders returns a list of all the providers currently in use. 41func GetProviders() Providers { 42 return providers 43} 44 45// GetProvider returns a previously created provider. If Goth has not 46// been told to use the named provider it will return an error. 47func GetProvider(name string) (Provider, error) { 48 provider := providers[name] 49 if provider == nil { 50 return nil, fmt.Errorf("no provider for %s exists", name) 51 } 52 return provider, nil 53} 54 55// ClearProviders will remove all providers currently in use. 56// This is useful, mostly, for testing purposes. 57func ClearProviders() { 58 providers = Providers{} 59} 60 61// ContextForClient provides a context for use with oauth2. 62func ContextForClient(h *http.Client) context.Context { 63 if h == nil { 64 return oauth2.NoContext 65 } 66 return context.WithValue(oauth2.NoContext, oauth2.HTTPClient, h) 67} 68 69// HTTPClientWithFallBack to be used in all fetch operations. 70func HTTPClientWithFallBack(h *http.Client) *http.Client { 71 if h != nil { 72 return h 73 } 74 return http.DefaultClient 75} 76