title: How to properly augment context
body: <p>I'm trying to create an authentication middleware in my Lambda, which basically injects a property <code>user</code> in the <code>ctx</code> struct, and call the handler function. How I'm doing:</p>
  
  <p>middlewares/authentication.go:</p>
  
  <pre><code>package middlewares
  
  import (
      "context"
  
      "github.com/aws/aws-lambda-go/events"
      "github.com/passus/api/models"
  )
  
  func Authentication(next MiddlewareSignature) MiddlewareSignature {
      user := models.User{}
  
      return func(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
          claims := request.RequestContext.Authorizer["claims"]
  
          // Find user by claims properties.
          if err := user.Current(claims); err != nil {
              return events.APIGatewayProxyResponse{}, err
          }
  
          // Augment ctx with user property.
          ctx = context.WithValue(ctx, "user", user)
          return next(ctx, request)
      }
  }
  </code></pre>
  
  <p>my-lambda.go:</p>
  
  <pre><code>package main
  
  import (
      "context"
      "fmt"
  
      "github.com/aws/aws-lambda-go/events"
      "github.com/aws/aws-lambda-go/lambda"
      "github.com/passus/api/middlewares"
  )
  
  func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
      fmt.Println(ctx.user)
  
      return events.APIGatewayProxyResponse{}, nil
  }
  
  func main() {
      lambda.Start(
          middlewares.Authentication(Handler),
      )
  }
  </code></pre>
  
  <p>The problem with this approach is that: it doesn't work. I see the following error when I try to build it: <code>create/main.go:13:17: ctx.user undefined (type context.Context has no field or method user)</code></p>
  
  <p>Thank you in advance.</p>