api_login_oauth.go 1.8 KB

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