user_token.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. "github.com/ua-parser/uap-go/uaparser"
  10. )
  11. // GET /api/user/auth-tokens
  12. func (server *HTTPServer) GetUserAuthTokens(c *models.ReqContext) Response {
  13. return server.getUserAuthTokensInternal(c, c.UserId)
  14. }
  15. // POST /api/user/revoke-auth-token
  16. func (server *HTTPServer) RevokeUserAuthToken(c *models.ReqContext, cmd models.RevokeAuthTokenCmd) Response {
  17. return server.revokeUserAuthTokenInternal(c, c.UserId, cmd)
  18. }
  19. func (server *HTTPServer) logoutUserFromAllDevicesInternal(ctx context.Context, userID int64) Response {
  20. userQuery := models.GetUserByIdQuery{Id: userID}
  21. if err := bus.Dispatch(&userQuery); err != nil {
  22. if err == models.ErrUserNotFound {
  23. return Error(404, "User not found", err)
  24. }
  25. return Error(500, "Could not read user from database", err)
  26. }
  27. err := server.AuthTokenService.RevokeAllUserTokens(ctx, userID)
  28. if err != nil {
  29. return Error(500, "Failed to logout user", err)
  30. }
  31. return JSON(200, util.DynMap{
  32. "message": "User logged out",
  33. })
  34. }
  35. func (server *HTTPServer) getUserAuthTokensInternal(c *models.ReqContext, userID int64) Response {
  36. userQuery := models.GetUserByIdQuery{Id: userID}
  37. if err := bus.Dispatch(&userQuery); err != nil {
  38. if err == models.ErrUserNotFound {
  39. return Error(404, "User not found", err)
  40. }
  41. return Error(500, "Failed to get user", err)
  42. }
  43. tokens, err := server.AuthTokenService.GetUserTokens(c.Req.Context(), userID)
  44. if err != nil {
  45. return Error(500, "Failed to get user auth tokens", err)
  46. }
  47. result := []*dtos.UserToken{}
  48. for _, token := range tokens {
  49. isActive := false
  50. if c.UserToken != nil && c.UserToken.Id == token.Id {
  51. isActive = true
  52. }
  53. parser := uaparser.NewFromSaved()
  54. client := parser.Parse(token.UserAgent)
  55. osVersion := ""
  56. if client.Os.Major != "" {
  57. osVersion = client.Os.Major
  58. if client.Os.Minor != "" {
  59. osVersion = osVersion + "." + client.Os.Minor
  60. }
  61. }
  62. browserVersion := ""
  63. if client.UserAgent.Major != "" {
  64. browserVersion = client.UserAgent.Major
  65. if client.UserAgent.Minor != "" {
  66. browserVersion = browserVersion + "." + client.UserAgent.Minor
  67. }
  68. }
  69. result = append(result, &dtos.UserToken{
  70. Id: token.Id,
  71. IsActive: isActive,
  72. ClientIp: token.ClientIp,
  73. Device: client.Device.ToString(),
  74. OperatingSystem: client.Os.Family,
  75. OperatingSystemVersion: osVersion,
  76. Browser: client.UserAgent.Family,
  77. BrowserVersion: browserVersion,
  78. CreatedAt: time.Unix(token.CreatedAt, 0),
  79. SeenAt: time.Unix(token.SeenAt, 0),
  80. })
  81. }
  82. return JSON(200, result)
  83. }
  84. func (server *HTTPServer) revokeUserAuthTokenInternal(c *models.ReqContext, userID int64, cmd models.RevokeAuthTokenCmd) Response {
  85. userQuery := models.GetUserByIdQuery{Id: userID}
  86. if err := bus.Dispatch(&userQuery); err != nil {
  87. if err == models.ErrUserNotFound {
  88. return Error(404, "User not found", err)
  89. }
  90. return Error(500, "Failed to get user", err)
  91. }
  92. token, err := server.AuthTokenService.GetUserToken(c.Req.Context(), userID, cmd.AuthTokenId)
  93. if err != nil {
  94. if err == models.ErrUserTokenNotFound {
  95. return Error(404, "User auth token not found", err)
  96. }
  97. return Error(500, "Failed to get user auth token", err)
  98. }
  99. if c.UserToken != nil && c.UserToken.Id == token.Id {
  100. return Error(400, "Cannot revoke active user auth token", nil)
  101. }
  102. err = server.AuthTokenService.RevokeToken(c.Req.Context(), token)
  103. if err != nil {
  104. if err == models.ErrUserTokenNotFound {
  105. return Error(404, "User auth token not found", err)
  106. }
  107. return Error(500, "Failed to revoke user auth token", err)
  108. }
  109. return JSON(200, util.DynMap{
  110. "message": "User auth token revoked",
  111. })
  112. }