AWS Lambda内に認証ミドルウェアを作成する方法

エヴァヌッソ:

AWS Cognitoを使用してユーザーを認証しています。認証されると、ユーザーはAPI(API Gateway + Lambda)を呼び出すことができます。サーバーレスフレームワークを使用して、すべてを行っています。

認証されると、この認証を必要とするエンドポイントを呼び出すと、ラムダはを介してユーザー属性を受け取りますrequest.RequestContext.Authorizer["claims"]現在のユーザーをコンテキストに挿入する認証ミドルウェアを作成するというアイデアがありました。しかし、私は何か間違っている(または改善できる)と確信しています。

使い方:

my-lambda.go:

package main

import (
    "context"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/company/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),
    )
}

ミドルウェア/authentication.go

package middlewares

import (
    "context"

    "github.com/aws/aws-lambda-go/events"
    "github.com/company/api/models"
)

func Authentication(next func(context.Context, events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error)) func(context.Context, events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    var 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
        }

        ctx.user = user
        return next(ctx, request)
    }
}

models / user.go:

package models

import (
    "github.com/jinzhu/gorm"
    "github.com/mitchellh/mapstructure"
)

type User struct {
    gorm.Model
    // Override ID cause we are using cognito.
    Email string `gorm:"primary_key,not null"`
    Site  Site
}

func (u *User) Current(claims interface{}) error {
    if err := mapstructure.Decode(claims, u); err != nil {
        panic(err)
    }

    if err := Database.Find(u).Error; err != nil {
        return err
    }
    return nil
}

2つの質問があります。

  • これは、関数を受け取って別の関数を返す関数(認証関数)を定義する正しい方法ですか?冗長すぎるため、これは間違っていると感じています。
  • 増強する方法があるctxとのuser属性は?私が試みている方法で、エラーが表示されますctx.user undefined (type context.Context has no field or method user)
Mohammad Nasirifar:

ミドルウェアの使用に関する最初の質問:

確かにこのアプローチには何も問題はありません。関数のタイプを定義し、定義した名前を使用すると、関数の外観が少し良くなる可能性があります。net/http同じことをHandlerFunc

type HandlerFunc func(ResponseWriter, *Request)

これにより、ミドルウェアの署名がより合理的になります。

func AuthMiddleware(nextHop HandlerFunc) HandlerFunc

編集:ラムダライブラリは関数シグネチャにそのようなタイプを定義していませんか?存在すると思います。

また、接尾辞Middlewareがあなたの場合に意味があるかどうかはわかりませんが、関数の名前にもう少しコンテキストを与えて理解しやすくするために、いくつかの接尾辞は意味があるはずです。AuthenticationMiddleware例かもしれません。

編集:パッケージ名を見ただけです。LGTMは本当に。

2番目の質問:

の正しい使い方については、こちらご覧くださいcontext共通の落とし穴もありcontext.WithValueます。使用する新しいコンテキストを返します。したがって、渡されたパラメータコンテキストが変更されることを期待してはならず、返される新しいコンテキストを使用する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

AWS Lambda関数で外部認証情報を(適切に)使用する方法は?

分類Dev

AWS S3にファイルをアップロード/ダウンロードする前に、Webサーバーで認証します

分類Dev

AWS CDK OpenApi仕様からLambdaに裏打ちされたAPIゲートウェイを作成する方法は?

分類Dev

CognitoAuth認証オブジェクトをAWS-SDK認証情報に変換する方法

分類Dev

aws-amplifyでMFA認証を無効にする方法は?

分類Dev

AWSクラウドフロントログをほぼリアルタイムで確認する方法

分類Dev

AWS Lambda Python RestAPIからファイルをダウンロードする方法

分類Dev

ターミナルでAWS認証情報を編集するにはどうすればよいですか?

分類Dev

AWSでAPIキーペアの認証/承認を実装する方法

分類Dev

Googleアカウントを認証してAWS Cognitoユーザープールに追加するにはどうすればよいですか?

分類Dev

AWS Lambdaにphantomjsノードアプリをデプロイする方法は?

分類Dev

AWS Bitnami Parse Server-HTTP認証を追加すると、解析ダッシュボード内のアプリが「無許可」になります

分類Dev

AWS googleapi認証

分類Dev

AWS CognitoHTTP認証

分類Dev

AWS CLI構成と認証情報ファイルの行をコメントアウトするにはどうすればよいですか?

分類Dev

AWS CLI構成と認証情報ファイルの行をコメントアウトするにはどうすればよいですか?

分類Dev

AWS CLI構成と認証情報ファイルの行をコメントアウトするにはどうすればよいですか?

分類Dev

AWS Amplify Auth / react-navigation:認証状態にアクセスする方法は?

分類Dev

AWS Lambdaにnpmモジュールをロードする方法は?

分類Dev

aws lambdaにlibフォルダーをロードする方法は?

分類Dev

ASP.NETCoreで不要な場合に認証ミドルウェアをバイパスする方法

分類Dev

AWS認証情報をDockerに渡す

分類Dev

C#.NETコアコンソールプログラムでAWS認証情報を指定する方法

分類Dev

AWS認証情報CSVをオブジェクトに変換する

分類Dev

AWS Lambda:VPCアクセスでラムダ関数のNATゲートウェイを設定する方法

分類Dev

AWS Lambda:VPCアクセスでラムダ関数のNATゲートウェイを設定する方法

分類Dev

AWS Lambda:VPCアクセスでラムダ関数のNATゲートウェイを設定する方法

分類Dev

aws-sdk-goを使用してファイルを作成せずにオブジェクトをAWS S3にアップロードする

分類Dev

AWS認証情報を取得してDockerのS3にアクセスする方法

Related 関連記事

  1. 1

    AWS Lambda関数で外部認証情報を(適切に)使用する方法は?

  2. 2

    AWS S3にファイルをアップロード/ダウンロードする前に、Webサーバーで認証します

  3. 3

    AWS CDK OpenApi仕様からLambdaに裏打ちされたAPIゲートウェイを作成する方法は?

  4. 4

    CognitoAuth認証オブジェクトをAWS-SDK認証情報に変換する方法

  5. 5

    aws-amplifyでMFA認証を無効にする方法は?

  6. 6

    AWSクラウドフロントログをほぼリアルタイムで確認する方法

  7. 7

    AWS Lambda Python RestAPIからファイルをダウンロードする方法

  8. 8

    ターミナルでAWS認証情報を編集するにはどうすればよいですか?

  9. 9

    AWSでAPIキーペアの認証/承認を実装する方法

  10. 10

    Googleアカウントを認証してAWS Cognitoユーザープールに追加するにはどうすればよいですか?

  11. 11

    AWS Lambdaにphantomjsノードアプリをデプロイする方法は?

  12. 12

    AWS Bitnami Parse Server-HTTP認証を追加すると、解析ダッシュボード内のアプリが「無許可」になります

  13. 13

    AWS googleapi認証

  14. 14

    AWS CognitoHTTP認証

  15. 15

    AWS CLI構成と認証情報ファイルの行をコメントアウトするにはどうすればよいですか?

  16. 16

    AWS CLI構成と認証情報ファイルの行をコメントアウトするにはどうすればよいですか?

  17. 17

    AWS CLI構成と認証情報ファイルの行をコメントアウトするにはどうすればよいですか?

  18. 18

    AWS Amplify Auth / react-navigation:認証状態にアクセスする方法は?

  19. 19

    AWS Lambdaにnpmモジュールをロードする方法は?

  20. 20

    aws lambdaにlibフォルダーをロードする方法は?

  21. 21

    ASP.NETCoreで不要な場合に認証ミドルウェアをバイパスする方法

  22. 22

    AWS認証情報をDockerに渡す

  23. 23

    C#.NETコアコンソールプログラムでAWS認証情報を指定する方法

  24. 24

    AWS認証情報CSVをオブジェクトに変換する

  25. 25

    AWS Lambda:VPCアクセスでラムダ関数のNATゲートウェイを設定する方法

  26. 26

    AWS Lambda:VPCアクセスでラムダ関数のNATゲートウェイを設定する方法

  27. 27

    AWS Lambda:VPCアクセスでラムダ関数のNATゲートウェイを設定する方法

  28. 28

    aws-sdk-goを使用してファイルを作成せずにオブジェクトをAWS S3にアップロードする

  29. 29

    AWS認証情報を取得してDockerのS3にアクセスする方法

ホットタグ

アーカイブ