add Token authentication support
Added CRUD methods for Tokens. Extend Auth Handler to check for the presence of a Bearer Authorization header to authenticate against. If there is no header, or the token is not valid, the Auth Handler falls back to looking for a Session.
This commit is contained in:
@@ -26,6 +26,12 @@ func Register(m *macaron.Macaron) {
|
||||
m.Post("/api/account/using/:id", auth, SetUsingAccount)
|
||||
m.Get("/api/account/others", auth, GetOtherAccounts)
|
||||
|
||||
// Token
|
||||
m.Get("/api/tokens/list", auth, GetTokens)
|
||||
m.Put("/api/tokens", auth, AddToken)
|
||||
m.Post("/api/tokens", auth, UpdateToken)
|
||||
m.Delete("/api/tokens/:id", auth, DeleteToken)
|
||||
|
||||
// data sources
|
||||
m.Get("/acount/datasources/", auth, Index)
|
||||
m.Get("/api/datasources/list", auth, GetDataSources)
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"github.com/torkelo/grafana-pro/pkg/bus"
|
||||
"github.com/torkelo/grafana-pro/pkg/middleware"
|
||||
m "github.com/torkelo/grafana-pro/pkg/models"
|
||||
"github.com/torkelo/grafana-pro/pkg/util"
|
||||
)
|
||||
|
||||
func GetTokens(c *middleware.Context) {
|
||||
query := m.GetTokensQuery{AccountId: c.Account.Id}
|
||||
err := bus.Dispatch(&query)
|
||||
|
||||
if err != nil {
|
||||
c.JsonApiErr(500, "Failed to list tokens", err)
|
||||
return
|
||||
}
|
||||
result := make([]*m.TokenDTO, len(query.Result))
|
||||
for i, t := range query.Result {
|
||||
result[i] = &m.TokenDTO{
|
||||
Id: t.Id,
|
||||
Name: t.Name,
|
||||
Role: t.Role,
|
||||
Token: t.Token,
|
||||
}
|
||||
}
|
||||
c.JSON(200, result)
|
||||
}
|
||||
|
||||
func DeleteToken(c *middleware.Context) {
|
||||
id := c.ParamsInt64(":id")
|
||||
|
||||
cmd := &m.DeleteTokenCommand{Id: id, AccountId: c.UserAccount.Id}
|
||||
|
||||
err := bus.Dispatch(cmd)
|
||||
if err != nil {
|
||||
c.JsonApiErr(500, "Failed to delete token", err)
|
||||
return
|
||||
}
|
||||
|
||||
c.JsonOK("Token deleted")
|
||||
}
|
||||
|
||||
func AddToken(c *middleware.Context) {
|
||||
cmd := m.AddTokenCommand{}
|
||||
|
||||
if !c.JsonBody(&cmd) {
|
||||
c.JsonApiErr(400, "Validation failed", nil)
|
||||
return
|
||||
}
|
||||
|
||||
if cmd.Role != m.ROLE_READ_WRITE && cmd.Role != m.ROLE_READ {
|
||||
c.JsonApiErr(400, "Invalid role specified", nil)
|
||||
return
|
||||
}
|
||||
|
||||
cmd.AccountId = c.Account.Id
|
||||
cmd.Token = util.GetRandomString(64)
|
||||
|
||||
if err := bus.Dispatch(&cmd); err != nil {
|
||||
c.JsonApiErr(500, "Failed to add token", err)
|
||||
return
|
||||
}
|
||||
result := &m.TokenDTO{
|
||||
Id: cmd.Result.Id,
|
||||
Name: cmd.Result.Name,
|
||||
Role: cmd.Result.Role,
|
||||
Token: cmd.Result.Token,
|
||||
}
|
||||
c.JSON(200, result)
|
||||
}
|
||||
|
||||
func UpdateToken(c *middleware.Context) {
|
||||
cmd := m.UpdateTokenCommand{}
|
||||
|
||||
if !c.JsonBody(&cmd) {
|
||||
c.JsonApiErr(400, "Validation failed", nil)
|
||||
return
|
||||
}
|
||||
|
||||
cmd.AccountId = c.Account.Id
|
||||
|
||||
err := bus.Dispatch(&cmd)
|
||||
if err != nil {
|
||||
c.JsonApiErr(500, "Failed to update token", err)
|
||||
return
|
||||
}
|
||||
|
||||
c.JsonOK("Token updated")
|
||||
}
|
||||
Reference in New Issue
Block a user