playerauthlogic.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package logic
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/golang-jwt/jwt/v4"
  6. "google.golang.org/protobuf/types/known/structpb"
  7. "time"
  8. "ylink/ext/globalkey"
  9. "ylink/ext/jwtdata"
  10. "ylink/apis/auth/internal/svc"
  11. "ylink/apis/auth/pb"
  12. "github.com/zeromicro/go-zero/core/logx"
  13. )
  14. type PlayerAuthLogic struct {
  15. ctx context.Context
  16. svcCtx *svc.ServiceContext
  17. logx.Logger
  18. }
  19. func NewPlayerAuthLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PlayerAuthLogic {
  20. return &PlayerAuthLogic{
  21. ctx: ctx,
  22. svcCtx: svcCtx,
  23. Logger: logx.WithContext(ctx),
  24. }
  25. }
  26. func (l *PlayerAuthLogic) PlayerAuth(in *pb.PlayerAuthReq) (*pb.AuthResp, error) {
  27. var token string
  28. // 查询redis
  29. tokenKey := fmt.Sprintf(globalkey.CacheTokenKey, in.PlayerId)
  30. token, err := l.svcCtx.RedisClient.GetCtx(l.ctx, tokenKey)
  31. if err != nil {
  32. return nil, err
  33. }
  34. // 生成token
  35. if len(token) == 0 {
  36. now := time.Now().Unix()
  37. token, err = l.generatePlayerToken(now, in.PlayerId, in.GameId)
  38. if err != nil {
  39. return nil, err
  40. }
  41. }
  42. data, err := structpb.NewStruct(map[string]interface{}{
  43. "token": token,
  44. })
  45. if err != nil {
  46. return nil, err
  47. }
  48. // 存入redis
  49. if err := l.svcCtx.RedisClient.SetexCtx(l.ctx, tokenKey, token, int(l.svcCtx.Config.JwtAuth.AccessExpire)); err != nil {
  50. return nil, err
  51. }
  52. return &pb.AuthResp{
  53. Code: 0,
  54. Msg: "success",
  55. Data: data,
  56. }, nil
  57. }
  58. //
  59. // generatePlayerToken
  60. // @Description: 玩家token签发
  61. // @receiver l
  62. // @param iat
  63. // @param playerId
  64. // @param gameId
  65. // @return string
  66. // @return error
  67. //
  68. func (l *PlayerAuthLogic) generatePlayerToken(iat int64, playerId string, gameId string) (string, error) {
  69. secret := l.svcCtx.Config.JwtAuth.AccessSecret
  70. expire := l.svcCtx.Config.JwtAuth.AccessExpire
  71. claims := make(jwt.MapClaims)
  72. claims["iat"] = iat
  73. claims["exp"] = iat + expire
  74. claims[jwtdata.JwtKeyPlayerId] = playerId
  75. claims[jwtdata.JwtKeyGameId] = gameId
  76. token := jwt.New(jwt.SigningMethodHS256)
  77. token.Claims = claims
  78. return token.SignedString([]byte(secret))
  79. }