From 62a7e8f2557f4a447b7969269e4345dcce89088d Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Sat, 21 Oct 2023 22:06:48 +0800 Subject: [PATCH] Feat: impl baidu oauth2 --- internal/provider/baidu-netdisk.go | 2 - internal/provider/baidu.go | 77 ++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 internal/provider/baidu.go diff --git a/internal/provider/baidu-netdisk.go b/internal/provider/baidu-netdisk.go index 1260695..762628b 100644 --- a/internal/provider/baidu-netdisk.go +++ b/internal/provider/baidu-netdisk.go @@ -6,7 +6,6 @@ import ( "net/http" json "github.com/json-iterator/go" - "github.com/sirupsen/logrus" "golang.org/x/oauth2" ) @@ -45,7 +44,6 @@ func (p *BaiduNetDiskProvider) GetUserInfo(ctx context.Context, config *oauth2.C if err != nil { return nil, err } - logrus.Info(oauth2Token) client := config.Client(ctx, oauth2Token) req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://pan.baidu.com/rest/2.0/xpan/nas?method=uinfo&access_token=%s", oauth2Token.AccessToken), nil) if err != nil { diff --git a/internal/provider/baidu.go b/internal/provider/baidu.go new file mode 100644 index 0000000..893eba3 --- /dev/null +++ b/internal/provider/baidu.go @@ -0,0 +1,77 @@ +package provider + +import ( + "context" + "fmt" + "hash/crc32" + "net/http" + + json "github.com/json-iterator/go" + "github.com/zijiren233/stream" + "golang.org/x/oauth2" +) + +// https://pan.baidu.com/union/apply +type BaiduProvider struct { + config oauth2.Config +} + +func (p *BaiduProvider) Init(ClientID, ClientSecret string, options ...Oauth2Option) { + p.config.ClientID = ClientID + p.config.ClientSecret = ClientSecret + p.config.Scopes = []string{"basic"} + p.config.Endpoint = oauth2.Endpoint{ + AuthURL: "https://openapi.baidu.com/oauth/2.0/authorize", + TokenURL: "https://openapi.baidu.com/oauth/2.0/token", + } + for _, o := range options { + o(&p.config) + } +} + +func (p *BaiduProvider) Provider() OAuth2Provider { + return "baidu" +} + +func (p *BaiduProvider) NewConfig(options ...Oauth2Option) *oauth2.Config { + c := p.config + for _, o := range options { + o(&c) + } + return &c +} + +func (p *BaiduProvider) GetUserInfo(ctx context.Context, config *oauth2.Config, code string) (*UserInfo, error) { + oauth2Token, err := config.Exchange(ctx, code) + if err != nil { + return nil, err + } + client := config.Client(ctx, oauth2Token) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://openapi.baidu.com/rest/2.0/passport/users/getLoggedInUser?access_token=%s", oauth2Token.AccessToken), nil) + if err != nil { + return nil, err + } + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + ui := baiduProviderUserInfo{} + err = json.NewDecoder(resp.Body).Decode(&ui) + if err != nil { + return nil, err + } + return &UserInfo{ + Username: ui.Uname, + ProviderUserID: uint(crc32.ChecksumIEEE(stream.StringToBytes(ui.Openid))), + }, nil +} + +func init() { + registerProvider(new(BaiduProvider)) +} + +type baiduProviderUserInfo struct { + Uname string `json:"uname"` + Openid string `json:"openid"` +}