2020-02-03 08:16:02 +00:00
|
|
|
package auth
|
|
|
|
|
2020-03-10 01:16:31 +08:00
|
|
|
import (
|
2020-05-26 15:52:21 +01:00
|
|
|
"context"
|
2020-03-10 01:16:31 +08:00
|
|
|
"time"
|
|
|
|
|
2020-08-29 17:44:49 +03:00
|
|
|
"github.com/unistack-org/micro/v3/logger"
|
2020-11-18 16:50:41 +03:00
|
|
|
"github.com/unistack-org/micro/v3/metadata"
|
2021-01-22 23:32:33 +03:00
|
|
|
"github.com/unistack-org/micro/v3/meter"
|
2020-08-19 17:47:17 +03:00
|
|
|
"github.com/unistack-org/micro/v3/store"
|
2021-01-22 23:32:33 +03:00
|
|
|
"github.com/unistack-org/micro/v3/tracer"
|
2020-03-10 01:16:31 +08:00
|
|
|
)
|
2020-03-07 11:06:57 +00:00
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// NewOptions creates Options struct from slice of options
|
2020-04-14 09:14:07 +01:00
|
|
|
func NewOptions(opts ...Option) Options {
|
2020-12-09 12:10:25 +03:00
|
|
|
options := Options{
|
2021-01-22 23:32:33 +03:00
|
|
|
Tracer: tracer.DefaultTracer,
|
2020-12-09 12:10:25 +03:00
|
|
|
Logger: logger.DefaultLogger,
|
2021-01-22 23:32:33 +03:00
|
|
|
Meter: meter.DefaultMeter,
|
2020-12-09 12:10:25 +03:00
|
|
|
}
|
2020-04-14 09:14:07 +01:00
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
|
|
|
return options
|
|
|
|
}
|
|
|
|
|
2021-02-14 16:16:01 +03:00
|
|
|
// Options struct holds auth options
|
2020-02-03 08:16:02 +00:00
|
|
|
type Options struct {
|
2021-03-06 19:45:13 +03:00
|
|
|
// Context holds the external options
|
|
|
|
Context context.Context
|
|
|
|
// Meter used for metrics
|
|
|
|
Meter meter.Meter
|
|
|
|
// Logger used for logging
|
|
|
|
Logger logger.Logger
|
|
|
|
// Tracer used for tracing
|
|
|
|
Tracer tracer.Tracer
|
|
|
|
// Store used for stre data
|
|
|
|
Store store.Store
|
2020-03-31 12:44:34 +01:00
|
|
|
// Token is the services token used to authenticate itself
|
|
|
|
Token *Token
|
2020-03-07 11:06:57 +00:00
|
|
|
// LoginURL is the relative url path where a user can login
|
|
|
|
LoginURL string
|
2021-03-06 19:45:13 +03:00
|
|
|
// PrivateKey for encoding JWTs
|
|
|
|
PrivateKey string
|
|
|
|
// PublicKey for decoding JWTs
|
|
|
|
PublicKey string
|
|
|
|
// Secret is used to authenticate the service
|
|
|
|
Secret string
|
|
|
|
// ID is the services auth ID
|
|
|
|
ID string
|
|
|
|
// Issuer of the service's account
|
|
|
|
Issuer string
|
|
|
|
// Name holds the auth name
|
|
|
|
Name string
|
2020-05-13 17:54:47 +01:00
|
|
|
// Addrs sets the addresses of auth
|
|
|
|
Addrs []string
|
2020-02-03 08:16:02 +00:00
|
|
|
}
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// Option func
|
2020-02-03 08:16:02 +00:00
|
|
|
type Option func(o *Options)
|
|
|
|
|
2020-05-13 17:54:47 +01:00
|
|
|
// Addrs is the auth addresses to use
|
|
|
|
func Addrs(addrs ...string) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Addrs = addrs
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-29 14:07:35 +03:00
|
|
|
// Name sets the name
|
|
|
|
func Name(n string) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Name = n
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-17 12:26:27 +01:00
|
|
|
// Issuer of the services account
|
|
|
|
func Issuer(i string) Option {
|
2020-04-07 12:46:44 +01:00
|
|
|
return func(o *Options) {
|
2020-06-17 12:26:27 +01:00
|
|
|
o.Issuer = i
|
2020-04-07 12:46:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-23 16:19:30 +00:00
|
|
|
// Store to back auth
|
|
|
|
func Store(s store.Store) Option {
|
2020-02-10 08:26:28 +00:00
|
|
|
return func(o *Options) {
|
2020-03-23 16:19:30 +00:00
|
|
|
o.Store = s
|
2020-02-10 08:26:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-03 08:16:02 +00:00
|
|
|
// PublicKey is the JWT public key
|
|
|
|
func PublicKey(key string) Option {
|
|
|
|
return func(o *Options) {
|
2020-02-25 22:15:44 +00:00
|
|
|
o.PublicKey = key
|
2020-02-03 08:16:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-01 17:17:40 +01:00
|
|
|
// PrivateKey is the JWT private key
|
|
|
|
func PrivateKey(key string) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.PrivateKey = key
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-31 12:44:34 +01:00
|
|
|
// Credentials sets the auth credentials
|
2020-04-01 14:25:00 +01:00
|
|
|
func Credentials(id, secret string) Option {
|
2020-02-25 22:15:44 +00:00
|
|
|
return func(o *Options) {
|
2020-03-31 12:44:34 +01:00
|
|
|
o.ID = id
|
2020-04-01 14:25:00 +01:00
|
|
|
o.Secret = secret
|
2020-02-03 08:16:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-29 15:11:06 +01: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 11:06:57 +00:00
|
|
|
// LoginURL sets the auth LoginURL
|
|
|
|
func LoginURL(url string) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.LoginURL = url
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// GenerateOptions struct
|
2020-02-03 08:16:02 +00:00
|
|
|
type GenerateOptions struct {
|
2020-11-18 16:50:41 +03:00
|
|
|
Metadata metadata.Metadata
|
2020-03-31 19:01:43 +01:00
|
|
|
Provider string
|
2021-03-06 19:45:13 +03:00
|
|
|
Type string
|
|
|
|
Secret string
|
|
|
|
Issuer string
|
|
|
|
Scopes []string
|
2020-02-03 08:16:02 +00:00
|
|
|
}
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// GenerateOption func
|
2020-02-03 08:16:02 +00:00
|
|
|
type GenerateOption func(o *GenerateOptions)
|
|
|
|
|
2020-04-01 17:20:02 +01:00
|
|
|
// WithSecret for the generated account
|
|
|
|
func WithSecret(s string) GenerateOption {
|
|
|
|
return func(o *GenerateOptions) {
|
|
|
|
o.Secret = s
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-31 19:01:43 +01:00
|
|
|
// WithType for the generated account
|
|
|
|
func WithType(t string) GenerateOption {
|
|
|
|
return func(o *GenerateOptions) {
|
|
|
|
o.Type = t
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-23 16:19:30 +00:00
|
|
|
// WithMetadata for the generated account
|
2020-11-18 16:50:41 +03:00
|
|
|
func WithMetadata(md metadata.Metadata) GenerateOption {
|
2020-02-03 08:16:02 +00:00
|
|
|
return func(o *GenerateOptions) {
|
2020-11-18 16:50:41 +03:00
|
|
|
o.Metadata = metadata.Copy(md)
|
2020-02-03 08:16:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-21 16:41:55 +01:00
|
|
|
// WithProvider for the generated account
|
|
|
|
func WithProvider(p string) GenerateOption {
|
2020-03-30 09:51:37 +01:00
|
|
|
return func(o *GenerateOptions) {
|
2020-05-21 16:41:55 +01:00
|
|
|
o.Provider = p
|
2020-03-30 09:51:37 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-21 16:41:55 +01:00
|
|
|
// WithScopes for the generated account
|
|
|
|
func WithScopes(s ...string) GenerateOption {
|
2020-03-31 19:01:43 +01:00
|
|
|
return func(o *GenerateOptions) {
|
2020-05-21 16:41:55 +01:00
|
|
|
o.Scopes = s
|
2020-03-31 19:01:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-10 16:25:46 +01:00
|
|
|
// WithIssuer for the generated account
|
|
|
|
func WithIssuer(i string) GenerateOption {
|
|
|
|
return func(o *GenerateOptions) {
|
|
|
|
o.Issuer = i
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-03 08:16:02 +00:00
|
|
|
// NewGenerateOptions from a slice of options
|
|
|
|
func NewGenerateOptions(opts ...GenerateOption) GenerateOptions {
|
|
|
|
var options GenerateOptions
|
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
2020-03-23 16:19:30 +00:00
|
|
|
return options
|
|
|
|
}
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// TokenOptions struct
|
2020-03-31 10:06:13 +01:00
|
|
|
type TokenOptions struct {
|
2021-03-06 19:45:13 +03:00
|
|
|
ID string
|
|
|
|
Secret string
|
2020-04-01 14:25:00 +01:00
|
|
|
RefreshToken string
|
2021-03-06 19:45:13 +03:00
|
|
|
Issuer string
|
|
|
|
Expiry time.Duration
|
2020-03-23 16:19:30 +00:00
|
|
|
}
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// TokenOption func
|
2020-03-31 10:06:13 +01:00
|
|
|
type TokenOption func(o *TokenOptions)
|
2020-03-23 16:19:30 +00:00
|
|
|
|
2020-04-01 14:25:00 +01:00
|
|
|
// WithExpiry for the token
|
|
|
|
func WithExpiry(ex time.Duration) TokenOption {
|
|
|
|
return func(o *TokenOptions) {
|
|
|
|
o.Expiry = ex
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// WithCredentials sets tye id and secret
|
2020-04-01 14:25:00 +01:00
|
|
|
func WithCredentials(id, secret string) TokenOption {
|
|
|
|
return func(o *TokenOptions) {
|
|
|
|
o.ID = id
|
|
|
|
o.Secret = secret
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// WithToken sets the refresh token
|
2020-04-01 14:25:00 +01:00
|
|
|
func WithToken(rt string) TokenOption {
|
2020-03-31 10:06:13 +01:00
|
|
|
return func(o *TokenOptions) {
|
2020-04-01 14:25:00 +01:00
|
|
|
o.RefreshToken = rt
|
2020-03-10 01:16:31 +08:00
|
|
|
}
|
2020-03-23 16:19:30 +00:00
|
|
|
}
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// WithTokenIssuer sets the token issuer option
|
2020-07-14 12:44:51 +01:00
|
|
|
func WithTokenIssuer(iss string) TokenOption {
|
|
|
|
return func(o *TokenOptions) {
|
|
|
|
o.Issuer = iss
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-31 10:06:13 +01:00
|
|
|
// NewTokenOptions from a slice of options
|
|
|
|
func NewTokenOptions(opts ...TokenOption) TokenOptions {
|
|
|
|
var options TokenOptions
|
2020-03-23 16:19:30 +00:00
|
|
|
for _, o := range opts {
|
|
|
|
o(&options)
|
|
|
|
}
|
|
|
|
|
2020-08-25 14:33:36 +03:00
|
|
|
// set default expiry of token
|
2020-04-01 14:25:00 +01:00
|
|
|
if options.Expiry == 0 {
|
|
|
|
options.Expiry = time.Minute
|
2020-03-23 16:19:30 +00:00
|
|
|
}
|
|
|
|
|
2020-02-03 08:16:02 +00:00
|
|
|
return options
|
|
|
|
}
|
2020-05-20 16:49:52 +01:00
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// VerifyOptions struct
|
2020-05-21 18:11:35 +01:00
|
|
|
type VerifyOptions struct {
|
2020-07-07 08:30:25 +01:00
|
|
|
Context context.Context
|
|
|
|
Namespace string
|
2020-05-21 18:11:35 +01:00
|
|
|
}
|
2020-05-20 16:49:52 +01:00
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// VerifyOption func
|
2020-05-20 16:49:52 +01:00
|
|
|
type VerifyOption func(o *VerifyOptions)
|
2020-05-21 18:11:35 +01:00
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// VerifyContext pass context to verify
|
2020-05-26 15:52:21 +01:00
|
|
|
func VerifyContext(ctx context.Context) VerifyOption {
|
2020-05-21 18:11:35 +01:00
|
|
|
return func(o *VerifyOptions) {
|
2020-05-26 15:52:21 +01:00
|
|
|
o.Context = ctx
|
|
|
|
}
|
|
|
|
}
|
2020-12-09 12:10:25 +03:00
|
|
|
|
|
|
|
// VerifyNamespace sets thhe namespace for verify
|
2020-07-07 08:30:25 +01:00
|
|
|
func VerifyNamespace(ns string) VerifyOption {
|
|
|
|
return func(o *VerifyOptions) {
|
|
|
|
o.Namespace = ns
|
|
|
|
}
|
|
|
|
}
|
2020-05-26 15:52:21 +01:00
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// RulesOptions struct
|
2020-05-26 15:52:21 +01:00
|
|
|
type RulesOptions struct {
|
2020-07-07 08:30:25 +01:00
|
|
|
Context context.Context
|
|
|
|
Namespace string
|
2020-05-26 15:52:21 +01:00
|
|
|
}
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// RulesOption func
|
2020-05-26 15:52:21 +01:00
|
|
|
type RulesOption func(o *RulesOptions)
|
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// RulesContext pass rules context
|
2020-05-26 15:52:21 +01:00
|
|
|
func RulesContext(ctx context.Context) RulesOption {
|
|
|
|
return func(o *RulesOptions) {
|
|
|
|
o.Context = ctx
|
2020-05-21 18:11:35 +01:00
|
|
|
}
|
|
|
|
}
|
2020-07-07 08:30:25 +01:00
|
|
|
|
2020-12-09 12:10:25 +03:00
|
|
|
// RulesNamespace sets the rule namespace
|
2020-07-07 08:30:25 +01:00
|
|
|
func RulesNamespace(ns string) RulesOption {
|
|
|
|
return func(o *RulesOptions) {
|
|
|
|
o.Namespace = ns
|
|
|
|
}
|
|
|
|
}
|
2020-12-09 12:10:25 +03:00
|
|
|
|
|
|
|
// Logger sets the logger
|
|
|
|
func Logger(l logger.Logger) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Logger = l
|
|
|
|
}
|
|
|
|
}
|
2021-01-22 23:32:33 +03:00
|
|
|
|
|
|
|
// Meter sets the meter
|
|
|
|
func Meter(m meter.Meter) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Meter = m
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tracer sets the meter
|
|
|
|
func Tracer(t tracer.Tracer) Option {
|
|
|
|
return func(o *Options) {
|
|
|
|
o.Tracer = t
|
|
|
|
}
|
|
|
|
}
|