oauth2

package
v0.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 29, 2021 License: Apache-2.0 Imports: 8 Imported by: 0

README

oauth2

OAuth2 module of disgo

Getting Started

OAuth2 can be used to authenticate users with Discord on your website. For this to work, you need to create an application on the Discord Developer Portal and get the client ID and secret. Next you need to put in your redirect URL.

Usage

See here for an example.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrStateNotFound      = errors.New("state could not be found")
	ErrAccessTokenExpired = errors.New("access token expired. refresh the session")
	ErrMissingOAuth2Scope = func(scope discord.ApplicationScope) error {
		return fmt.Errorf("missing '%s' scope", scope)
	}
)

errors returned by the OAuth2 client

View Source
var DefaultConfig = Config{
	RestClientConfig: &rest.DefaultConfig,
}

DefaultConfig is the configuration which is used by default

Functions

This section is empty.

Types

type Client

type Client struct {
	ID     discord.Snowflake
	Secret string
	Config
}

Client is an OAuth2 client

func New

func New(id discord.Snowflake, secret string, opts ...ConfigOpt) *Client

New returns a new OAuth2 client

func (*Client) GenerateAuthorizationURL

func (c *Client) GenerateAuthorizationURL(redirectURI string, scopes ...discord.ApplicationScope) string

GenerateAuthorizationURL generates an authorization URL with the given redirect URI & scopes, state is automatically generated

func (*Client) GetConnections

func (c *Client) GetConnections(session Session, opts ...rest.RequestOpt) ([]discord.Connection, error)

GetConnections returns the discord.Connection(s) the user has connected. This requires the discord.ApplicationScopeConnections scope in the session

func (*Client) GetGuilds

func (c *Client) GetGuilds(session Session, opts ...rest.RequestOpt) ([]discord.OAuth2Guild, error)

GetGuilds returns the discord.OAuth2Guild(s) the user is a member of. This requires the discord.ApplicationScopeGuilds scope in the session

func (*Client) GetUser

func (c *Client) GetUser(session Session, opts ...rest.RequestOpt) (*discord.OAuth2User, error)

GetUser returns the discord.OAuth2User associated with the given session. Fields filled in the struct depend on the Session.Scopes

func (*Client) RefreshSession

func (c *Client) RefreshSession(identifier string, session Session, opts ...rest.RequestOpt) (Session, error)

RefreshSession refreshes the given session with the refresh token

func (*Client) StartSession

func (c *Client) StartSession(code string, state string, identifier string, opts ...rest.RequestOpt) (Session, error)

StartSession starts a new session with the given authorization code & state

type Config

type Config struct {
	Logger            log.Logger
	RestClient        rest.Client
	RestClientConfig  *rest.Config
	OAuth2Service     rest.OAuth2Service
	SessionController SessionController
	StateController   StateController
}

Config is the configuration for the OAuth2 client

func (*Config) Apply

func (c *Config) Apply(opts []ConfigOpt)

Apply applies the given ConfigOpt(s) to the Config

type ConfigOpt

type ConfigOpt func(config *Config)

ConfigOpt can be used to supply optional parameters to New

func WithLogger

func WithLogger(logger log.Logger) ConfigOpt

WithLogger applies a custom logger to the OAuth2 client

func WithOAuth2Service

func WithOAuth2Service(oauth2service rest.OAuth2Service) ConfigOpt

WithOAuth2Service applies a custom rest.OAuth2Service to the OAuth2 client

func WithRestClient

func WithRestClient(restClient rest.Client) ConfigOpt

WithRestClient applies a custom rest.Client to the OAuth2 client

func WithRestClientConfig

func WithRestClientConfig(restConfig rest.Config) ConfigOpt

WithRestClientConfig applies a custom rest.Config to the OAuth2 client

func WithRestClientConfigOpts

func WithRestClientConfigOpts(opts ...rest.ConfigOpt) ConfigOpt

WithRestClientConfigOpts applies rest.ConfigOpt for the rest.Client to the OAuth2 client

func WithSessionController

func WithSessionController(sessionController SessionController) ConfigOpt

WithSessionController applies a custom SessionController to the OAuth2 client

func WithStateController

func WithStateController(stateController StateController) ConfigOpt

WithStateController applies a custom StateController to the OAuth2 client

type Session

type Session interface {
	// AccessToken allows requesting user information
	AccessToken() string

	// RefreshToken allows refreshing the AccessToken
	RefreshToken() string

	// Scopes returns the discord.ApplicationScope(s) of the Session
	Scopes() []discord.ApplicationScope

	// TokenType returns the discord.TokenType of the AccessToken
	TokenType() discord.TokenType

	// Expiration returns the time.Time when the AccessToken expires and needs to be refreshed
	Expiration() time.Time

	// Webhook returns the discord.IncomingWebhook when the discord.ApplicationScopeWebhookIncoming is set
	Webhook() *discord.IncomingWebhook
}

Session represents a discord access token response (https://discord.com/developers/docs/topics/oauth2#authorization-code-grant-access-token-response)

type SessionController

type SessionController interface {
	// GetSession returns the Session for the given identifier or nil if none was found
	GetSession(identifier string) Session

	// CreateSession creates a new Session from the given identifier, access token, refresh token, scope, token type, expiration and webhook
	CreateSession(identifier string, accessToken string, refreshToken string, scopes []discord.ApplicationScope, tokenType discord.TokenType, expiration time.Time, webhook *discord.IncomingWebhook) Session

	// CreateSessionFromExchange creates a new Session from the given identifier and discord.AccessTokenExchange payload
	CreateSessionFromExchange(identifier string, exchange discord.AccessTokenExchange) Session
}

SessionController lets you manage your Session(s)

func NewSessionController

func NewSessionController() SessionController

NewSessionController returns a new empty SessionController

func NewSessionControllerWithSessions

func NewSessionControllerWithSessions(sessions map[string]Session) SessionController

NewSessionControllerWithSessions returns a new SessionController with the given Session(s)

type StateController

type StateController interface {
	// GenerateNewState generates a new random state to be used as a state
	GenerateNewState(redirectURI string) string

	// ConsumeState validates a state and returns the redirect url or nil if it is invalid
	ConsumeState(state string) *string
}

StateController is responsible for generating, storing and validating states

func NewStateController

func NewStateController() StateController

NewStateController returns a new empty StateController

func NewStateControllerWithStates

func NewStateControllerWithStates(states map[string]string) StateController

NewStateControllerWithStates returns a new StateController with the given states

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL