Shota-Yukawa / AddresserHouse-Auth

0 stars 0 forks source link

authサービスのjwtissuerの実装 #17

Open Shota-Yukawa opened 2 months ago

Shota-Yukawa commented 2 months ago

16 で勉強して、

とりあえず、sam local start-apiでhello worldを動かせた状態(かつエンドポイント等は変更)した状態で、push済み

kmsを使用して、秘密鍵と公開鍵のキーペアを使用した jwtの発行を行う。 下記を参考に(GPTより)

package main

import (
    "fmt"
    "time"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/kms"
    jwt "github.com/form3tech-oss/jwt-go"
)

// AWSセッションを作成
var sess = session.Must(session.NewSessionWithOptions(session.Options{
    SharedConfigState: session.SharedConfigEnable,
}))

// AWS KMSサービスクライアントを作成
var kmsClient = kms.New(sess)

// CMKのARN
var cmkArn = "YOUR_CMK_ARN"

func main() {
    // JWTの発行
    tokenString, err := issueJWT()
    if err != nil {
        fmt.Println("Error issuing JWT:", err)
        return
    }
    fmt.Println("Issued JWT:", tokenString)

    // JWTの検証
    err = verifyJWT(tokenString)
    if err != nil {
        fmt.Println("Error verifying JWT:", err)
        return
    }
    fmt.Println("JWT verified successfully")
}

// JWTの発行
func issueJWT() (string, error) {
    // AWS KMSから秘密鍵を取得
    keyInput := &kms.GenerateDataKeyInput{
        KeyId:   aws.String(cmkArn),
        KeySpec: aws.String("AES_256"),
    }
    keyOutput, err := kmsClient.GenerateDataKey(keyInput)
    if err != nil {
        return "", err
    }

    // JWTのペイロード
    claims := jwt.MapClaims{
        "username": "example_user",
        "exp":      time.Now().Add(time.Hour * 1).Unix(),
    }

    // JWTトークンの署名
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    tokenString, err := token.SignedString(keyOutput.Plaintext)
    if err != nil {
        return "", err
    }

    return tokenString, nil
}

// JWTの検証
func verifyJWT(tokenString string) error {
    // AWS KMSから秘密鍵を取得
    keyInput := &kms.GetPublicKeyInput{
        KeyId: aws.String(cmkArn),
    }
    keyOutput, err := kmsClient.GetPublicKey(keyInput)
    if err != nil {
        return err
    }

    // JWTトークンの検証
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        return keyOutput.PublicKey, nil
    })
    if err != nil || !token.Valid {
        return fmt.Errorf("invalid JWT: %v", err)
    }

    return nil
}
Shota-Yukawa commented 2 months ago

jwtの発行もそうだが、 NoSQLを使用して、ユーザーパスの認証前提で、jwt発行すること。

Shota-Yukawa commented 2 weeks ago

ちょっとsamのvscodeでのデバックができなくなって対処に時間かかった、

invokeTarget.target:code のデバック設定だと実行できた。

{
            "type": "aws-sam",
            "request": "direct-invoke",
            "name": "CODE addresser-jwtissuer:JwtIssuerFunction (go1.x)",
            "invokeTarget": {
                "target": "code",
                "projectRoot": "jwtissuer/addresser-jwtissuer/jwtissuer",
                "lambdaHandler": "app.lambda_handler"
            },
            "lambda": {
                "runtime": "go1.x",
                "payload": {},
                "environmentVariables": {}
            },
            "debugServer": 5858
        }