checkauthlogic.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package logic
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/golang-jwt/jwt/v4"
  6. "github.com/zeromicro/go-zero/core/logx"
  7. "google.golang.org/protobuf/types/known/structpb"
  8. "ylink/apis/auth/internal/svc"
  9. "ylink/apis/auth/pb"
  10. )
  11. type CheckAuthLogic struct {
  12. ctx context.Context
  13. svcCtx *svc.ServiceContext
  14. logx.Logger
  15. }
  16. func NewCheckAuthLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CheckAuthLogic {
  17. return &CheckAuthLogic{
  18. ctx: ctx,
  19. svcCtx: svcCtx,
  20. Logger: logx.WithContext(ctx),
  21. }
  22. }
  23. func (l *CheckAuthLogic) CheckAuth(in *pb.CheckAuthReq) (*pb.AuthResp, error) {
  24. // 解析传入的token
  25. // 第二个参数是一个回调函数,作用是判断生成token所用的签名算法是否和传入token的签名算法是否一致。
  26. // 算法匹配就返回密钥,用来解析token.
  27. token, err := jwt.Parse(in.AccessToken, func(token *jwt.Token) (i interface{}, err error) {
  28. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  29. return nil, errors.New("unexpected signing method")
  30. }
  31. return []byte(l.svcCtx.Config.JwtAuth.AccessSecret), nil
  32. })
  33. // err不为空,说明token已过期
  34. if err != nil {
  35. return nil, err
  36. }
  37. // 将获取的token中的Claims强转为MapClaims
  38. claims, ok := token.Claims.(jwt.MapClaims)
  39. // 判断token是否有效
  40. if !(ok && token.Valid) {
  41. return nil, errors.New("cannot convert claim to mapClaim")
  42. }
  43. iat := claims["iat"].(int64)
  44. exp := claims["exp"].(int64)
  45. if iat == exp {
  46. return nil, errors.New("access token is invalid")
  47. }
  48. data, err := structpb.NewStruct(map[string]interface{}{})
  49. if err != nil {
  50. return nil, err
  51. }
  52. return &pb.AuthResp{
  53. Code: 0,
  54. Msg: "success",
  55. Data: data,
  56. }, nil
  57. }