Commit 563acaf72e78686be3aeac31069439365896a141
1 parent
f7f4beb5
在拦截器中认证jwt
Showing
9 changed files
with
85 additions
and
118 deletions
Show diff stats
actions/accountaction.go
| @@ -9,40 +9,33 @@ import ( | @@ -9,40 +9,33 @@ import ( | ||
| 9 | "pro2d/utils" | 9 | "pro2d/utils" |
| 10 | ) | 10 | ) |
| 11 | 11 | ||
| 12 | -func (s *AccountServer) RegisterHandler(ctx context.Context, in *pb.Register) (*pb.PubRsp, error) { | 12 | +func (s *LoginServer) RegisterHandler(ctx context.Context, in *pb.Register) (*pb.RegisterRsp, error) { |
| 13 | ok, account := models.AccountExistByPhone(in.Phone) | 13 | ok, account := models.AccountExistByPhone(in.Phone) |
| 14 | if !ok { | 14 | if !ok { |
| 15 | account.Phone = in.Phone | 15 | account.Phone = in.Phone |
| 16 | account.Password = utils.Md5V(in.Password) | 16 | account.Password = utils.Md5V(in.Password) |
| 17 | account.Uid = conf.SnowFlack.NextValStr() | 17 | account.Uid = conf.SnowFlack.NextValStr() |
| 18 | - account.Device = "123123" | ||
| 19 | account.Create() | 18 | account.Create() |
| 20 | }else { | 19 | }else { |
| 21 | return nil, fmt.Errorf("1") | 20 | return nil, fmt.Errorf("1") |
| 22 | } | 21 | } |
| 23 | 22 | ||
| 24 | - return &pb.PubRsp{ | 23 | + return &pb.RegisterRsp{ |
| 25 | Code: 0, | 24 | Code: 0, |
| 26 | }, nil | 25 | }, nil |
| 27 | } | 26 | } |
| 28 | 27 | ||
| 29 | -func (s *AccountServer) CreateTokenHandler(ctx context.Context, in *pb.AccountInfo) (*pb.CreateTokenRsp, error) { | 28 | +func (s *LoginServer) CreateTokenHandler(ctx context.Context, in *pb.Account) (*pb.CreateTokenRsp, error) { |
| 30 | m := models.NewAccount(in.Phone) | 29 | m := models.NewAccount(in.Phone) |
| 31 | if err := m.Load(); err != nil { | 30 | if err := m.Load(); err != nil { |
| 32 | return &pb.CreateTokenRsp{ | 31 | return &pb.CreateTokenRsp{ |
| 33 | - Rsp: &pb.PubRsp{ | ||
| 34 | - Code: 1, | ||
| 35 | - Msg: err.Error(), | ||
| 36 | - }, | 32 | + Code: 1, |
| 37 | }, nil | 33 | }, nil |
| 38 | } | 34 | } |
| 39 | 35 | ||
| 40 | if m.Password != utils.Md5V(in.Password) { | 36 | if m.Password != utils.Md5V(in.Password) { |
| 41 | return &pb.CreateTokenRsp{ | 37 | return &pb.CreateTokenRsp{ |
| 42 | - Rsp: &pb.PubRsp{ | ||
| 43 | - Code: 2, | ||
| 44 | - Msg: "password error", | ||
| 45 | - }, | 38 | + Code: 2, |
| 46 | }, nil | 39 | }, nil |
| 47 | } | 40 | } |
| 48 | 41 | ||
| @@ -57,10 +50,9 @@ func (s *AccountServer) CreateTokenHandler(ctx context.Context, in *pb.AccountIn | @@ -57,10 +50,9 @@ func (s *AccountServer) CreateTokenHandler(ctx context.Context, in *pb.AccountIn | ||
| 57 | } | 50 | } |
| 58 | 51 | ||
| 59 | return &pb.CreateTokenRsp{ | 52 | return &pb.CreateTokenRsp{ |
| 60 | - Rsp: &pb.PubRsp{ | ||
| 61 | - Code: 0, | ||
| 62 | - }, | ||
| 63 | - Token: utils.CreateToken(m.AccountInfo), | 53 | + Code: 0, |
| 54 | + Uid: m.Uid, | ||
| 55 | + Token: utils.CreateToken(m.Account), | ||
| 64 | GameService: gameInfo, | 56 | GameService: gameInfo, |
| 65 | }, nil | 57 | }, nil |
| 66 | } | 58 | } |
actions/roleaction.go
| @@ -3,85 +3,50 @@ package actions | @@ -3,85 +3,50 @@ package actions | ||
| 3 | import ( | 3 | import ( |
| 4 | "context" | 4 | "context" |
| 5 | "errors" | 5 | "errors" |
| 6 | - "fmt" | ||
| 7 | "google.golang.org/grpc/metadata" | 6 | "google.golang.org/grpc/metadata" |
| 7 | + "google.golang.org/protobuf/types/known/emptypb" | ||
| 8 | "pro2d/conf" | 8 | "pro2d/conf" |
| 9 | "pro2d/models" | 9 | "pro2d/models" |
| 10 | "pro2d/protos/pb" | 10 | "pro2d/protos/pb" |
| 11 | "pro2d/utils" | 11 | "pro2d/utils" |
| 12 | ) | 12 | ) |
| 13 | 13 | ||
| 14 | -func (s *GameServer) HeartBeatHandler(ctx context.Context, in *pb.Token) (*pb.PubRsp, error) { | 14 | +func (s *GameServer) HeartBeatHandler(ctx context.Context, empty *emptypb.Empty) (*pb.HeartRsp, error) { |
| 15 | utils.Sugar.Debugf("HeartBeatHandler被调用!!!") | 15 | utils.Sugar.Debugf("HeartBeatHandler被调用!!!") |
| 16 | //获取元数据信息 | 16 | //获取元数据信息 |
| 17 | - md,ok := metadata.FromIncomingContext(ctx) | 17 | + _,ok := metadata.FromIncomingContext(ctx) |
| 18 | if !ok { | 18 | if !ok { |
| 19 | return nil,errors.New("未传输token") | 19 | return nil,errors.New("未传输token") |
| 20 | } | 20 | } |
| 21 | - var ( | ||
| 22 | - appId string | ||
| 23 | - appKey string | ||
| 24 | - ) | ||
| 25 | - if val, ok := md["appId"]; ok { | ||
| 26 | - appId = val[0] | ||
| 27 | - } | ||
| 28 | - if val, ok := md["appKey"]; ok { | ||
| 29 | - appKey = val[0] | ||
| 30 | - } | ||
| 31 | - //进行校验的信息是否正确 | ||
| 32 | - if appId != "123" || appKey != "456" { | ||
| 33 | - return nil, errors.New("token传输不正确") | ||
| 34 | - } | ||
| 35 | 21 | ||
| 36 | - return &pb.PubRsp{ | 22 | + return &pb.HeartRsp{ |
| 37 | Code: 0, | 23 | Code: 0, |
| 38 | - Msg: "heart beat successful", | ||
| 39 | }, nil | 24 | }, nil |
| 40 | } | 25 | } |
| 41 | 26 | ||
| 42 | -func (s *GameServer) CreateRoleHandler(ctx context.Context, in *pb.Token) (*pb.RoleRsp, error) { | ||
| 43 | - account := utils.ParseToken(in.Token) | ||
| 44 | - if account == nil { | ||
| 45 | - return nil, fmt.Errorf("1") | ||
| 46 | - } | ||
| 47 | - ok, role := models.RoleExistByUid(account.Uid) | 27 | +func (s *GameServer) CreateRoleHandler(ctx context.Context, in *pb.LoginReq) (*pb.RoleRsp, error) { |
| 28 | + ok, role := models.RoleExistByUid(in.Uid) | ||
| 48 | if !ok { | 29 | if !ok { |
| 49 | role = models.NewRole(conf.SnowFlack.NextVal()) | 30 | role = models.NewRole(conf.SnowFlack.NextVal()) |
| 50 | - role.Role.Device = account.Device | ||
| 51 | - role.Role.Uid = account.Uid | 31 | + role.Role.Device = in.Device |
| 32 | + role.Role.Uid = in.Uid | ||
| 52 | role.Create() | 33 | role.Create() |
| 53 | - | ||
| 54 | } | 34 | } |
| 55 | return &pb.RoleRsp{ | 35 | return &pb.RoleRsp{ |
| 56 | - Rsp: &pb.PubRsp{ | ||
| 57 | - Code: 0, | ||
| 58 | - Msg: "successful", | ||
| 59 | - }, | 36 | + Code: 0, |
| 60 | Role: role.Role, | 37 | Role: role.Role, |
| 61 | }, nil | 38 | }, nil |
| 62 | } | 39 | } |
| 63 | 40 | ||
| 64 | -func (s *GameServer) LoginHandler(ctx context.Context, in *pb.Token) (*pb.RoleRsp, error) { | ||
| 65 | - account := utils.ParseToken(in.Token) | ||
| 66 | - if account == nil { | ||
| 67 | - return nil, fmt.Errorf("token is error") | ||
| 68 | - } | ||
| 69 | - utils.Sugar.Debugf("login account: %v", account) | ||
| 70 | - ok, role := models.RoleExistByUid(account.Uid) | 41 | +func (s *GameServer) LoginHandler(ctx context.Context, in *pb.LoginReq) (*pb.RoleRsp, error) { |
| 42 | + ok, role := models.RoleExistByUid(in.Uid) | ||
| 71 | if !ok { | 43 | if !ok { |
| 72 | return &pb.RoleRsp{ | 44 | return &pb.RoleRsp{ |
| 73 | - Rsp: &pb.PubRsp{ | ||
| 74 | - Code: 1, | ||
| 75 | - Msg: "role not exist", | ||
| 76 | - }, | ||
| 77 | - | 45 | + Code: 1, |
| 78 | }, nil | 46 | }, nil |
| 79 | } | 47 | } |
| 80 | return &pb.RoleRsp{ | 48 | return &pb.RoleRsp{ |
| 81 | - Rsp: &pb.PubRsp{ | ||
| 82 | - Code: 0, | ||
| 83 | - Msg: "successful", | ||
| 84 | - }, | 49 | + Code: 0, |
| 85 | Role: role.Role, | 50 | Role: role.Role, |
| 86 | Hero: models.GetHeros(role.Heros), | 51 | Hero: models.GetHeros(role.Heros), |
| 87 | }, nil | 52 | }, nil |
actions/server.go
| @@ -2,6 +2,7 @@ package actions | @@ -2,6 +2,7 @@ package actions | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "context" | 4 | "context" |
| 5 | + "fmt" | ||
| 5 | "google.golang.org/grpc" | 6 | "google.golang.org/grpc" |
| 6 | "google.golang.org/grpc/reflection" | 7 | "google.golang.org/grpc/reflection" |
| 7 | "pro2d/conf" | 8 | "pro2d/conf" |
| @@ -10,13 +11,13 @@ import ( | @@ -10,13 +11,13 @@ import ( | ||
| 10 | "pro2d/utils" | 11 | "pro2d/utils" |
| 11 | ) | 12 | ) |
| 12 | 13 | ||
| 13 | -type AccountServer struct{ | ||
| 14 | - pb.UnimplementedAccountServer | 14 | +type LoginServer struct{ |
| 15 | + pb.UnsafeLoginServer | ||
| 15 | *BasicServer | 16 | *BasicServer |
| 16 | } | 17 | } |
| 17 | 18 | ||
| 18 | -func NewAccountServer() *AccountServer { | ||
| 19 | - return &AccountServer{ | 19 | +func NewAccountServer() *LoginServer { |
| 20 | + return &LoginServer{ | ||
| 20 | BasicServer: NewServer(), | 21 | BasicServer: NewServer(), |
| 21 | } | 22 | } |
| 22 | } | 23 | } |
| @@ -30,7 +31,7 @@ func AccountServerInterceptor(ctx context.Context, req interface{}, info *grpc.U | @@ -30,7 +31,7 @@ func AccountServerInterceptor(ctx context.Context, req interface{}, info *grpc.U | ||
| 30 | return resp, err | 31 | return resp, err |
| 31 | } | 32 | } |
| 32 | 33 | ||
| 33 | -func (s *AccountServer)Start() error { | 34 | +func (s *LoginServer)Start() error { |
| 34 | lis, err := s.BasicServer.Start(conf.GlobalConf.AccountConf) | 35 | lis, err := s.BasicServer.Start(conf.GlobalConf.AccountConf) |
| 35 | if err != nil { | 36 | if err != nil { |
| 36 | return err | 37 | return err |
| @@ -41,17 +42,17 @@ func (s *AccountServer)Start() error { | @@ -41,17 +42,17 @@ func (s *AccountServer)Start() error { | ||
| 41 | //new一个grpc | 42 | //new一个grpc |
| 42 | s.GrpcServer = grpc.NewServer(grpc.UnaryInterceptor(AccountServerInterceptor)) | 43 | s.GrpcServer = grpc.NewServer(grpc.UnaryInterceptor(AccountServerInterceptor)) |
| 43 | 44 | ||
| 44 | - pb.RegisterAccountServer(s.GrpcServer, s) | 45 | + pb.RegisterLoginServer(s.GrpcServer, s) |
| 45 | reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务 | 46 | reflection.Register(s.GrpcServer) //在给定的gRPC服务器上注册服务器反射服务 |
| 46 | 47 | ||
| 47 | // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。 | 48 | // Serve方法在lis上接受传入连接,为每个连接创建一个ServerTransport和server的goroutine。 |
| 48 | // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。 | 49 | // 该goroutine读取gRPC请求,然后调用已注册的处理程序来响应它们。 |
| 49 | - utils.Sugar.Debugf("Start AccountServer listening on %d", conf.GlobalConf.AccountConf.Port) | 50 | + utils.Sugar.Debugf("Start LoginServer listening on %d", conf.GlobalConf.AccountConf.Port) |
| 50 | 51 | ||
| 51 | return s.GrpcServer.Serve(lis) | 52 | return s.GrpcServer.Serve(lis) |
| 52 | } | 53 | } |
| 53 | 54 | ||
| 54 | -func (s *AccountServer)Stop() { | 55 | +func (s *LoginServer)Stop() { |
| 55 | s.BasicServer.Stop() | 56 | s.BasicServer.Stop() |
| 56 | } | 57 | } |
| 57 | 58 | ||
| @@ -69,7 +70,12 @@ func NewGameServer() *GameServer { | @@ -69,7 +70,12 @@ func NewGameServer() *GameServer { | ||
| 69 | func GameServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, | 70 | func GameServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, |
| 70 | handler grpc.UnaryHandler) (interface{}, error) { | 71 | handler grpc.UnaryHandler) (interface{}, error) { |
| 71 | 72 | ||
| 72 | - utils.Sugar.Debugf("gRPC method: %s, %v", info.FullMethod, req) | 73 | + //utils.Sugar.Debugf("gRPC method: %s, %v", info.FullMethod, req) |
| 74 | + acc := utils.CheckAuth(ctx) | ||
| 75 | + if acc == nil { | ||
| 76 | + return nil, fmt.Errorf("token error") | ||
| 77 | + } | ||
| 78 | + | ||
| 73 | resp, err := handler(ctx, req) | 79 | resp, err := handler(ctx, req) |
| 74 | return resp, err | 80 | return resp, err |
| 75 | } | 81 | } |
| @@ -5,6 +5,7 @@ go 1.17 | @@ -5,6 +5,7 @@ go 1.17 | ||
| 5 | require ( | 5 | require ( |
| 6 | github.com/dgrijalva/jwt-go v3.2.0+incompatible | 6 | github.com/dgrijalva/jwt-go v3.2.0+incompatible |
| 7 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b | 7 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b |
| 8 | + go.etcd.io/etcd/api/v3 v3.5.2 | ||
| 8 | go.etcd.io/etcd/client/v3 v3.5.2 | 9 | go.etcd.io/etcd/client/v3 v3.5.2 |
| 9 | go.mongodb.org/mongo-driver v1.8.3 | 10 | go.mongodb.org/mongo-driver v1.8.3 |
| 10 | go.uber.org/zap v1.17.0 | 11 | go.uber.org/zap v1.17.0 |
| @@ -27,7 +28,6 @@ require ( | @@ -27,7 +28,6 @@ require ( | ||
| 27 | github.com/xdg-go/scram v1.0.2 // indirect | 28 | github.com/xdg-go/scram v1.0.2 // indirect |
| 28 | github.com/xdg-go/stringprep v1.0.2 // indirect | 29 | github.com/xdg-go/stringprep v1.0.2 // indirect |
| 29 | github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect | 30 | github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect |
| 30 | - go.etcd.io/etcd/api/v3 v3.5.2 // indirect | ||
| 31 | go.etcd.io/etcd/client/pkg/v3 v3.5.2 // indirect | 31 | go.etcd.io/etcd/client/pkg/v3 v3.5.2 // indirect |
| 32 | go.uber.org/atomic v1.7.0 // indirect | 32 | go.uber.org/atomic v1.7.0 // indirect |
| 33 | go.uber.org/multierr v1.6.0 // indirect | 33 | go.uber.org/multierr v1.6.0 // indirect |
models/account.go
| @@ -7,7 +7,7 @@ import ( | @@ -7,7 +7,7 @@ import ( | ||
| 7 | 7 | ||
| 8 | type AccountModel struct { | 8 | type AccountModel struct { |
| 9 | *db.MgoColl | 9 | *db.MgoColl |
| 10 | - *pb.AccountInfo | 10 | + *pb.Account |
| 11 | } | 11 | } |
| 12 | 12 | ||
| 13 | func AccountExistByPhone(phone string) (bool, *AccountModel){ | 13 | func AccountExistByPhone(phone string) (bool, *AccountModel){ |
| @@ -19,12 +19,12 @@ func AccountExistByPhone(phone string) (bool, *AccountModel){ | @@ -19,12 +19,12 @@ func AccountExistByPhone(phone string) (bool, *AccountModel){ | ||
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | func NewAccount(phone string) *AccountModel { | 21 | func NewAccount(phone string) *AccountModel { |
| 22 | - ac := &pb.AccountInfo{ | 22 | + ac := &pb.Account{ |
| 23 | Phone: phone, | 23 | Phone: phone, |
| 24 | } | 24 | } |
| 25 | account := &AccountModel{ | 25 | account := &AccountModel{ |
| 26 | MgoColl: db.NewMongoColl(phone, ac), | 26 | MgoColl: db.NewMongoColl(phone, ac), |
| 27 | - AccountInfo: ac, | 27 | + Account: ac, |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | return account | 30 | return account |
models/init.go
| @@ -24,7 +24,7 @@ func InitDoc(schema ...interface{}) { | @@ -24,7 +24,7 @@ func InitDoc(schema ...interface{}) { | ||
| 24 | 24 | ||
| 25 | func InitAccountServerModels() { | 25 | func InitAccountServerModels() { |
| 26 | var schema []interface{} = []interface{}{ | 26 | var schema []interface{} = []interface{}{ |
| 27 | - pb.AccountInfo{}, | 27 | + pb.Account{}, |
| 28 | } | 28 | } |
| 29 | InitDoc(schema...) | 29 | InitDoc(schema...) |
| 30 | } | 30 | } |
test/client.go
| @@ -9,7 +9,7 @@ import ( | @@ -9,7 +9,7 @@ import ( | ||
| 9 | "pro2d/utils" | 9 | "pro2d/utils" |
| 10 | ) | 10 | ) |
| 11 | 11 | ||
| 12 | -func Register(c pb.AccountClient, phone, password string) error { | 12 | +func Register(c pb.LoginClient, phone, password string) error { |
| 13 | r, err := c.RegisterHandler(context.Background(), &pb.Register{ | 13 | r, err := c.RegisterHandler(context.Background(), &pb.Register{ |
| 14 | Phone: "17683852936", | 14 | Phone: "17683852936", |
| 15 | Password: "123456", | 15 | Password: "123456", |
| @@ -20,14 +20,17 @@ func Register(c pb.AccountClient, phone, password string) error { | @@ -20,14 +20,17 @@ func Register(c pb.AccountClient, phone, password string) error { | ||
| 20 | return err | 20 | return err |
| 21 | } | 21 | } |
| 22 | if r.Code != 0 { | 22 | if r.Code != 0 { |
| 23 | - return fmt.Errorf("%s", r.Msg) | 23 | + return fmt.Errorf("register fail") |
| 24 | } | 24 | } |
| 25 | utils.Sugar.Debug("register success") | 25 | utils.Sugar.Debug("register success") |
| 26 | return nil | 26 | return nil |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | -func Login(loginUri, token string) { | ||
| 30 | - gameConn, err := grpc.Dial(loginUri, grpc.WithInsecure() ) | 29 | +func Login(loginUri, token, uid string) { |
| 30 | + var opts []grpc.DialOption | ||
| 31 | + // 指定自定义认证 | ||
| 32 | + opts = append(opts, grpc.WithPerRPCCredentials(&utils.AuthToken{Token: token}), grpc.WithInsecure()) | ||
| 33 | + gameConn, err := grpc.Dial(loginUri, opts...) | ||
| 31 | if err != nil { | 34 | if err != nil { |
| 32 | utils.Sugar.Errorf("game conn err: %v", err) | 35 | utils.Sugar.Errorf("game conn err: %v", err) |
| 33 | return | 36 | return |
| @@ -36,8 +39,9 @@ func Login(loginUri, token string) { | @@ -36,8 +39,9 @@ func Login(loginUri, token string) { | ||
| 36 | 39 | ||
| 37 | client:= pb.NewGameClient(gameConn) | 40 | client:= pb.NewGameClient(gameConn) |
| 38 | var role *pb.Role | 41 | var role *pb.Role |
| 39 | - loginRsp, err := client.LoginHandler(context.Background(), &pb.Token{ | ||
| 40 | - Token: token, | 42 | + loginRsp, err := client.LoginHandler(context.Background(), &pb.LoginReq{ |
| 43 | + Uid: uid, | ||
| 44 | + Device: "111111", | ||
| 41 | }) | 45 | }) |
| 42 | 46 | ||
| 43 | if err != nil { | 47 | if err != nil { |
| @@ -46,14 +50,14 @@ func Login(loginUri, token string) { | @@ -46,14 +50,14 @@ func Login(loginUri, token string) { | ||
| 46 | } | 50 | } |
| 47 | role = loginRsp.Role | 51 | role = loginRsp.Role |
| 48 | 52 | ||
| 49 | - if loginRsp.Rsp.Code != 0 { | ||
| 50 | - utils.Sugar.Debugf("login rsp: %v", loginRsp.Rsp.Msg) | ||
| 51 | - createRole, err := client.CreateRoleHandler(context.Background(), &pb.Token{Token: token}) | 53 | + if loginRsp.Code != 0 { |
| 54 | + utils.Sugar.Debugf("login fail, role not exist") | ||
| 55 | + createRole, err := client.CreateRoleHandler(context.Background(), &pb.LoginReq{Uid: uid, Device: "11111"}) | ||
| 52 | if err != nil { | 56 | if err != nil { |
| 53 | utils.Sugar.Errorf("create role err: %v", err) | 57 | utils.Sugar.Errorf("create role err: %v", err) |
| 54 | return | 58 | return |
| 55 | } | 59 | } |
| 56 | - utils.Sugar.Debug("create role rsp: ", createRole.Rsp.Code, createRole.Rsp.Msg) | 60 | + utils.Sugar.Debug("create role rsp: ", createRole.Code) |
| 57 | role = createRole.Role | 61 | role = createRole.Role |
| 58 | } | 62 | } |
| 59 | 63 | ||
| @@ -67,13 +71,13 @@ func main() { | @@ -67,13 +71,13 @@ func main() { | ||
| 67 | return | 71 | return |
| 68 | } | 72 | } |
| 69 | defer conn.Close() | 73 | defer conn.Close() |
| 70 | - c := pb.NewAccountClient(conn) | ||
| 71 | - //err = Register(c,"17683852936", "123456") | 74 | + c := pb.NewLoginClient(conn) |
| 75 | + err = Register(c,"17683852936", "123456") | ||
| 72 | //if err != nil { | 76 | //if err != nil { |
| 73 | // utils.Sugar.Errorf("register err: %v", err) | 77 | // utils.Sugar.Errorf("register err: %v", err) |
| 74 | // return | 78 | // return |
| 75 | //} | 79 | //} |
| 76 | - rsp, err := c.CreateTokenHandler(context.Background(), &pb.AccountInfo{ | 80 | + rsp, err := c.CreateTokenHandler(context.Background(), &pb.Account{ |
| 77 | Phone: "17683852936", | 81 | Phone: "17683852936", |
| 78 | Password: "123456", | 82 | Password: "123456", |
| 79 | }) | 83 | }) |
| @@ -83,12 +87,12 @@ func main() { | @@ -83,12 +87,12 @@ func main() { | ||
| 83 | return | 87 | return |
| 84 | } | 88 | } |
| 85 | 89 | ||
| 86 | - if rsp.Rsp.Code != 0 { | ||
| 87 | - utils.Sugar.Errorf("createtoken err: %v", rsp.Rsp.Msg) | 90 | + if rsp.Code != 0 { |
| 91 | + utils.Sugar.Errorf("createtoken err" ) | ||
| 88 | return | 92 | return |
| 89 | } | 93 | } |
| 90 | 94 | ||
| 91 | if len(rsp.GameService) >0 { | 95 | if len(rsp.GameService) >0 { |
| 92 | - Login(rsp.GameService[0].Address, rsp.Token) | 96 | + Login(rsp.GameService[0].Address, rsp.Token, rsp.Uid) |
| 93 | } | 97 | } |
| 94 | } | 98 | } |
utils/jwt.go
| @@ -10,7 +10,7 @@ import ( | @@ -10,7 +10,7 @@ import ( | ||
| 10 | "google.golang.org/grpc/metadata" | 10 | "google.golang.org/grpc/metadata" |
| 11 | ) | 11 | ) |
| 12 | 12 | ||
| 13 | -func CreateToken(account *pb.AccountInfo) (tokenString string) { | 13 | +func CreateToken(account *pb.Account) (tokenString string) { |
| 14 | token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ | 14 | token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ |
| 15 | "iss": "pro2d-app-server", | 15 | "iss": "pro2d-app-server", |
| 16 | "aud": "pro2d-app-server", | 16 | "aud": "pro2d-app-server", |
| @@ -19,7 +19,6 @@ func CreateToken(account *pb.AccountInfo) (tokenString string) { | @@ -19,7 +19,6 @@ func CreateToken(account *pb.AccountInfo) (tokenString string) { | ||
| 19 | "sub": "pro2d", | 19 | "sub": "pro2d", |
| 20 | "phone": account.Phone, | 20 | "phone": account.Phone, |
| 21 | "uid": account.Uid, | 21 | "uid": account.Uid, |
| 22 | - "device": account.Device, | ||
| 23 | }) | 22 | }) |
| 24 | tokenString, err := token.SignedString([]byte(Pro2DTokenSignedString)) | 23 | tokenString, err := token.SignedString([]byte(Pro2DTokenSignedString)) |
| 25 | if err != nil { | 24 | if err != nil { |
| @@ -28,7 +27,7 @@ func CreateToken(account *pb.AccountInfo) (tokenString string) { | @@ -28,7 +27,7 @@ func CreateToken(account *pb.AccountInfo) (tokenString string) { | ||
| 28 | return tokenString | 27 | return tokenString |
| 29 | } | 28 | } |
| 30 | 29 | ||
| 31 | -func ParseToken(tokenStr string)*pb.AccountInfo { | 30 | +func ParseToken(tokenStr string)*pb.Account{ |
| 32 | var clientClaims Claims | 31 | var clientClaims Claims |
| 33 | token, err := jwt.ParseWithClaims(tokenStr, &clientClaims, func(token *jwt.Token) (interface{}, error) { | 32 | token, err := jwt.ParseWithClaims(tokenStr, &clientClaims, func(token *jwt.Token) (interface{}, error) { |
| 34 | if token.Header["alg"] != "HS256" { | 33 | if token.Header["alg"] != "HS256" { |
| @@ -47,23 +46,9 @@ func ParseToken(tokenStr string)*pb.AccountInfo { | @@ -47,23 +46,9 @@ func ParseToken(tokenStr string)*pb.AccountInfo { | ||
| 47 | Sugar.Error("ErrInvalidToken") | 46 | Sugar.Error("ErrInvalidToken") |
| 48 | return nil | 47 | return nil |
| 49 | } | 48 | } |
| 50 | - return &clientClaims.AccountInfo | 49 | + return &clientClaims.Account |
| 51 | } | 50 | } |
| 52 | 51 | ||
| 53 | -// AuthToken 自定义认证 | ||
| 54 | -type AuthToken struct { | ||
| 55 | - Token string | ||
| 56 | -} | ||
| 57 | - | ||
| 58 | -func (c AuthToken) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { | ||
| 59 | - return map[string]string{ | ||
| 60 | - "authorization": c.Token, | ||
| 61 | - }, nil | ||
| 62 | -} | ||
| 63 | - | ||
| 64 | -func (c AuthToken) RequireTransportSecurity() bool { | ||
| 65 | - return false | ||
| 66 | -} | ||
| 67 | 52 | ||
| 68 | // Claims defines the struct containing the token claims. | 53 | // Claims defines the struct containing the token claims. |
| 69 | type Claims struct { | 54 | type Claims struct { |
| @@ -71,7 +56,7 @@ type Claims struct { | @@ -71,7 +56,7 @@ type Claims struct { | ||
| 71 | //phone string `json:"phone"` | 56 | //phone string `json:"phone"` |
| 72 | //uid int64 `json:"uid"` | 57 | //uid int64 `json:"uid"` |
| 73 | //device string `json:"device"` | 58 | //device string `json:"device"` |
| 74 | - pb.AccountInfo | 59 | + pb.Account |
| 75 | } | 60 | } |
| 76 | 61 | ||
| 77 | // 从 context 的 metadata 中,取出 token | 62 | // 从 context 的 metadata 中,取出 token |
| @@ -89,10 +74,26 @@ func getTokenFromContext(ctx context.Context) (string, error) { | @@ -89,10 +74,26 @@ func getTokenFromContext(ctx context.Context) (string, error) { | ||
| 89 | return token[0], nil | 74 | return token[0], nil |
| 90 | } | 75 | } |
| 91 | 76 | ||
| 92 | -func CheckAuth(ctx context.Context) *pb.AccountInfo { | 77 | +func CheckAuth(ctx context.Context) *pb.Account{ |
| 93 | tokenStr, err := getTokenFromContext(ctx) | 78 | tokenStr, err := getTokenFromContext(ctx) |
| 94 | if err != nil { | 79 | if err != nil { |
| 95 | - panic("get token from context error") | 80 | + Sugar.Errorf("get token from context error") |
| 81 | + return nil | ||
| 96 | } | 82 | } |
| 97 | return ParseToken(tokenStr) | 83 | return ParseToken(tokenStr) |
| 84 | +} | ||
| 85 | + | ||
| 86 | +// AuthToken 自定义认证 客户端使用 | ||
| 87 | +type AuthToken struct { | ||
| 88 | + Token string | ||
| 89 | +} | ||
| 90 | + | ||
| 91 | +func (c AuthToken) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { | ||
| 92 | + return map[string]string{ | ||
| 93 | + "authorization": c.Token, | ||
| 94 | + }, nil | ||
| 95 | +} | ||
| 96 | + | ||
| 97 | +func (c AuthToken) RequireTransportSecurity() bool { | ||
| 98 | + return false | ||
| 98 | } | 99 | } |
| 99 | \ No newline at end of file | 100 | \ No newline at end of file |
utils/jwt_test.go
| @@ -7,11 +7,10 @@ import ( | @@ -7,11 +7,10 @@ import ( | ||
| 7 | ) | 7 | ) |
| 8 | 8 | ||
| 9 | func TestCreateToken(t *testing.T) { | 9 | func TestCreateToken(t *testing.T) { |
| 10 | - account := &pb.AccountInfo{ | 10 | + account := &pb.Account{ |
| 11 | Phone: "17683852936", | 11 | Phone: "17683852936", |
| 12 | Password: "123456", | 12 | Password: "123456", |
| 13 | - Uid: 12312, | ||
| 14 | - Device: "12312312", | 13 | + Uid: "12312", |
| 15 | } | 14 | } |
| 16 | token := CreateToken(account) | 15 | token := CreateToken(account) |
| 17 | ac := ParseToken(token) | 16 | ac := ParseToken(token) |