github.go 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package oauth2
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "net/http"
  6. "time"
  7. "golang.org/x/oauth2"
  8. "golang.org/x/oauth2/github"
  9. )
  10. type GithubField struct {
  11. Login string `json:"login"`
  12. ID int `json:"id"`
  13. NodeID string `json:"node_id"`
  14. AvatarURL string `json:"avatar_url"`
  15. GravatarID string `json:"gravatar_id"`
  16. URL string `json:"url"`
  17. HTMLURL string `json:"html_url"`
  18. FollowersURL string `json:"followers_url"`
  19. FollowingURL string `json:"following_url"`
  20. GistsURL string `json:"gists_url"`
  21. StarredURL string `json:"starred_url"`
  22. SubscriptionsURL string `json:"subscriptions_url"`
  23. OrganizationsURL string `json:"organizations_url"`
  24. ReposURL string `json:"repos_url"`
  25. EventsURL string `json:"events_url"`
  26. ReceivedEventsURL string `json:"received_events_url"`
  27. Type string `json:"type"`
  28. SiteAdmin bool `json:"site_admin"`
  29. Name string `json:"name"`
  30. Company string `json:"company"`
  31. Blog string `json:"blog"`
  32. Location string `json:"location"`
  33. Email interface{} `json:"email"`
  34. Hireable interface{} `json:"hireable"`
  35. Bio string `json:"bio"`
  36. TwitterUsername interface{} `json:"twitter_username"`
  37. PublicRepos int `json:"public_repos"`
  38. PublicGists int `json:"public_gists"`
  39. Followers int `json:"followers"`
  40. Following int `json:"following"`
  41. CreatedAt time.Time `json:"created_at"`
  42. UpdatedAt time.Time `json:"updated_at"`
  43. PrivateGists int `json:"private_gists"`
  44. TotalPrivateRepos int `json:"total_private_repos"`
  45. OwnedPrivateRepos int `json:"owned_private_repos"`
  46. DiskUsage int `json:"disk_usage"`
  47. Collaborators int `json:"collaborators"`
  48. TwoFactorAuthentication bool `json:"two_factor_authentication"`
  49. Plan struct {
  50. Name string `json:"name"`
  51. Space int `json:"space"`
  52. Collaborators int `json:"collaborators"`
  53. PrivateRepos int `json:"private_repos"`
  54. } `json:"plan"`
  55. }
  56. func githubScope() []string {
  57. return []string{"read:user"}
  58. }
  59. func githubEndpoint() oauth2.Endpoint {
  60. return github.Endpoint
  61. }
  62. func githubUserInfo(accessToken string) (string, error) {
  63. client := &http.Client{}
  64. req, err := http.NewRequest("GET", "https://api.github.com/user", nil)
  65. if err != nil {
  66. return "", err
  67. }
  68. req.Header.Set("Authorization", "token "+accessToken)
  69. req.Header.Set("Accept", "application/vnd.github.v3+json")
  70. response, err := client.Do(req)
  71. if err != nil {
  72. return "", err
  73. }
  74. defer response.Body.Close()
  75. contents, err := ioutil.ReadAll(response.Body)
  76. var data GithubField
  77. json.Unmarshal([]byte(contents), &data)
  78. return data.Login + "@github.com", err
  79. }