add oauth flow routes
This commit is contained in:
+139
-1
@@ -1,6 +1,17 @@
|
||||
package google
|
||||
|
||||
import "net/url"
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"go-cal/pkg/config"
|
||||
"go-cal/pkg/types"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"time"
|
||||
)
|
||||
|
||||
var baseURL = "https://www.googleapis.com/"
|
||||
|
||||
@@ -22,3 +33,130 @@ func getHeaders() map[string]string {
|
||||
|
||||
return obj
|
||||
}
|
||||
|
||||
// OAuthExchangeCodeToToken -
|
||||
func OAuthExchangeCodeToToken(code string) (token types.GoogleAuthToken, err error) {
|
||||
conf := config.Get()
|
||||
if conf == nil {
|
||||
return token, errors.New("config not init")
|
||||
}
|
||||
|
||||
u, err := url.Parse(conf.Google.TokenURL)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
qs := url.Values{}
|
||||
qs.Set("code", code)
|
||||
qs.Set("client_id", conf.Google.ClientID)
|
||||
qs.Set("client_secret", conf.Google.ClientSecret)
|
||||
qs.Set("redirect_uri", conf.Google.RedirectURL)
|
||||
qs.Set("grant_type", "authorization_code")
|
||||
|
||||
reader := bytes.NewReader([]byte(qs.Encode()))
|
||||
|
||||
req, err := http.NewRequest("POST", fmt.Sprintf("%s", u.String()), reader)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
b, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = json.Unmarshal(b, &token)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// OAuthRefreshToken -
|
||||
func OAuthRefreshToken(refreshToken string) (token string, expiresIn int64, err error) {
|
||||
if len(refreshToken) == 0 {
|
||||
return "", 0, errors.New("refresh token is empty")
|
||||
}
|
||||
|
||||
conf := config.Get()
|
||||
if conf == nil {
|
||||
return "", 0, errors.New("config not init")
|
||||
}
|
||||
|
||||
u, err := url.Parse(conf.Google.TokenURL)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
qs := url.Values{}
|
||||
qs.Set("client_id", conf.Google.ClientID)
|
||||
qs.Set("client_secret", conf.Google.ClientSecret)
|
||||
qs.Set("grant_type", "refresh_token")
|
||||
|
||||
reader := bytes.NewReader([]byte(qs.Encode()))
|
||||
|
||||
req, err := http.NewRequest("POST", u.String(), reader)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var tokenData types.GoogleAuthToken
|
||||
err = json.NewDecoder(resp.Body).Decode(&tokenData)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
tokenData.ExpiresIn += time.Now().Unix()
|
||||
|
||||
return tokenData.AccessToken, tokenData.ExpiresIn, nil
|
||||
}
|
||||
|
||||
// GetTokenInfo -
|
||||
func GetTokenInfo(token string) (expire int64, err error) {
|
||||
u, err := url.Parse("https://oauth2.googleapis.com/tokeninfo")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
body := struct {
|
||||
Azp string `json:"azp"`
|
||||
Aud string `json:"aud"`
|
||||
Scope string `json:"scope"`
|
||||
Exp json.Number `json:"exp"`
|
||||
ExpiresIn json.Number `json:"expires_in"`
|
||||
AccessType string `json:"access_type"`
|
||||
}{}
|
||||
|
||||
qs := url.Values{}
|
||||
qs.Set("access_token", token)
|
||||
|
||||
resp, err := http.Get(fmt.Sprintf("%s?%s", u.String(), qs.Encode()))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
err = json.NewDecoder(resp.Body).Decode(&body)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
expTime, err := body.Exp.Int64()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return expTime, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user