このチャプターの目次
ストレージのイディオム
クライアントやトークンや認可コードなどをサーバー側で永続化し取り扱うためのinterface定義の集まりです
Storage
storage.go
で定義されてるinterfaceです
type Storage interface {
ClientManager
}
ClientManager
client_manager.go
で定義されています。
サーバー側で管理しているOAuth2クライアントを取り扱うためのinterfaceです。
// ClientManager defines the (persistent) manager interface for clients.
type ClientManager interface {
// GetClient loads the client by its ID or returns an error
// if the client does not exist or another error occurred.
GetClient(ctx context.Context, id string) (Client, error)
// ClientAssertionJWTValid returns an error if the JTI is
// known or the DB check failed and nil if the JTI is not known.
ClientAssertionJWTValid(ctx context.Context, jti string) error
// SetClientAssertionJWT marks a JTI as known for the given
// expiry time. Before inserting the new JTI, it will clean
// up any existing JTIs that have expired as those tokens can
// not be replayed due to the expiry.
SetClientAssertionJWT(ctx context.Context, jti string, exp time.Time) error
}
CoreStorage
認可コード、アクセストークン、リフレッシュトークンのストレージでの取り扱いを束ねるinterfaceです
handler/oauth2/storage.go
で定義されています
type CoreStorage interface {
AuthorizeCodeStorage
AccessTokenStorage
RefreshTokenStorage
}
AuthorizeCodeStorage
type AuthorizeCodeStrategy interface {
AuthorizeCodeSignature(ctx context.Context, token string) string
GenerateAuthorizeCode(ctx context.Context, requester fosite.Requester) (token string, signature string, err error)
ValidateAuthorizeCode(ctx context.Context, requester fosite.Requester, token string) (err error)
}
AccessTokenStorage
type AccessTokenStrategy interface {
AccessTokenSignature(ctx context.Context, token string) string
GenerateAccessToken(ctx context.Context, requester fosite.Requester) (token string, signature string, err error)
ValidateAccessToken(ctx context.Context, requester fosite.Requester, token string) (err error)
}
RefreshTokenStorage
type RefreshTokenStrategy interface {
RefreshTokenSignature(ctx context.Context, token string) string
GenerateRefreshToken(ctx context.Context, requester fosite.Requester) (token string, signature string, err error)
ValidateRefreshToken(ctx context.Context, requester fosite.Requester, token string) (err error)
}
ClientCredentialsGrantStorage
handler/oauth2/flow_client_credentials_storage.go
で定義されています。
AccessTokenStorage
は前出のinterfaceです。必要なinterfaceへのアクセスに限っています
type ClientCredentialsGrantStorage interface {
AccessTokenStorage
}
TokenRevocationStorage
トークンのrevokeに関するストレージのinterfaceです。
handler/oauth2/revocation_storage.go
で定義されています。
// TokenRevocationStorage provides the storage implementation
// as specified in: https://tools.ietf.org/html/rfc7009
type TokenRevocationStorage interface {
RefreshTokenStorage
AccessTokenStorage
// RevokeRefreshToken revokes a refresh token as specified in:
// https://tools.ietf.org/html/rfc7009#section-2.1
// If the particular
// token is a refresh token and the authorization server supports the
// revocation of access tokens, then the authorization server SHOULD
// also invalidate all access tokens based on the same authorization
// grant (see Implementation Note).
RevokeRefreshToken(ctx context.Context, requestID string) error
// RevokeRefreshTokenMaybeGracePeriod revokes a refresh token as specified in:
// https://tools.ietf.org/html/rfc7009#section-2.1
// If the particular
// token is a refresh token and the authorization server supports the
// revocation of access tokens, then the authorization server SHOULD
// also invalidate all access tokens based on the same authorization
// grant (see Implementation Note).
//
// If the Refresh Token grace period is greater than zero in configuration the token
// will have its expiration time set as UTCNow + GracePeriod.
RevokeRefreshTokenMaybeGracePeriod(ctx context.Context, requestID string, signature string) error
// RevokeAccessToken revokes an access token as specified in:
// https://tools.ietf.org/html/rfc7009#section-2.1
// If the token passed to the request
// is an access token, the server MAY revoke the respective refresh
// token as well.
RevokeAccessToken(ctx context.Context, requestID string) error
}
OpenIDConnectRequestStorage
handler/openid/storage.go
で定義されている。
type OpenIDConnectRequestStorage interface {
// CreateOpenIDConnectSession creates an open id connect session
// for a given authorize code. This is relevant for explicit open id connect flow.
CreateOpenIDConnectSession(ctx context.Context, authorizeCode string, requester fosite.Requester) error
// GetOpenIDConnectSession returns error
// - nil if a session was found,
// - ErrNoSessionFound if no session was found
// - or an arbitrary error if an error occurred.
GetOpenIDConnectSession(ctx context.Context, authorizeCode string, requester fosite.Requester) (fosite.Requester, error)
// Deprecated: DeleteOpenIDConnectSession is not called from anywhere.
// Originally, it should remove an open id connect session from the store.
DeleteOpenIDConnectSession(ctx context.Context, authorizeCode string) error
}
PKCERequestStorage
PKCE(Proof Key for Code Exchange by OAuth Public Clients)に関するストレージを取り扱うためのinterfaceです
handler/pkce/storage.go
で定義されている。
type PKCERequestStorage interface {
GetPKCERequestSession(ctx context.Context, signature string, session fosite.Session) (fosite.Requester, error)
CreatePKCERequestSession(ctx context.Context, signature string, requester fosite.Requester) error
DeletePKCERequestSession(ctx context.Context, signature string) error
}
Transactional
ストレージインターフェースの各メソッドでトランザクションを扱うためのinterface定義です。
storage/transactional.go
で定義されている
// A storage provider that has support for transactions should implement this interface to ensure atomicity for certain flows
// that require transactional semantics. Fosite will call these methods (when atomicity is required) if and only if the storage
// provider has implemented `Transactional`. It is expected that the storage provider will examine context for an existing transaction
// each time a database operation is to be performed.
//
// An implementation of `BeginTX` should attempt to initiate a new transaction and store that under a unique key
// in the context that can be accessible by `Commit` and `Rollback`. The "transactional aware" context will then be
// returned for further propagation, eventually to be consumed by `Commit` or `Rollback` to finish the transaction.
//
// Implementations for `Commit` & `Rollback` should look for the transaction object inside the supplied context using the same
// key used by `BeginTX`. If these methods have been called, it is expected that a txn object should be available in the provided
// context.
type Transactional interface {
BeginTX(ctx context.Context) (context.Context, error)
Commit(ctx context.Context) error
Rollback(ctx context.Context) error
}