user_token.go 3.1 KB

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