The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
grafana/pkg/api/api_login_oauth.go

79 lines
1.8 KiB

package api
11 years ago
import (
"errors"
"fmt"
"github.com/torkelo/grafana-pro/pkg/bus"
11 years ago
"github.com/torkelo/grafana-pro/pkg/log"
"github.com/torkelo/grafana-pro/pkg/middleware"
m "github.com/torkelo/grafana-pro/pkg/models"
11 years ago
"github.com/torkelo/grafana-pro/pkg/setting"
"github.com/torkelo/grafana-pro/pkg/social"
)
func OAuthLogin(ctx *middleware.Context) {
if setting.OAuthService == nil {
11 years ago
ctx.Handle(404, "login.OAuthLogin(oauth service not enabled)", nil)
11 years ago
return
}
name := ctx.Params(":name")
connect, ok := social.SocialMap[name]
if !ok {
11 years ago
ctx.Handle(404, "login.OAuthLogin(social login not enabled)", errors.New(name))
11 years ago
return
}
code := ctx.Query("code")
if code == "" {
ctx.Redirect(connect.AuthCodeURL("", "online", "auto"))
return
}
11 years ago
log.Info("code: %v", code)
11 years ago
// handle call back
transport, err := connect.NewTransportFromCode(code)
11 years ago
if err != nil {
11 years ago
ctx.Handle(500, "login.OAuthLogin(NewTransportWithCode)", err)
11 years ago
return
}
11 years ago
log.Trace("login.OAuthLogin(Got token)")
11 years ago
userInfo, err := connect.UserInfo(transport)
if err != nil {
11 years ago
ctx.Handle(500, fmt.Sprintf("login.OAuthLogin(get info from %s)", name), err)
11 years ago
return
}
11 years ago
log.Info("login.OAuthLogin(social login): %s", userInfo)
11 years ago
userQuery := m.GetAccountByLoginQuery{Login: userInfo.Email}
err = bus.Dispatch(&userQuery)
11 years ago
// create account if missing
if err == m.ErrAccountNotFound {
cmd := &m.CreateAccountCommand{
Login: userInfo.Email,
11 years ago
Email: userInfo.Email,
Name: userInfo.Name,
Company: userInfo.Company,
}
if err = bus.Dispatch(&cmd); err != nil {
11 years ago
ctx.Handle(500, "Failed to create account", err)
return
}
userQuery.Result = &cmd.Result
} else if err != nil {
ctx.Handle(500, "Unexpected error", err)
11 years ago
}
// login
loginUserWithAccount(userQuery.Result, ctx)
11 years ago
ctx.Redirect("/")
}