1 Star 0 Fork 0

kevin186 / keyauth

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
token.go 3.07 KB
一键复制 编辑 原始数据 按行查看 历史
kevin 提交于 2023-09-16 21:13 . add rpc/config.go
package impl
import (
"context"
"fmt"
"gitee.com/kevin186/keyauth/apps/token"
"gitee.com/kevin186/keyauth/apps/user"
"gitee.com/kevin186/keyauth/common/utils"
"time"
"github.com/infraboard/mcube/exception"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
var (
AUTH_ERROR = "user or password not correct"
)
var (
DefaultTokenDuration = 120 * time.Minute
)
func (i *impl) IssueToken(ctx context.Context, req *token.IssueTokenRequest) (*token.Token, error) {
if err := req.Validate(); err != nil {
return nil, exception.NewBadRequest("validate issue token error, %s", err)
}
// 根据不同授权模型来做不同的验证
switch req.GranteType {
case token.GranteType_PASSWORD:
// 1. 获取用户对象(User Object)
descReq := user.NewDescribeUserRequestByName(req.UserDomain, req.UserName)
u, err := i.user.DescribeUser(ctx, descReq)
if err != nil {
i.log.Debug("describe user error, %s", err)
if exception.IsNotFoundError(err) {
// 401
return nil, exception.NewUnauthorized(AUTH_ERROR)
}
return nil, err
}
// 2. 校验用户密码是否正确
i.log.Debug(u)
if ok := u.CheckPassword(req.Password); !ok {
// 401
return nil, exception.NewUnauthorized(AUTH_ERROR)
}
// 3. 颁发一个Token, 颁发<JWT> xxx Sign(url+ body) Sing-->Heander --> Hash
// 4. rfc: Bearer 字符串: Header: Authorization Header Value: bearer <access_token>
tk := token.NewToken(req, DefaultTokenDuration)
// 5. 脱敏
tk.Data.Password = ""
// 6. 入库持久化
if err := i.save(ctx, tk); err != nil {
return nil, err
}
return tk, nil
default:
return nil, fmt.Errorf("grant type %s not implemented", req.GranteType)
}
}
func (i *impl) RevolkToken(ctx context.Context, req *token.RevolkTokenRequest) (*token.Token, error) {
// 1. 获取AccessToken
tk, err := i.get(ctx, req.AccessToken)
if err != nil {
return nil, err
}
// 2. 检查RefreshToken是否匹配
if tk.RefreshToken != req.RefreshToken {
return nil, exception.NewBadRequest("refresh token not conrrect")
}
// 3. 删除
if err := i.delete(ctx, tk); err != nil {
return nil, err
}
return tk, nil
}
func (i *impl) ValidateToken(ctx context.Context, req *token.ValidateTokenRequest) (*token.Token, error) {
// 1. 获取AccessToken
tk, err := i.get(ctx, req.AccessToken)
if err != nil {
return nil, err
}
// 2. 校验Token合法性
if err := tk.Validate(); err != nil {
// 2.1 如果Aceess Token过期
if utils.IsAccessTokenExpiredError(err) {
if tk.IsRefreshTokenExpired() {
return nil, exception.NewRefreshTokenExpired("refresh token expired")
}
// 2.2 如果Refresh没过期, 可以其过期时间
// 类似于执行了一个Update, Update Exired 时间
tk.Extend(DefaultTokenDuration)
if err := i.update(ctx, tk); err != nil {
return nil, err
}
// 返回续约后的Token
return tk, nil
}
return nil, err
}
return tk, nil
}
func (i *impl) QueryToken(ctx context.Context, req *token.QueryTokenRequest) (*token.TokenSet, error) {
return nil, status.Errorf(codes.Unimplemented, "method QueryToken not implemented")
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/kevin186/keyauth.git
git@gitee.com:kevin186/keyauth.git
kevin186
keyauth
keyauth
v0.0.11

搜索帮助

344bd9b3 5694891 D2dac590 5694891