| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | package oauth2import (	"encoding/json"	"io/ioutil"	"net/http"	"time"	"golang.org/x/oauth2"	"golang.org/x/oauth2/github")type GithubField struct {	Login                   string      `json:"login"`	ID                      int         `json:"id"`	NodeID                  string      `json:"node_id"`	AvatarURL               string      `json:"avatar_url"`	GravatarID              string      `json:"gravatar_id"`	URL                     string      `json:"url"`	HTMLURL                 string      `json:"html_url"`	FollowersURL            string      `json:"followers_url"`	FollowingURL            string      `json:"following_url"`	GistsURL                string      `json:"gists_url"`	StarredURL              string      `json:"starred_url"`	SubscriptionsURL        string      `json:"subscriptions_url"`	OrganizationsURL        string      `json:"organizations_url"`	ReposURL                string      `json:"repos_url"`	EventsURL               string      `json:"events_url"`	ReceivedEventsURL       string      `json:"received_events_url"`	Type                    string      `json:"type"`	SiteAdmin               bool        `json:"site_admin"`	Name                    string      `json:"name"`	Company                 string      `json:"company"`	Blog                    string      `json:"blog"`	Location                string      `json:"location"`	Email                   interface{} `json:"email"`	Hireable                interface{} `json:"hireable"`	Bio                     string      `json:"bio"`	TwitterUsername         interface{} `json:"twitter_username"`	PublicRepos             int         `json:"public_repos"`	PublicGists             int         `json:"public_gists"`	Followers               int         `json:"followers"`	Following               int         `json:"following"`	CreatedAt               time.Time   `json:"created_at"`	UpdatedAt               time.Time   `json:"updated_at"`	PrivateGists            int         `json:"private_gists"`	TotalPrivateRepos       int         `json:"total_private_repos"`	OwnedPrivateRepos       int         `json:"owned_private_repos"`	DiskUsage               int         `json:"disk_usage"`	Collaborators           int         `json:"collaborators"`	TwoFactorAuthentication bool        `json:"two_factor_authentication"`	Plan                    struct {		Name          string `json:"name"`		Space         int    `json:"space"`		Collaborators int    `json:"collaborators"`		PrivateRepos  int    `json:"private_repos"`	} `json:"plan"`}func githubScope() []string {	return []string{"read:user"}}func githubEndpoint() oauth2.Endpoint {	return github.Endpoint}func githubUserInfo(accessToken string) (string, error) {	client := &http.Client{}	req, err := http.NewRequest("GET", "https://api.github.com/user", nil)	if err != nil {		return "", err	}	req.Header.Set("Authorization", "token "+accessToken)	req.Header.Set("Accept", "application/vnd.github.v3+json")	response, err := client.Do(req)	if err != nil {		return "", err	}	defer response.Body.Close()	contents, err := ioutil.ReadAll(response.Body)	var data GithubField	json.Unmarshal([]byte(contents), &data)	return data.Login + "@github.com", err}
 |