亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 AWS Lambda 中創建身份驗證中間件

如何在 AWS Lambda 中創建身份驗證中間件

Go
慕的地6264312 2023-05-04 17:01:20
我正在使用 AWS Cognito 對我的用戶進行身份驗證,一旦通過身份驗證,他們就可以調用我的 API (API Gateway + Lambda)。我正在使用無服務器框架完成所有這些工作。一旦通過身份驗證,當他們調用需要此身份驗證的端點時,我的 lambda 將通過request.RequestContext.Authorizer["claims"]. 我有創建一個身份驗證中間件以將當前用戶注入上下文的想法。但我確定我做錯了什么(或者可以改進)。怎么運行的:我的 lambda.go:package mainimport (    "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.gopackage middlewaresimport (    "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)    }}型號/user.go:package modelsimport (    "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}我有兩個問題:這是定義接收函數并返回另一個函數的函數(身份驗證函數)的正確方法嗎?因為它太冗長了,我覺得這是錯誤的。有沒有辦法增加ctx一個user屬性?我正在嘗試的方式,我看到了錯誤ctx.user undefined (type context.Context has no field or method user)。
查看完整描述

1 回答

?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

關于使用中間件的第一個問題:

這種方法當然沒有錯。如果您定義函數類型并使用定義的名稱,函數看起來可能會好一些。net/http做同樣的事情HandlerFunc

type?HandlerFunc?func(ResponseWriter,?*Request)

這將使中間件的簽名更加合理:

func?AuthMiddleware(nextHop?HandlerFunc)?HandlerFunc

編輯:lambda 庫沒有為函數簽名定義這樣的類型嗎?我希望有一個存在。

另外我不知道后綴Middleware在你的情況下是否有意義,但我認為一些后綴應該對你有意義,以便為函數名稱提供更多上下文并使其更易于理解。AuthenticationMiddleware可能是一個例子。

編輯:剛剛看到包名。LGTM 真的。

第二個問題:

還有一個常見的陷阱:context.WithValue返回要使用的新上下文。因此,您不應期望傳遞的參數上下文發生變化,而應使用返回的新參數上下文。


查看完整回答
反對 回復 2023-05-04
  • 1 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號