social.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package social
  2. import (
  3. "net/http"
  4. "strings"
  5. "context"
  6. "golang.org/x/oauth2"
  7. "github.com/grafana/grafana/pkg/log"
  8. "github.com/grafana/grafana/pkg/setting"
  9. "github.com/grafana/grafana/pkg/util"
  10. )
  11. type BasicUserInfo struct {
  12. Name string
  13. Email string
  14. Login string
  15. Company string
  16. Role string
  17. }
  18. type SocialConnector interface {
  19. Type() int
  20. UserInfo(client *http.Client, token *oauth2.Token) (*BasicUserInfo, error)
  21. IsEmailAllowed(email string) bool
  22. IsSignupAllowed() bool
  23. AuthCodeURL(state string, opts ...oauth2.AuthCodeOption) string
  24. Exchange(ctx context.Context, code string) (*oauth2.Token, error)
  25. Client(ctx context.Context, t *oauth2.Token) *http.Client
  26. }
  27. type SocialBase struct {
  28. *oauth2.Config
  29. log log.Logger
  30. }
  31. type Error struct {
  32. s string
  33. }
  34. func (e *Error) Error() string {
  35. return e.s
  36. }
  37. var (
  38. SocialBaseUrl = "/login/"
  39. SocialMap = make(map[string]SocialConnector)
  40. )
  41. func NewOAuthService() {
  42. setting.OAuthService = &setting.OAuther{}
  43. setting.OAuthService.OAuthInfos = make(map[string]*setting.OAuthInfo)
  44. allOauthes := []string{"github", "google", "generic_oauth", "grafananet", "grafana_com"}
  45. for _, name := range allOauthes {
  46. sec := setting.Cfg.Section("auth." + name)
  47. info := &setting.OAuthInfo{
  48. ClientId: sec.Key("client_id").String(),
  49. ClientSecret: sec.Key("client_secret").String(),
  50. Scopes: util.SplitString(sec.Key("scopes").String()),
  51. AuthUrl: sec.Key("auth_url").String(),
  52. TokenUrl: sec.Key("token_url").String(),
  53. ApiUrl: sec.Key("api_url").String(),
  54. Enabled: sec.Key("enabled").MustBool(),
  55. AllowedDomains: util.SplitString(sec.Key("allowed_domains").String()),
  56. HostedDomain: sec.Key("hosted_domain").String(),
  57. AllowSignup: sec.Key("allow_sign_up").MustBool(),
  58. Name: sec.Key("name").MustString(name),
  59. TlsClientCert: sec.Key("tls_client_cert").String(),
  60. TlsClientKey: sec.Key("tls_client_key").String(),
  61. TlsClientCa: sec.Key("tls_client_ca").String(),
  62. TlsSkipVerify: sec.Key("tls_skip_verify_insecure").MustBool(),
  63. }
  64. if !info.Enabled {
  65. continue
  66. }
  67. if name == "grafananet" {
  68. name = "grafana_com"
  69. }
  70. setting.OAuthService.OAuthInfos[name] = info
  71. config := oauth2.Config{
  72. ClientID: info.ClientId,
  73. ClientSecret: info.ClientSecret,
  74. Endpoint: oauth2.Endpoint{
  75. AuthURL: info.AuthUrl,
  76. TokenURL: info.TokenUrl,
  77. },
  78. RedirectURL: strings.TrimSuffix(setting.AppUrl, "/") + SocialBaseUrl + name,
  79. Scopes: info.Scopes,
  80. }
  81. logger := log.New("oauth." + name)
  82. // GitHub.
  83. if name == "github" {
  84. SocialMap["github"] = &SocialGithub{
  85. SocialBase: &SocialBase{
  86. Config: &config,
  87. log: logger,
  88. },
  89. allowedDomains: info.AllowedDomains,
  90. apiUrl: info.ApiUrl,
  91. allowSignup: info.AllowSignup,
  92. teamIds: sec.Key("team_ids").Ints(","),
  93. allowedOrganizations: util.SplitString(sec.Key("allowed_organizations").String()),
  94. }
  95. }
  96. // Google.
  97. if name == "google" {
  98. SocialMap["google"] = &SocialGoogle{
  99. SocialBase: &SocialBase{
  100. Config: &config,
  101. log: logger,
  102. },
  103. allowedDomains: info.AllowedDomains,
  104. hostedDomain: info.HostedDomain,
  105. apiUrl: info.ApiUrl,
  106. allowSignup: info.AllowSignup,
  107. }
  108. }
  109. // Generic - Uses the same scheme as Github.
  110. if name == "generic_oauth" {
  111. SocialMap["generic_oauth"] = &SocialGenericOAuth{
  112. SocialBase: &SocialBase{
  113. Config: &config,
  114. log: logger,
  115. },
  116. allowedDomains: info.AllowedDomains,
  117. apiUrl: info.ApiUrl,
  118. allowSignup: info.AllowSignup,
  119. teamIds: sec.Key("team_ids").Ints(","),
  120. allowedOrganizations: util.SplitString(sec.Key("allowed_organizations").String()),
  121. }
  122. }
  123. if name == "grafana_com" {
  124. config = oauth2.Config{
  125. ClientID: info.ClientId,
  126. ClientSecret: info.ClientSecret,
  127. Endpoint: oauth2.Endpoint{
  128. AuthURL: setting.GrafanaComUrl + "/oauth2/authorize",
  129. TokenURL: setting.GrafanaComUrl + "/api/oauth2/token",
  130. },
  131. RedirectURL: strings.TrimSuffix(setting.AppUrl, "/") + SocialBaseUrl + name,
  132. Scopes: info.Scopes,
  133. }
  134. SocialMap["grafana_com"] = &SocialGrafanaCom{
  135. SocialBase: &SocialBase{
  136. Config: &config,
  137. log: logger,
  138. },
  139. url: setting.GrafanaComUrl,
  140. allowSignup: info.AllowSignup,
  141. allowedOrganizations: util.SplitString(sec.Key("allowed_organizations").String()),
  142. }
  143. }
  144. }
  145. }