2020-02-03 10:16:02 +02:00
|
|
|
package auth
|
|
|
|
|
2020-03-09 19:16:31 +02:00
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/micro/go-micro/v2/auth/provider"
|
2020-05-11 18:57:39 +02:00
|
|
|
"github.com/micro/go-micro/v2/client"
|
2020-03-23 18:19:30 +02:00
|
|
|
"github.com/micro/go-micro/v2/store"
|
2020-03-09 19:16:31 +02:00
|
|
|
)
|
2020-03-07 13:06:57 +02:00
|
|
|
|
2020-04-14 10:14:07 +02:00
|
|
|
func NewOptions(opts ...Option) Options {
|
|
|
|
var options Options
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
2020-05-11 18:57:39 +02:00
|
|
|
if options.Client == nil {
|
|
|
|
options.Client = client.DefaultClient
|
|
|
|
}
|
2020-04-14 10:14:07 +02:00
|
|
|
|
|
|
|
return options
|
|
|
|
}
|
|
|
|
|
2020-02-03 10:16:02 +02:00
|
|
|
type Options struct {
|
2020-04-07 13:46:44 +02:00
|
|
|
// Namespace the service belongs to
|
|
|
|
Namespace string
|
2020-03-31 13:44:34 +02:00
|
|
|
// ID is the services auth ID
|
|
|
|
ID string
|
2020-04-01 15:25:00 +02:00
|
|
|
// Secret is used to authenticate the service
|
|
|
|
Secret string
|
2020-03-31 13:44:34 +02:00
|
|
|
// Token is the services token used to authenticate itself
|
|
|
|
Token *Token
|
2020-04-01 15:25:00 +02:00
|
|
|
// PublicKey for decoding JWTs
|
2020-02-26 00:15:44 +02:00
|
|
|
PublicKey string
|
2020-04-01 18:17:40 +02:00
|
|
|
// PrivateKey for encoding JWTs
|
|
|
|
PrivateKey string
|
2020-03-07 13:06:57 +02: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 18:19:30 +02:00
|
|
|
// Store to back auth
|
|
|
|
Store store.Store
|
2020-05-11 18:57:39 +02:00
|
|
|
// Client to use for RPC
|
|
|
|
Client client.Client
|
2020-05-13 18:54:47 +02:00
|
|
|
// Addrs sets the addresses of auth
|
|
|
|
Addrs []string
|
2020-02-03 10:16:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type Option func(o *Options)
|
|
|
|
|
2020-05-13 18:54:47 +02:00
|
|
|
// Addrs is the auth addresses to use
|
|
|
|
func Addrs(addrs ...string) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Addrs = addrs
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-07 13:46:44 +02:00
|
|
|
// Namespace the service belongs to
|
|
|
|
func Namespace(n string) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Namespace = n
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-23 18:19:30 +02:00
|
|
|
// Store to back auth
|
|
|
|
func Store(s store.Store) Option {
|
2020-02-10 10:26:28 +02:00
|
|
|
return func(o *Options) {
|
2020-03-23 18:19:30 +02:00
|
|
|
o.Store = s
|
2020-02-10 10:26:28 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-03 10:16:02 +02:00
|
|
|
// PublicKey is the JWT public key
|
|
|
|
func PublicKey(key string) Option {
|
|
|
|
return func(o *Options) {
|
2020-02-26 00:15:44 +02:00
|
|
|
o.PublicKey = key
|
2020-02-03 10:16:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-01 18:17:40 +02:00
|
|
|
// PrivateKey is the JWT private key
|
|
|
|
func PrivateKey(key string) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.PrivateKey = key
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-31 13:44:34 +02:00
|
|
|
// Credentials sets the auth credentials
|
2020-04-01 15:25:00 +02:00
|
|
|
func Credentials(id, secret string) Option {
|
2020-02-26 00:15:44 +02:00
|
|
|
return func(o *Options) {
|
2020-03-31 13:44:34 +02:00
|
|
|
o.ID = id
|
2020-04-01 15:25:00 +02:00
|
|
|
o.Secret = secret
|
2020-02-03 10:16:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-29 16:11:06 +02:00
|
|
|
// ClientToken sets the auth token to use when making requests
|
|
|
|
func ClientToken(token *Token) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Token = token
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-07 13:06:57 +02: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-05-11 18:57:39 +02:00
|
|
|
// WithClient sets the client to use when making requests
|
|
|
|
func WithClient(c client.Client) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Client = c
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-03 10:16:02 +02:00
|
|
|
type GenerateOptions struct {
|
2020-02-26 00:15:44 +02:00
|
|
|
// Metadata associated with the account
|
2020-02-03 10:16:02 +02:00
|
|
|
Metadata map[string]string
|
2020-05-20 17:49:52 +02:00
|
|
|
// Scopes the account has access too
|
2020-05-19 19:17:17 +02:00
|
|
|
Scopes []string
|
2020-03-31 20:01:43 +02:00
|
|
|
// Provider of the account, e.g. oauth
|
|
|
|
Provider string
|
|
|
|
// Type of the account, e.g. user
|
|
|
|
Type string
|
2020-04-01 18:20:02 +02:00
|
|
|
// Secret used to authenticate the account
|
|
|
|
Secret string
|
2020-02-03 10:16:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type GenerateOption func(o *GenerateOptions)
|
|
|
|
|
2020-04-01 18:20:02 +02:00
|
|
|
// WithSecret for the generated account
|
|
|
|
func WithSecret(s string) GenerateOption {
|
|
|
|
return func(o *GenerateOptions) {
|
|
|
|
o.Secret = s
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-31 20:01:43 +02:00
|
|
|
// WithType for the generated account
|
|
|
|
func WithType(t string) GenerateOption {
|
|
|
|
return func(o *GenerateOptions) {
|
|
|
|
o.Type = t
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-23 18:19:30 +02:00
|
|
|
// WithMetadata for the generated account
|
|
|
|
func WithMetadata(md map[string]string) GenerateOption {
|
2020-02-03 10:16:02 +02:00
|
|
|
return func(o *GenerateOptions) {
|
|
|
|
o.Metadata = md
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-19 19:17:17 +02:00
|
|
|
// WithScopes for the generated account
|
|
|
|
func WithScopes(s ...string) GenerateOption {
|
2020-03-30 10:51:37 +02:00
|
|
|
return func(o *GenerateOptions) {
|
2020-05-19 19:17:17 +02:00
|
|
|
o.Scopes = s
|
2020-03-30 10:51:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-31 20:01:43 +02:00
|
|
|
// WithProvider for the generated account
|
|
|
|
func WithProvider(p string) GenerateOption {
|
|
|
|
return func(o *GenerateOptions) {
|
|
|
|
o.Provider = p
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-03 10:16:02 +02:00
|
|
|
// NewGenerateOptions from a slice of options
|
|
|
|
func NewGenerateOptions(opts ...GenerateOption) GenerateOptions {
|
|
|
|
var options GenerateOptions
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
2020-03-23 18:19:30 +02:00
|
|
|
return options
|
|
|
|
}
|
|
|
|
|
2020-03-31 11:06:13 +02:00
|
|
|
type TokenOptions struct {
|
2020-04-01 15:25:00 +02:00
|
|
|
// ID for the account
|
|
|
|
ID string
|
|
|
|
// Secret for the account
|
|
|
|
Secret string
|
|
|
|
// RefreshToken is used to refesh a token
|
|
|
|
RefreshToken string
|
|
|
|
// Expiry is the time the token should live for
|
|
|
|
Expiry time.Duration
|
2020-03-23 18:19:30 +02:00
|
|
|
}
|
|
|
|
|
2020-03-31 11:06:13 +02:00
|
|
|
type TokenOption func(o *TokenOptions)
|
2020-03-23 18:19:30 +02:00
|
|
|
|
2020-04-01 15:25:00 +02:00
|
|
|
// WithExpiry for the token
|
|
|
|
func WithExpiry(ex time.Duration) TokenOption {
|
|
|
|
return func(o *TokenOptions) {
|
|
|
|
o.Expiry = ex
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func WithCredentials(id, secret string) TokenOption {
|
|
|
|
return func(o *TokenOptions) {
|
|
|
|
o.ID = id
|
|
|
|
o.Secret = secret
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func WithToken(rt string) TokenOption {
|
2020-03-31 11:06:13 +02:00
|
|
|
return func(o *TokenOptions) {
|
2020-04-01 15:25:00 +02:00
|
|
|
o.RefreshToken = rt
|
2020-03-09 19:16:31 +02:00
|
|
|
}
|
2020-03-23 18:19:30 +02:00
|
|
|
}
|
|
|
|
|
2020-03-31 11:06:13 +02:00
|
|
|
// NewTokenOptions from a slice of options
|
|
|
|
func NewTokenOptions(opts ...TokenOption) TokenOptions {
|
|
|
|
var options TokenOptions
|
2020-03-23 18:19:30 +02:00
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
|
|
|
|
|
|
|
// set defualt expiry of token
|
2020-04-01 15:25:00 +02:00
|
|
|
if options.Expiry == 0 {
|
|
|
|
options.Expiry = time.Minute
|
2020-03-23 18:19:30 +02:00
|
|
|
}
|
|
|
|
|
2020-02-03 10:16:02 +02:00
|
|
|
return options
|
|
|
|
}
|
2020-05-20 17:49:52 +02:00
|
|
|
|
|
|
|
type VerifyOptions struct {
|
|
|
|
Scope string
|
|
|
|
}
|
|
|
|
|
|
|
|
type VerifyOption func(o *VerifyOptions)
|
|
|
|
|
|
|
|
// WithScope to require when verifying
|
|
|
|
func WithScope(s string) VerifyOption {
|
|
|
|
return func(o *VerifyOptions) {
|
|
|
|
o.Scope = s
|
|
|
|
}
|
|
|
|
}
|