auth

package module
v0.0.0-...-94183c9 Latest Latest
Warning

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

Go to latest
Published: Oct 20, 2020 License: MIT Imports: 9 Imported by: 2

README

Auth

基于gin写的一套登录认证方式。认证模式为,登录成功后,生成JWT,传输给客户端。客户端在header中携带JWT作为token访问服务端。

##登录方式

当前版本支持的登录方式:

  1. 账号密码登录(支持随机验证码)
  2. OAuth2.0登录(IM、微信扫码)

Token

当前版本支持Token存储方式:

  1. mysql数据库内存储
  2. redis存放(推荐)

获取用户数据的方法

func XXHandler (c *gin.Context) {
    user := c.GetStringMapString(auth.CtxKeyAuthUser) //CtxKeyAuthUser: AuthUser
}

user存放内容由provider自定义,必存字段包括,id, provider, name, role。为了方便获取,目前只支持map[string]string格式的user数据存储。

例子

见example目录

Documentation

Index

Constants

View Source
const CtxKeyAuthUser = "AuthUser"
View Source
const CtxKeyErrorCode = "ErrorCode"
View Source
const CtxKeyGinAuth = "GinAuth"
View Source
const CtxKeyResultType = "ResultType"
View Source
const CtxKeyUserRole = "UserRole"
View Source
const DefaultErrorTokenInvalid = 2

Variables

View Source
var (
	ErrMissingResult = errors.New("接口未按要求返回结果")
)

Functions

func AfterLogin

func AfterLogin(c *gin.Context, r AuthRender, user User)

func DefaultErrorResponse

func DefaultErrorResponse(c *gin.Context, err error)

func DefaultGetLoginHandler

func DefaultGetLoginHandler(c *gin.Context, p AuthProvider, r AuthRender)

func DefaultJsonError

func DefaultJsonError(c *gin.Context, errMsg string)

func DefaultJsonSuccess

func DefaultJsonSuccess(c *gin.Context, data interface{})

func DefaultLoginCallbackHandler

func DefaultLoginCallbackHandler(c *gin.Context, p AuthProvider, r AuthRender)

func DefaultLogoutHandler

func DefaultLogoutHandler(c *gin.Context, gAuth *GinAuth)

func DefaultNotFoundHandler

func DefaultNotFoundHandler(c *gin.Context)

func DefaultPostLoginHandler

func DefaultPostLoginHandler(c *gin.Context, p AuthProvider, r AuthRender)

func GetRoleFromContext

func GetRoleFromContext(c *gin.Context) string

从Context里获取角色信息

func NewGinHandler

func NewGinHandler(h GinAuthHandler, a *GinAuth) func(c *gin.Context)

func NewHandler

func NewHandler(h func(c *gin.Context, a *GinAuth), a *GinAuth) func(c *gin.Context)

Types

type AuthProvider

type AuthProvider interface {

	// 认证名称
	GetName() string

	// 注册时需要执行的
	OnProviderRegister(a *GinAuth) error

	// 登录引导
	OnGuideLogin(c *gin.Context) error

	// 登录账号
	OnLogin(c *gin.Context) (User, error)
	// 第三方登录回调
	OnLoginCallback(c *gin.Context) (User, error)
	OnLogout(c *gin.Context) (User, error)
}

认证必须实现的接口

type AuthRender

type AuthRender interface {

	// 注册时需要执行的
	OnRenderRegister(a *GinAuth) error

	// 错误渲染
	Error(c *gin.Context) (*Result, error)

	// 登录引导
	GuideLogin(c *gin.Context) (*Result, error)

	// 错误登录
	FailLogin(c *gin.Context) (*Result, error)

	// 成功登录
	SuccessLogin(c *gin.Context, u User) (*Result, error)

	// 登出账号
	Logout(c *gin.Context) (*Result, error)
}

type AuthToken

type AuthToken interface {

	// 新Token
	NewToken(user map[string]string) (token string, expiredAt int64, err error)

	// 清除Token
	ClearToken(token string) error

	// 清除用户的Token
	ClearTokenOfUser(uid string, provider string) error

	// 查找token
	FindToken(token string) (user map[string]string)
}

type Config

type Config struct {
	Path struct {
		// Auth工具挂载的地址。如:/auth
		Mount string
		// Auth工具挂载的Web服务的站点基础路径。如:http://localhost:8090/api,主要用于构建回调地址用。
		RootURL string
		// 域名
		Domain string
		// 登录成功之后的跳转地址,如果需要的话
		RedirectAfterLogin string
		// Token写入cookie时使用名字
		TokenKey string
		// Token在头部请求时的名字
		HeaderKey string
	}

	Response struct {
		// 默认返回类型
		DefaultResultType ResultType

		NotFoundHandler func(c *gin.Context)
	}

	Core struct {

		// 路由
		Router *gin.Engine

		// 数据库连接
		DB *gorm.DB

		// token管理
		AuthToken AuthToken

		// 用户存储
		UserStore user_store.UserStoreInterface

		// Session
		Session Session

		// 是否打开日志功能
		LogMod bool
		Logger log.Logger
	}
}

type GinAuth

type GinAuth struct {
	Config   Config
	Handlers GinAuthHandlers
	// contains filtered or unexported fields
}

func GetAuthFromContext

func GetAuthFromContext(c *gin.Context) *GinAuth

从Context里获取GinAuth

func New

func New(cfg Config) (*GinAuth, error)

func (*GinAuth) AuthTokenMiddleware

func (a *GinAuth) AuthTokenMiddleware() func(c *gin.Context)

func (*GinAuth) GetDb

func (a *GinAuth) GetDb() *gorm.DB

func (*GinAuth) GetProvider

func (a *GinAuth) GetProvider(name string) AuthProvider

func (*GinAuth) GetRender

func (a *GinAuth) GetRender(name string) AuthRender

func (*GinAuth) HasProvider

func (a *GinAuth) HasProvider(name string) bool

func (*GinAuth) MountAuth

func (a *GinAuth) MountAuth() error

func (*GinAuth) RegisterProvider

func (a *GinAuth) RegisterProvider(p AuthProvider, r AuthRender) error

type GinAuthHandler

type GinAuthHandler func(c *gin.Context, p AuthProvider, r AuthRender)

type GinAuthHandlers

type GinAuthHandlers struct {
	GetLoginHandler      GinAuthHandler
	PostLoginHandler     GinAuthHandler
	LogoutHandler        func(c *gin.Context, a *GinAuth)
	LoginCallbackHandler GinAuthHandler
}

type Result

type Result struct {
	StatusCode int
	RspType    ResultType
	Value      interface{}
	Key        string
}

func NewJSONResult

func NewJSONResult(v interface{}) *Result

func NewRedirectResult

func NewRedirectResult(url string) *Result

func NewStringResult

func NewStringResult(v string) *Result

func NewTmplResult

func NewTmplResult(tplName string, v interface{}) *Result

func (*Result) GetStringValue

func (r *Result) GetStringValue() string

func (*Result) Response

func (r *Result) Response(c *gin.Context) error

type ResultType

type ResultType string
const RspTypeJSON ResultType = "json"
const RspTypeRedirect ResultType = "redirect"
const RspTypeString ResultType = "html_string"
const RspTypeTmpl ResultType = "tmpl"

func GetDefaultResultType

func GetDefaultResultType(c *gin.Context) ResultType

从Context里获取默认的返回格式

type Session

type Session interface {
	// 对一个request启动session,默认要检查csrf
	StartSession(c *gin.Context, noCheckCsrf bool)
	// 从session获取值
	GetValue(c *gin.Context, key string) (v interface{}, exist bool)
	// 按字符串格式读取一个session值
	GetValueString(c *gin.Context, key string) string
	// 写入session
	SetValue(c *gin.Context, key string, v interface{})
	// 移除值
	DelValue(c *gin.Context, key string)
	// 清空session
	ClearSession(c *gin.Context)
}

type User

type User interface {
	GetID() string
	GetProvider() string
	GetRole() string
	GetToken() string
	GetExpired() int64
	SetToken(v string, expiredAt int64)
	GetMapData() map[string]string
}

Directories

Path Synopsis
provider
im
render

Jump to

Keyboard shortcuts

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