| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- package services
- import (
- "errors"
- "fmt"
- "fwh-toolbox-server/domain"
- "fwh-toolbox-server/dto"
- "fwh-toolbox-server/repositories"
- "fwh-toolbox-server/utils/casdoor"
- "time"
- "github.com/google/uuid"
- "go.uber.org/zap"
- )
- // 请求登录
- func Login(param dto.LoginParam) (*domain.AuthInfo, error) {
- auth, err := casdoor.Signin(param.Code, param.State)
- if err != nil {
- return nil, err
- }
- // 生成 sid 并存 Redis(只存 refresh_token,access_token 可以缓存)
- sid := uuid.NewString()
- if err := repositories.StoreSession(sid, auth); err != nil {
- return nil, fmt.Errorf("store session err: %w", err)
- }
- return &domain.AuthInfo{
- SessionId: sid,
- AccessToken: auth.AccessToken,
- RefreshToken: auth.RefreshToken,
- }, nil
- }
- // 恢复会话 - 返回AccessToken
- func GetSession(sid string) (string, error) {
- sess, err := repositories.GetSession(sid)
- if err != nil {
- return "", errors.New("session not found")
- }
- at := sess.AccessToken
- if !isExpired(at) {
- // 证书过期
- rt := sess.RefreshToken
- if !isExpired(rt) {
- // 刷新证书过期,返回空证书
- return "", nil
- }
- // 刷新证书
- at, err = RefreshToken(sid)
- if err != nil {
- return "", err
- }
- }
- return at, nil
- }
- // 刷新Token - 返回AccessToken
- func RefreshToken(sid string) (string, error) {
- sess, err := repositories.GetSession(sid)
- if err != nil {
- return "", errors.New("session not found")
- }
- rt := sess.RefreshToken
- if rt == "" {
- return "", errors.New("no refresh token")
- }
- auth, err := casdoor.RefreshToken(rt)
- if err != nil {
- return "", err
- }
- if err := repositories.StoreSession(sid, auth); err != nil {
- return "", fmt.Errorf("store session err: %w", err)
- }
- return auth.AccessToken, nil
- }
- // 请求登出
- func Logout(sid string) error {
- if sid != "" {
- return repositories.DeleteSession(sid)
- }
- return nil
- }
- // 检查证书是否过期
- // true - 未过期
- // false - 过期
- func isExpired(token string) bool {
- claims, err := casdoor.ParseJwtToken(token)
- if err != nil {
- zap.L().Error("ParseJwtToken() error", zap.String("err", err.Error()))
- return false
- }
- if claims.ExpiresAt == nil {
- return false // 没有设置过期时间
- }
- return claims.ExpiresAt.Time.Before(time.Now())
- }
|