in pkce/pkce.go [86:143]
func (p *Provider) FetchUser(session goth.Session) (goth.User, error) {
s := session.(*Session)
user := goth.User{
AccessToken: s.AccessToken,
Provider: p.Name(),
RefreshToken: s.RefreshToken,
ExpiresAt: s.ExpiresAt,
}
if user.AccessToken == "" {
return user, fmt.Errorf("%s cannot get user information without accessToken", p.Name())
}
req, err := http.NewRequest(http.MethodGet, p.ProfileURL, nil)
if err != nil {
return user, err
}
req.Header.Set("Authorization", "Bearer "+s.AccessToken)
resp, err := http.DefaultClient.Do(req)
if err != nil {
if resp.Body != nil {
resp.Body.Close()
}
return user, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return user, fmt.Errorf("%s responded with a %d while trying to fetch user information", p.Name(), resp.StatusCode)
}
var rawData map[string]interface{}
userInfo := &UserInfo{}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return user, err
}
err = json.Unmarshal(body, &rawData)
if err != nil {
return user, err
}
err = json.Unmarshal(body, userInfo)
if err != nil {
return user, err
}
user.Email = userInfo.Email
user.Name = userInfo.Name
user.NickName = userInfo.NickName
user.RawData = rawData
user.UserID = userInfo.UserID
return user, nil
}