2
0

authn.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package apitest
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "net/http/httptest"
  7. "testing"
  8. "github.com/porter-dev/porter/api/server/shared/config"
  9. "github.com/porter-dev/porter/api/types"
  10. "github.com/porter-dev/porter/internal/auth/token"
  11. "github.com/porter-dev/porter/internal/models"
  12. )
  13. // AuthenticateUserWithCookie uses the session store to create a cookie for a user
  14. func AuthenticateUserWithCookie(
  15. t *testing.T,
  16. config *config.Config,
  17. user *models.User,
  18. badUserIDType bool,
  19. ) *http.Cookie {
  20. rr2 := httptest.NewRecorder()
  21. req2, err := http.NewRequest("GET", "/login", nil)
  22. if err != nil {
  23. t.Fatal(err)
  24. }
  25. // set the user as authenticated
  26. session, err := config.Store.Get(req2, config.ServerConf.CookieName)
  27. if err != nil {
  28. t.Fatal(err)
  29. }
  30. session.Values["authenticated"] = true
  31. session.Values["user_id"] = user.ID
  32. session.Values["email"] = user.Email
  33. if badUserIDType {
  34. session.Values["user_id"] = "badtype"
  35. }
  36. if err := session.Save(req2, rr2); err != nil {
  37. t.Fatal(err)
  38. }
  39. var cookie *http.Cookie
  40. if cookies := rr2.Result().Cookies(); len(cookies) > 0 {
  41. cookie = cookies[0]
  42. } else {
  43. t.Fatal(fmt.Errorf("no cookie in response"))
  44. }
  45. return cookie
  46. }
  47. // AuthenticateUserWithToken uses the JWT token generator to create a token for a user
  48. func AuthenticateUserWithToken(t *testing.T, config *config.Config, userID uint) string {
  49. issToken, err := token.GetTokenForUser(userID)
  50. if err != nil {
  51. t.Fatal(err)
  52. }
  53. res, err := issToken.EncodeToken(config.TokenConf)
  54. if err != nil {
  55. t.Fatal(err)
  56. }
  57. return res
  58. }
  59. func WithAuthenticatedUser(t *testing.T, req *http.Request, user *models.User) *http.Request {
  60. ctx := req.Context()
  61. ctx = context.WithValue(ctx, types.UserScope, user)
  62. req = req.WithContext(ctx)
  63. return req
  64. }