fix: improve error handling in LarkIdProvider

This commit is contained in:
Yang Luo 2024-01-19 14:06:34 +08:00
parent 61deb75c84
commit 66aca3124c

View File

@ -16,6 +16,7 @@ package idp
import ( import (
"encoding/json" "encoding/json"
"fmt"
"io" "io"
"net/http" "net/http"
"strings" "strings"
@ -82,13 +83,22 @@ func (idp *LarkIdProvider) GetToken(code string) (*oauth2.Token, error) {
AppID string `json:"app_id"` AppID string `json:"app_id"`
AppSecret string `json:"app_secret"` AppSecret string `json:"app_secret"`
}{idp.Config.ClientID, idp.Config.ClientSecret} }{idp.Config.ClientID, idp.Config.ClientSecret}
data, err := idp.postWithBody(params, idp.Config.Endpoint.TokenURL) data, err := idp.postWithBody(params, idp.Config.Endpoint.TokenURL)
if err != nil {
return nil, err
}
appToken := &LarkAccessToken{} appToken := &LarkAccessToken{}
if err = json.Unmarshal(data, appToken); err != nil || appToken.Code != 0 { err = json.Unmarshal(data, appToken)
if err != nil {
return nil, err return nil, err
} }
if appToken.Code != 0 {
return nil, fmt.Errorf("GetToken() error, appToken.Code: %d, appToken.Msg: %s", appToken.Code, appToken.Msg)
}
t := &oauth2.Token{ t := &oauth2.Token{
AccessToken: appToken.TenantAccessToken, AccessToken: appToken.TenantAccessToken,
TokenType: "Bearer", TokenType: "Bearer",
@ -98,7 +108,6 @@ func (idp *LarkIdProvider) GetToken(code string) (*oauth2.Token, error) {
raw := make(map[string]interface{}) raw := make(map[string]interface{})
raw["code"] = code raw["code"] = code
t = t.WithExtra(raw) t = t.WithExtra(raw)
return t, nil return t, nil
} }
@ -159,11 +168,17 @@ func (idp *LarkIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
GrantType string `json:"grant_type"` GrantType string `json:"grant_type"`
Code string `json:"code"` Code string `json:"code"`
}{"authorization_code", token.Extra("code").(string)} }{"authorization_code", token.Extra("code").(string)}
data, _ := json.Marshal(body)
data, err := json.Marshal(body)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", "https://open.feishu.cn/open-apis/authen/v1/access_token", strings.NewReader(string(data))) req, err := http.NewRequest("POST", "https://open.feishu.cn/open-apis/authen/v1/access_token", strings.NewReader(string(data)))
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.Header.Set("Content-Type", "application/json;charset=UTF-8") req.Header.Set("Content-Type", "application/json;charset=UTF-8")
req.Header.Set("Authorization", "Bearer "+token.AccessToken) req.Header.Set("Authorization", "Bearer "+token.AccessToken)
@ -171,6 +186,7 @@ func (idp *LarkIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer resp.Body.Close() defer resp.Body.Close()
data, err = io.ReadAll(resp.Body) data, err = io.ReadAll(resp.Body)
if err != nil { if err != nil {
@ -178,7 +194,8 @@ func (idp *LarkIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
} }
var larkUserInfo LarkUserInfo var larkUserInfo LarkUserInfo
if err = json.Unmarshal(data, &larkUserInfo); err != nil { err = json.Unmarshal(data, &larkUserInfo)
if err != nil {
return nil, err return nil, err
} }
@ -189,7 +206,6 @@ func (idp *LarkIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
Email: larkUserInfo.Data.Email, Email: larkUserInfo.Data.Email,
AvatarUrl: larkUserInfo.Data.AvatarUrl, AvatarUrl: larkUserInfo.Data.AvatarUrl,
} }
return &userInfo, nil return &userInfo, nil
} }
@ -198,21 +214,23 @@ func (idp *LarkIdProvider) postWithBody(body interface{}, url string) ([]byte, e
if err != nil { if err != nil {
return nil, err return nil, err
} }
r := strings.NewReader(string(bs)) r := strings.NewReader(string(bs))
resp, err := idp.Client.Post(url, "application/json;charset=UTF-8", r) resp, err := idp.Client.Post(url, "application/json;charset=UTF-8", r)
if err != nil { if err != nil {
return nil, err return nil, err
} }
data, err := io.ReadAll(resp.Body) data, err := io.ReadAll(resp.Body)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer func(Body io.ReadCloser) { defer func(Body io.ReadCloser) {
err := Body.Close() err := Body.Close()
if err != nil { if err != nil {
return return
} }
}(resp.Body) }(resp.Body)
return data, nil return data, nil
} }