diff --git a/clientapi/mp/auth/clientcredential.go b/clientapi/mp/auth/clientcredential.go index 04786ce..e3e1497 100644 --- a/clientapi/mp/auth/clientcredential.go +++ b/clientapi/mp/auth/clientcredential.go @@ -5,7 +5,7 @@ import ( ) type ClientCredential struct { - request.Error - AccessToken string `json:"access_token"` - ExpiresIn int32 `json:"expires_in"` + request.Error `gorm:"-"` + AccessToken string `json:"access_token"` + ExpiresIn int32 `json:"expires_in"` } diff --git a/clientapi/mp/auth/token.go b/clientapi/mp/auth/token.go index be6827a..95fe018 100644 --- a/clientapi/mp/auth/token.go +++ b/clientapi/mp/auth/token.go @@ -5,10 +5,10 @@ import ( ) type Token struct { - request.Error - AccessToken string `json:"access_token"` //获取到的凭证 - ExpiresIn int32 `json:"expires_in"` //凭证有效时间,单位:秒 - RefreshToken string `json:"refresh_token"` //有效期为30天,当失效之后,需要用户重新授 - OpenID string `json:"openid" gorm:"index"` - Scope string `json:"scope"` + request.Error `gorm:"-"` + AccessToken string `json:"access_token"` //获取到的凭证 + ExpiresIn int32 `json:"expires_in"` //凭证有效时间,单位:秒 + RefreshToken string `json:"refresh_token"` //有效期为30天,当失效之后,需要用户重新授 + OpenID string `json:"openid" gorm:"index"` + Scope string `json:"scope"` } diff --git a/clientapi/mp/auth/userinfo.go b/clientapi/mp/auth/userinfo.go index 3370edf..cd83326 100644 --- a/clientapi/mp/auth/userinfo.go +++ b/clientapi/mp/auth/userinfo.go @@ -5,14 +5,14 @@ import ( ) type Userinfo struct { - request.Error - OpenID string `json:"openid" gorm:"index"` - NickName string `json:"nickname"` - Sex int32 `json:"sex"` - Province string `json:"province"` - City string `json:"city"` - Country string `json:"country"` - HeadImgURL string `json:"headimgurl"` - Privilege []string `json:"privilege" gorm:"type:text[]"` - UnionID string `json:"unionid"` + request.Error `gorm:"-"` + OpenID string `json:"openid" gorm:"index"` + NickName string `json:"nickname"` + Sex int32 `json:"sex"` + Province string `json:"province"` + City string `json:"city"` + Country string `json:"country"` + HeadImgURL string `json:"headimgurl"` + Privilege []string `json:"privilege" gorm:"type:text[]"` + UnionID string `json:"unionid"` } diff --git a/cmd/mp-auth-http/main.go b/cmd/mp-auth-http/main.go new file mode 100644 index 0000000..bef0e87 --- /dev/null +++ b/cmd/mp-auth-http/main.go @@ -0,0 +1,113 @@ +package main + +import ( + "encoding/json" + "flag" + "net/http" + + pb "git.esin.io/lab/weixin/protobuf/clientapi/mp/auth" + "google.golang.org/grpc" +) + +var ( + lisPort string + authServerEndpoint string +) + +func init() { + flag.StringVar(&lisPort, "port", "3000", "server listen port") + flag.StringVar(&authServerEndpoint, "auth.server", "localhost:13721", "auth grpc server endpoint") +} + +func main() { + flag.Parse() + + if err := run(); err != nil { + panic(err) + } +} + +func run() error { + grpcDialOpts := []grpc.DialOption{ + grpc.WithInsecure(), + grpc.WithBlock(), + } + grpcConn, err := grpc.Dial(authServerEndpoint, grpcDialOpts...) + if err != nil { + return err + } + + h := NewHandler(pb.NewAuthServiceClient(grpcConn)) + + http.HandleFunc("/url", h.getCodeURL) + http.HandleFunc("/token", h.exchangeToken) + http.HandleFunc("/userinfo", h.getUserinfo) + http.HandleFunc("/userinfo/sync", h.syncUserinfo) + + return http.ListenAndServe(":"+lisPort, nil) +} + +type restHandler struct { + client pb.AuthServiceClient +} + +func NewHandler(client pb.AuthServiceClient) *restHandler { + return &restHandler{ + client: client, + } +} + +func (h restHandler) getCodeURL(w http.ResponseWriter, r *http.Request) { + resp, err := h.client.GetCodeURL(r.Context(), &pb.GetCodeURLRequest{ + RedirectUrl: r.FormValue("redirect_url"), + State: r.FormValue("state"), + Scope: pb.GetCodeURLRequest_snsapi_base, + }) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + encoder := json.NewEncoder(w) + encoder.SetEscapeHTML(false) + encoder.Encode(resp) +} + +func (h restHandler) exchangeToken(w http.ResponseWriter, r *http.Request) { + code := r.FormValue("code") + + resp, err := h.client.ExchangeToken(r.Context(), &pb.ExchangeTokenRequest{ + Code: code, + }) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + json.NewEncoder(w).Encode(resp) +} + +func (h restHandler) getUserinfo(w http.ResponseWriter, r *http.Request) { + openid := r.FormValue("openid") + resp, err := h.client.GetUserinfo(r.Context(), &pb.GetUserinfoRequest{ + OpenId: openid, + Lang: pb.GetUserinfoRequest_zh_CN, + }) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + json.NewEncoder(w).Encode(resp) +} + +func (h restHandler) syncUserinfo(w http.ResponseWriter, r *http.Request) { + openid := r.FormValue("openid") + resp, err := h.client.SyncUserinfo(r.Context(), &pb.SyncUserinfoRequest{ + OpenId: openid, + Lang: pb.SyncUserinfoRequest_zh_CN, + }) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + json.NewEncoder(w).Encode(resp) +} diff --git a/pkg/mp/auth/auth.go b/pkg/mp/auth/auth.go index 90651ec..20130a8 100644 --- a/pkg/mp/auth/auth.go +++ b/pkg/mp/auth/auth.go @@ -53,7 +53,7 @@ func (srv Service) PublishEvent(ctx context.Context, subject string, message int return nil } -func (srv Service) GetAuthCodeURL(ctx context.Context, req *pb.GetCodeURLRequest) (*pb.GetCodeURLResponse, error) { +func (srv Service) GetCodeURL(ctx context.Context, req *pb.GetCodeURLRequest) (*pb.GetCodeURLResponse, error) { resp := srv.client.GetCodeURL(req.RedirectUrl, req.State, mpauth.Scope(req.Scope.String())) return &pb.GetCodeURLResponse{ @@ -163,7 +163,7 @@ func (srv Service) SyncUserinfo(ctx context.Context, req *pb.SyncUserinfoRequest return nil, status.Errorf(codes.Internal, errors.Wrap(err, "get userinfo token from weixin failed").Error()) } - userinfo = Userinfo{Userinfo: *resp} + userinfo.Userinfo = *resp if err := srv.db.Save(&userinfo).Error; err != nil { return nil, status.Errorf(codes.Internal, errors.Wrap(err, "sync userinfo and save to database failed").Error()) }