func()

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
}