2020-02-03 11:16:02 +03:00
|
|
|
package auth
|
|
|
|
|
2020-03-09 20:16:31 +03:00
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/micro/go-micro/v2/auth/provider"
|
2020-03-23 19:19:30 +03:00
|
|
|
"github.com/micro/go-micro/v2/store"
|
2020-03-09 20:16:31 +03:00
|
|
|
)
|
2020-03-07 14:06:57 +03:00
|
|
|
|
2020-02-03 11:16:02 +03:00
|
|
|
type Options struct {
|
2020-02-26 01:15:44 +03:00
|
|
|
// Token is an auth token
|
|
|
|
Token string
|
|
|
|
// Public key base64 encoded
|
|
|
|
PublicKey string
|
|
|
|
// Private key base64 encoded
|
|
|
|
PrivateKey string
|
2020-03-07 14:06:57 +03:00
|
|
|
// Provider is an auth provider
|
|
|
|
Provider provider.Provider
|
|
|
|
// LoginURL is the relative url path where a user can login
|
|
|
|
LoginURL string
|
2020-03-23 19:19:30 +03:00
|
|
|
// Store to back auth
|
|
|
|
Store store.Store
|
2020-02-03 11:16:02 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
type Option func(o *Options)
|
|
|
|
|
2020-03-23 19:19:30 +03:00
|
|
|
// Store to back auth
|
|
|
|
func Store(s store.Store) Option {
|
2020-02-10 11:26:28 +03:00
|
|
|
return func(o *Options) {
|
2020-03-23 19:19:30 +03:00
|
|
|
o.Store = s
|
2020-02-10 11:26:28 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-03 11:16:02 +03:00
|
|
|
// PublicKey is the JWT public key
|
|
|
|
func PublicKey(key string) Option {
|
|
|
|
return func(o *Options) {
|
2020-02-26 01:15:44 +03:00
|
|
|
o.PublicKey = key
|
2020-02-03 11:16:02 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// PrivateKey is the JWT private key
|
|
|
|
func PrivateKey(key string) Option {
|
|
|
|
return func(o *Options) {
|
2020-02-26 01:15:44 +03:00
|
|
|
o.PrivateKey = key
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-23 19:19:30 +03:00
|
|
|
// ServiceToken sets an auth token
|
|
|
|
func ServiceToken(t string) Option {
|
2020-02-26 01:15:44 +03:00
|
|
|
return func(o *Options) {
|
|
|
|
o.Token = t
|
2020-02-03 11:16:02 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-07 14:06:57 +03:00
|
|
|
// Provider set the auth provider
|
|
|
|
func Provider(p provider.Provider) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Provider = p
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LoginURL sets the auth LoginURL
|
|
|
|
func LoginURL(url string) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.LoginURL = url
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-03 11:16:02 +03:00
|
|
|
type GenerateOptions struct {
|
2020-02-26 01:15:44 +03:00
|
|
|
// Metadata associated with the account
|
2020-02-03 11:16:02 +03:00
|
|
|
Metadata map[string]string
|
2020-02-26 01:15:44 +03:00
|
|
|
// Roles/scopes associated with the account
|
2020-03-23 19:19:30 +03:00
|
|
|
Roles []string
|
|
|
|
// SecretExpiry is the time the secret should live for
|
|
|
|
SecretExpiry time.Duration
|
2020-02-03 11:16:02 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
type GenerateOption func(o *GenerateOptions)
|
|
|
|
|
2020-03-23 19:19:30 +03:00
|
|
|
// WithMetadata for the generated account
|
|
|
|
func WithMetadata(md map[string]string) GenerateOption {
|
2020-02-03 11:16:02 +03:00
|
|
|
return func(o *GenerateOptions) {
|
|
|
|
o.Metadata = md
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-23 19:19:30 +03:00
|
|
|
// WithRoles for the generated account
|
2020-03-24 13:18:34 +03:00
|
|
|
func WithRoles(rs ...string) GenerateOption {
|
2020-02-03 11:16:02 +03:00
|
|
|
return func(o *GenerateOptions) {
|
|
|
|
o.Roles = rs
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-23 19:19:30 +03:00
|
|
|
// WithSecretExpiry for the generated account's secret expires
|
|
|
|
func WithSecretExpiry(ex time.Duration) GenerateOption {
|
2020-03-09 20:16:31 +03:00
|
|
|
return func(o *GenerateOptions) {
|
2020-03-23 19:19:30 +03:00
|
|
|
o.SecretExpiry = ex
|
2020-03-09 20:16:31 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-03 11:16:02 +03:00
|
|
|
// NewGenerateOptions from a slice of options
|
|
|
|
func NewGenerateOptions(opts ...GenerateOption) GenerateOptions {
|
|
|
|
var options GenerateOptions
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
2020-03-23 19:19:30 +03:00
|
|
|
|
|
|
|
// set defualt expiry of secret
|
|
|
|
if options.SecretExpiry == 0 {
|
|
|
|
options.SecretExpiry = time.Hour * 24 * 7
|
|
|
|
}
|
|
|
|
|
|
|
|
return options
|
|
|
|
}
|
|
|
|
|
|
|
|
type RefreshOptions struct {
|
|
|
|
// TokenExpiry is the time the token should live for
|
|
|
|
TokenExpiry time.Duration
|
|
|
|
}
|
|
|
|
|
|
|
|
type RefreshOption func(o *RefreshOptions)
|
|
|
|
|
|
|
|
// WithTokenExpiry for the token
|
|
|
|
func WithTokenExpiry(ex time.Duration) RefreshOption {
|
|
|
|
return func(o *RefreshOptions) {
|
|
|
|
o.TokenExpiry = ex
|
2020-03-09 20:16:31 +03:00
|
|
|
}
|
2020-03-23 19:19:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewRefreshOptions from a slice of options
|
|
|
|
func NewRefreshOptions(opts ...RefreshOption) RefreshOptions {
|
|
|
|
var options RefreshOptions
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
|
|
|
|
|
|
|
// set defualt expiry of token
|
|
|
|
if options.TokenExpiry == 0 {
|
|
|
|
options.TokenExpiry = time.Minute
|
|
|
|
}
|
|
|
|
|
2020-02-03 11:16:02 +03:00
|
|
|
return options
|
|
|
|
}
|