go-common/app/interface/main/account/http/vip_third.go
2019-04-22 18:49:16 +08:00

123 lines
2.5 KiB
Go

package http
import (
"net/http"
"go-common/app/interface/main/account/model"
idtv1 "go-common/app/service/main/identify/api/grpc"
vipmol "go-common/app/service/main/vip/model"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/library/net/metadata"
)
//
// vip 第三方[ele]接入gateway
//
// openID
func openIDByOAuth2Code(c *bm.Context) {
var err error
a := new(model.ArgAuthCode)
if err = c.Bind(a); err != nil {
return
}
a.IP = metadata.String(c, metadata.RemoteIP)
a.APPID = vipmol.EleAppID
c.JSON(vipSvc.OpenIDByAuthCode(c, a))
}
func openBindByOutOpenID(c *bm.Context) {
var err error
a := new(model.ArgBind)
if err = c.Bind(a); err != nil {
return
}
a.AppID = vipmol.EleAppID
c.JSON(nil, vipSvc.OpenBindByOutOpenID(c, a))
}
func userInfoByOpenID(c *bm.Context) {
var err error
a := new(model.ArgUserInfoByOpenID)
if err = c.Bind(a); err != nil {
return
}
a.AppID = vipmol.EleAppID
c.JSON(vipSvc.UserInfoByOpenID(c, a))
}
func bilibiliVipGrant(c *bm.Context) {
var err error
a := new(model.ArgBilibiliVipGrant)
if err = c.Bind(a); err != nil {
return
}
a.AppID = vipmol.EleAppID
c.JSON(nil, vipSvc.BilibiliVipGrant(c, a))
}
func bilibiliPrizeGrant(c *bm.Context) {
var err error
a := new(model.ArgBilibiliPrizeGrant)
if err = c.Bind(a); err != nil {
return
}
a.AppID = vipmol.EleAppID
c.JSON(vipSvc.BilibiliPrizeGrant(c, a))
}
func openAuthCallBack(c *bm.Context) {
var err error
midI, ok := c.Get("mid")
if !ok {
c.JSON(nil, ecode.NoLogin)
return
}
a := new(model.ArgOpenAuthCallBack)
if err = c.Bind(a); err != nil {
return
}
// verify csrf.
verifyState(c, authn, a.State)
a.AppID = vipmol.EleAppID
a.Mid = midI.(int64)
c.Redirect(http.StatusFound, vipSvc.OpenAuthCallBack(c, a))
}
func eleOAuthURL(c *bm.Context) {
var (
state string
err error
)
if state, err = csrf(c, authn); err != nil {
return
}
c.JSON(vipSvc.ElemeOAuthURI(c, state), nil)
}
func verifyState(ctx *bm.Context, a *auth.Auth, state string) (err error) {
var csrfStr string
if csrfStr, err = csrf(ctx, a); err != nil {
return
}
if csrfStr != state {
return ecode.CsrfNotMatchErr
}
return
}
func csrf(ctx *bm.Context, a *auth.Auth) (string, error) {
req := ctx.Request
cookie := req.Header.Get("Cookie")
reply, err := a.GetCookieInfo(ctx, &idtv1.GetCookieInfoReq{Cookie: cookie})
if err != nil {
return "", err
}
if !reply.IsLogin {
return "", ecode.NoLogin
}
return reply.Csrf, nil
}