grafananet_oauth.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package social
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/grafana/grafana/pkg/models"
  6. "golang.org/x/oauth2"
  7. )
  8. type SocialGrafanaNet struct {
  9. *oauth2.Config
  10. url string
  11. allowedOrganizations []string
  12. allowSignup bool
  13. }
  14. type OrgRecord struct {
  15. Login string `json:"login"`
  16. }
  17. func (s *SocialGrafanaNet) Type() int {
  18. return int(models.GRAFANANET)
  19. }
  20. func (s *SocialGrafanaNet) IsEmailAllowed(email string) bool {
  21. return true
  22. }
  23. func (s *SocialGrafanaNet) IsSignupAllowed() bool {
  24. return s.allowSignup
  25. }
  26. func (s *SocialGrafanaNet) IsOrganizationMember(organizations []OrgRecord) bool {
  27. if len(s.allowedOrganizations) == 0 {
  28. return true
  29. }
  30. for _, allowedOrganization := range s.allowedOrganizations {
  31. for _, organization := range organizations {
  32. if organization.Login == allowedOrganization {
  33. return true
  34. }
  35. }
  36. }
  37. return false
  38. }
  39. func (s *SocialGrafanaNet) UserInfo(client *http.Client) (*BasicUserInfo, error) {
  40. var data struct {
  41. Name string `json:"name"`
  42. Login string `json:"username"`
  43. Email string `json:"email"`
  44. Role string `json:"role"`
  45. Orgs []OrgRecord `json:"orgs"`
  46. }
  47. var err error
  48. r, err := client.Get(s.url + "/api/oauth2/user")
  49. if err != nil {
  50. return nil, err
  51. }
  52. defer r.Body.Close()
  53. if err = json.NewDecoder(r.Body).Decode(&data); err != nil {
  54. return nil, err
  55. }
  56. userInfo := &BasicUserInfo{
  57. Name: data.Name,
  58. Login: data.Login,
  59. Email: data.Email,
  60. Role: data.Role,
  61. }
  62. if !s.IsOrganizationMember(data.Orgs) {
  63. return nil, ErrMissingOrganizationMembership
  64. }
  65. return userInfo, nil
  66. }