1. 开始使用

1.1 创建Manager实例

import "gopkg.in/oauth2.v3/manage"

manager := manage.NewManager()

1.1.1 Manager的配置参数

1.1.1.1 SetAuthorizeCodeExp 设置授权码过期时间(默认为10分钟)

manager.SetAuthorizeCodeExp(time.Minute * 10)

1.1.1.2 SetAuthorizeCodeTokenCfg 设置授权码模式令牌的配置参数


cfg := &manage.Config{
	// 访问令牌过期时间(默认为2小时)
	AccessTokenExp: time.Hour * 2,
	// 更新令牌过期时间(默认为72小时)
	RefreshTokenExp: time.Hour * 24 * 3,
	// 是否生成更新令牌(默认为true)
	IsGenerateRefresh: true,
}
manager.SetAuthorizeCodeTokenCfg(cfg)
        

1.1.1.3 SetImplicitTokenCfg 设置简化模式令牌的配置参数


cfg := &manage.Config{
    // 访问令牌过期时间(默认为1小时)
    AccessTokenExp: time.Hour * 1,
}
manager.SetAuthorizeCodeTokenCfg(cfg)
        

1.1.1.4 SetPasswordTokenCfg 设置密码模式令牌的配置参数


cfg := &manage.Config{
	// 访问令牌过期时间(默认为2小时)
	AccessTokenExp: time.Hour * 2,
	// 更新令牌过期时间(默认为7天)
	RefreshTokenExp: time.Hour * 24 * 7,
	// 是否生成更新令牌(默认为true)
	IsGenerateRefresh: true,
}
manager.SetPasswordTokenCfg(cfg)
        

1.1.1.5 SetClientTokenCfg 设置客户端模式令牌的配置参数


cfg := &manage.Config{
    // 访问令牌过期时间(默认为2小时)
    AccessTokenExp: time.Hour * 2,
}
manager.SetClientTokenCfg(cfg)
        

1.1.1.6 SetRefreshTokenCfg 设置更新令牌的配置参数


cfg := &manage.Config{
    // 是否重新生成更新令牌(默认为false)
    IsGenerateRefresh: false,
}
manager.SetRefreshTokenCfg(cfg)
        

1.1.2 Manager的接口映射

1.1.2.1 MapTokenModel 映射令牌模型接口

import "gopkg.in/oauth2.v3/models"

manager.MapTokenModel(models.NewToken())

1.1.2.2 MapAuthorizeGenerate 映射授权码生成接口

import "gopkg.in/oauth2.v3/generates"

manager.MapAuthorizeGenerate(generates.NewAuthorizeGenerate())

1.1.2.3 MapAccessGenerate 映射访问令牌生成接口

import "gopkg.in/oauth2.v3/generates"

manager.MapAccessGenerate(generates.NewAccessGenerate())

1.1.2.4 MustTokenStorage 强制映射访问令牌存储接口

import "gopkg.in/oauth2.v3/store"

manager.MustTokenStorage(store.NewMemoryTokenStore())

1.1.2.5 MapClientStorage 映射客户端信息存储接口

客户端信息的存储,需要根据具体的业务场景来确定,这里暂不提供具体实现

1.2 创建Server实例

import "gopkg.in/oauth2.v3/server"

srv := server.NewServer(server.NewConfig(), manager)

1.2.1 Server的配置参数

1.2.1.1 SetAllowedResponseType 设置允许的授权请求类型

支持的授权类型:Code(授权码),Token(授权令牌)

1.2.1.1 SetAllowedGrantType 设置允许的授权模式类型

支持的授权模式:AuthorizationCode(授权码模式),PasswordCredentials(密码模式),ClientCredentials(客户端模式),Refreshing(更新令牌)

1.2.2 Server的处理函数

1.2.2.1 SetClientInfoHandler 获取请求的客户端信息(默认支持:ClientFormHandler,ClientBasicHandler)

ClientInfoHandler func(r *http.Request) (clientID, clientSecret string, err error)

1.2.2.2 SetClientAuthorizedHandler 检查是否允许该客户端通过该授权模式请求令牌

ClientAuthorizedHandler func(clientID string, grant oauth2.GrantType) (allowed bool, err error)

1.2.2.3 SetClientScopeHandler 检查该客户端所申请的权限范围

ClientScopeHandler func(clientID, scope string) (allowed bool, err error)

1.2.2.4 SetUserAuthorizationHandler 获取请求的用户标识

UserAuthorizationHandler func(w http.ResponseWriter, r *http.Request) (userID string, err error)

1.2.2.5 SetPasswordAuthorizationHandler 根据请求的用户名和密码获取用户标识

PasswordAuthorizationHandler func(username, password string) (userID string, err error)

1.2.2.6 SetRefreshingScopeHandler 检查更新令牌时,更新的权限范围

RefreshingScopeHandler func(newScope, oldScope string) (allowed bool, err error)

1.2.2.7 SetResponseErrorHandler 响应错误处理(支持自定义URI及错误明细)

ResponseErrorHandler func(err error) (re *errors.Response)

1.2.2.8 SetInternalErrorHandler 内部错误处理

InternalErrorHandler func(err error)

1.2.2.9 SetExtensionFieldsHandler 自定义响应令牌的扩展字段

ExtensionFieldsHandler func(ti oauth2.TokenInfo) (fieldsValue map[string]interface{})

1.2.2.10 SetAccessTokenExpHandler 自定义访问令牌的过期时间

AccessTokenExpHandler func(w http.ResponseWriter, r *http.Request) (exp time.Duration, err error)

1.2.2.11 SetAuthorizeScopeHandler 自定义权限范围

AuthorizeScopeHandler func(w http.ResponseWriter, r *http.Request) (scope string, err error)

1.3 创建HTTP监听服务

1.3.1 授权请求处理


http.HandleFunc("/authorize", func(w http.ResponseWriter, r *http.Request) {
	err := srv.HandleAuthorizeRequest(w, r)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
	}
})
        

1.3.2 令牌请求处理


http.HandleFunc("/token", func(w http.ResponseWriter, r *http.Request) {
	err := srv.HandleTokenRequest(w, r)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
	}
})