user_token.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package api
  2. import (
  3. "time"
  4. "github.com/grafana/grafana/pkg/api/dtos"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/models"
  7. "github.com/grafana/grafana/pkg/util"
  8. )
  9. // GET /api/user/auth-tokens
  10. func (server *HTTPServer) GetUserAuthTokens(c *models.ReqContext) Response {
  11. return server.getUserAuthTokensInternal(c, c.UserId)
  12. }
  13. // POST /api/user/revoke-auth-token
  14. func (server *HTTPServer) RevokeUserAuthToken(c *models.ReqContext, cmd models.RevokeAuthTokenCmd) Response {
  15. return server.revokeUserAuthTokenInternal(c, c.UserId, cmd)
  16. }
  17. func (server *HTTPServer) logoutUserFromAllDevicesInternal(userID int64) Response {
  18. userQuery := models.GetUserByIdQuery{Id: userID}
  19. if err := bus.Dispatch(&userQuery); err != nil {
  20. if err == models.ErrUserNotFound {
  21. return Error(404, "User not found", err)
  22. }
  23. return Error(500, "Could not read user from database", err)
  24. }
  25. err := server.AuthTokenService.RevokeAllUserTokens(userID)
  26. if err != nil {
  27. return Error(500, "Failed to logout user", err)
  28. }
  29. return JSON(200, util.DynMap{
  30. "message": "User logged out",
  31. })
  32. }
  33. func (server *HTTPServer) getUserAuthTokensInternal(c *models.ReqContext, userID int64) Response {
  34. userQuery := models.GetUserByIdQuery{Id: userID}
  35. if err := bus.Dispatch(&userQuery); err != nil {
  36. if err == models.ErrUserNotFound {
  37. return Error(404, "User not found", err)
  38. }
  39. return Error(500, "Failed to get user", err)
  40. }
  41. tokens, err := server.AuthTokenService.GetUserTokens(userID)
  42. if err != nil {
  43. return Error(500, "Failed to get user auth tokens", err)
  44. }
  45. result := []*dtos.UserToken{}
  46. for _, token := range tokens {
  47. isActive := false
  48. if c.UserToken != nil && c.UserToken.Id == token.Id {
  49. isActive = true
  50. }
  51. result = append(result, &dtos.UserToken{
  52. Id: token.Id,
  53. IsActive: isActive,
  54. ClientIp: token.ClientIp,
  55. UserAgent: token.UserAgent,
  56. CreatedAt: time.Unix(token.CreatedAt, 0),
  57. SeenAt: time.Unix(token.SeenAt, 0),
  58. })
  59. }
  60. return JSON(200, result)
  61. }
  62. func (server *HTTPServer) revokeUserAuthTokenInternal(c *models.ReqContext, userID int64, cmd models.RevokeAuthTokenCmd) Response {
  63. userQuery := models.GetUserByIdQuery{Id: userID}
  64. if err := bus.Dispatch(&userQuery); err != nil {
  65. if err == models.ErrUserNotFound {
  66. return Error(404, "User not found", err)
  67. }
  68. return Error(500, "Failed to get user", err)
  69. }
  70. token, err := server.AuthTokenService.GetUserToken(userID, cmd.AuthTokenId)
  71. if err != nil {
  72. if err == models.ErrUserTokenNotFound {
  73. return Error(404, "User auth token not found", err)
  74. }
  75. return Error(500, "Failed to get user auth token", err)
  76. }
  77. if c.UserToken != nil && c.UserToken.Id == token.Id {
  78. return Error(400, "Cannot revoke active user auth token", nil)
  79. }
  80. err = server.AuthTokenService.RevokeToken(token)
  81. if err != nil {
  82. if err == models.ErrUserTokenNotFound {
  83. return Error(404, "User auth token not found", err)
  84. }
  85. return Error(500, "Failed to revoke user auth token", err)
  86. }
  87. return JSON(200, util.DynMap{
  88. "message": "User auth token revoked",
  89. })
  90. }