api_login_oauth.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package api
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/torkelo/grafana-pro/pkg/log"
  6. "github.com/torkelo/grafana-pro/pkg/middleware"
  7. "github.com/torkelo/grafana-pro/pkg/models"
  8. "github.com/torkelo/grafana-pro/pkg/setting"
  9. "github.com/torkelo/grafana-pro/pkg/social"
  10. )
  11. func OAuthLogin(ctx *middleware.Context) {
  12. if setting.OAuthService == nil {
  13. ctx.Handle(404, "login.OAuthLogin(oauth service not enabled)", nil)
  14. return
  15. }
  16. name := ctx.Params(":name")
  17. connect, ok := social.SocialMap[name]
  18. if !ok {
  19. ctx.Handle(404, "login.OAuthLogin(social login not enabled)", errors.New(name))
  20. return
  21. }
  22. code := ctx.Query("code")
  23. if code == "" {
  24. ctx.Redirect(connect.AuthCodeURL("", "online", "auto"))
  25. return
  26. }
  27. log.Info("code: %v", code)
  28. // handle call back
  29. transport, err := connect.NewTransportFromCode(code)
  30. if err != nil {
  31. ctx.Handle(500, "login.OAuthLogin(NewTransportWithCode)", err)
  32. return
  33. }
  34. log.Trace("login.OAuthLogin(Got token)")
  35. userInfo, err := connect.UserInfo(transport)
  36. if err != nil {
  37. ctx.Handle(500, fmt.Sprintf("login.OAuthLogin(get info from %s)", name), err)
  38. return
  39. }
  40. log.Info("login.OAuthLogin(social login): %s", userInfo)
  41. account, err := models.GetAccountByLogin(userInfo.Email)
  42. // create account if missing
  43. if err == models.ErrAccountNotFound {
  44. account = &models.Account{
  45. Login: userInfo.Email,
  46. Email: userInfo.Email,
  47. Name: userInfo.Name,
  48. Company: userInfo.Company,
  49. }
  50. if err = models.CreateAccount(account); err != nil {
  51. ctx.Handle(500, "Failed to create account", err)
  52. return
  53. }
  54. } else if err != nil {
  55. ctx.Handle(500, "Unexpected error", err)
  56. }
  57. // login
  58. loginUserWithAccount(account, ctx)
  59. ctx.Redirect("/")
  60. }