ラムダ関数のHTTP認証をAuth 0とAssemblyFile ( WebBassembly +ラムダ+ APIゲートウェイ+ Rust )
20403 ワード
ああ、こんにちは!すみません、そこにお会いしませんでした.
あなたがここにいるので、話しましょうLambda 機能承認!
単独で、ラムダ関数が呼び出しを拒否する唯一の方法は、IAM方針です.これにより、AWS SDKを介してプログラムをプログラムから呼び出して別のサービスを防ぐことができます.しかし、ほとんどの場合、この方法で直接関数を呼び出すことは悪い習慣と見なされます.結合により、2つのサービス間で導入できます.
より良いアプローチは、HTTPAPI Gateway , と基本的な機能を実装の詳細にします.デカップリングに加えて、APIゲートウェイを使用すると、我々の機能を保護するためにOAuthなどのHTTP認証スキームを使用することができます!
Auth0 私たちはAPIのOAuth Authorizerを提供するために使用することができます高い評価(および使いやすい、個人的に話す)認証プラットフォームを提供しています.Autos 0は、7000人のユーザーを支持している自由な計画を提供します!
このガイドではAssemblyLift ラムダ関数を展開し、APIとAuthorizerを定義します.AssemblyLiftは、あなたが速く高性能Serverlessなアプリケーションを開発することができるオープンプラットホームです.サービス関数は、rustプログラミング言語で書かれ、webassemblyにコンパイルされます.AssemblyFill CLIは、必要なインフラストラクチャを構築し、展開するだけでなく、コードをコンパイルおよび配備することにも注意します!
準備と仮定
このガイドに従うにはAWS account あなたがすでに1を持たないならば.
また、必要がありますRust toolchain and NPM インストール.錆ツールチェーンは
したら、これらの前提条件を使用すると
⚠️ノート⚠️: あなたが以前AssemblyLiftをインストールしたならば、あなたが始める前に、あなたが最新版にいることを確認してください!バージョン
仮定された知識
簡単な機能を書く予定ですRust は、DynamoDB テーブルは、あなたがさびに精通している必要があります(私たちのダイナモの使用法は非常に基本的になります).特に、あなたは快適でなければなりません.
このガイドはかなり簡単にする必要がありますが、我々はアセンブルリフトのいくつかのもう少し高度な機能を使用する予定です.これはAssemblyLiftを使用してあなたの初めての場合は、少し簡単です見てみることを検討.
また、Adobe IAMに慣れている必要があります.必要に応じてTerraform , プロジェクトコード内からこれらのアクセス許可を設定する方法も示します.😀
プロジェクト設定
お気に入りのプロジェクトディレクトリで、新しいAssemblyFillアプリケーションを作成し、そのディレクトリに変更します.
新しいサービスと関数を生成します
Auth 0 APIを作成する
AssemblyLift Projectの設定を基に、現在のところAutos 0で新しいAPIを作成するのに良い時間です.これはJWT認証を提供します
Author 0のダッシュボードでアプリケーションのAPIに移動し、Create APIをヒットします.
署名アルゴリズムをRS 256として残し、APIに名前を付けます.識別子はOAuth 2.0でトークンを発行した認証サーバを識別するために使用されるユニークな文字列です.このAuthorizerに関連するエンドポイントのURLを使用することをお勧めしますが、あなたが好きな命名スキームを使用するには無料です!
設定
次はデータサービスマニフェストを開きましょう
Authorizerの設定
エー
パラメータを
データを書き込む
これは、実際に権威者によって保護されなければならない操作の例として、いくつかのデータをDynamoDBテーブルに書き込む比較的簡単な関数である😜
ダイナモに依存関係を追加する必要がありますIOmod . 依存関係は
すべてのIOMOD呼び出しは、RUSTS
関数のパーミッション
我々の機能がDynamoDBにアクセスするために、我々はアクセスを許す機能の実行役割にIAM方針をつけなければなりません.
残念なことに、これは現在のところアセンブルリフトtomlで直接扱われません(私たちは、私たちの時間がアセンブルリフトでどのようにパーミッションがモデル化されるかを分類しています)🙂). あなたのオプションは、AWS IAM console そして、そこにポリシーを追加するか、またはCLIによって生成されたコードを使用して独自のterraformコードを含めることができますAssemblyLiftの機能を使用することができます!
AssemblyLiftは特定の形式で指定された関数のIAMロールを生成します
あなた自身のterraformは、アセンブリの中にterraformモジュールを追加することによってAssemblyLiftプロジェクトに含まれます
そのようなモジュールの例は以下の通りです.
ビルドと展開
この部分はAssemblyliftでかなり簡単です!☺️
使用する
走る前に
関数認証のテスト
権限をテストする最も簡単な方法は
開けるDynamoDB web console を呼び出し、putitem呼び出しが動作したことを確認するあなたのオーサ0ユーザIDを持つアイテムがあるはずです!
それはすべて、人々!
あなたが質問をするならば、以下のコメントで手を伸ばすのを躊躇しないでくださいon GitHub !
あなたがここにいるので、話しましょうLambda 機能承認!
単独で、ラムダ関数が呼び出しを拒否する唯一の方法は、IAM方針です.これにより、AWS SDKを介してプログラムをプログラムから呼び出して別のサービスを防ぐことができます.しかし、ほとんどの場合、この方法で直接関数を呼び出すことは悪い習慣と見なされます.結合により、2つのサービス間で導入できます.
より良いアプローチは、HTTPAPI Gateway , と基本的な機能を実装の詳細にします.デカップリングに加えて、APIゲートウェイを使用すると、我々の機能を保護するためにOAuthなどのHTTP認証スキームを使用することができます!
Auth0 私たちはAPIのOAuth Authorizerを提供するために使用することができます高い評価(および使いやすい、個人的に話す)認証プラットフォームを提供しています.Autos 0は、7000人のユーザーを支持している自由な計画を提供します!
このガイドではAssemblyLift ラムダ関数を展開し、APIとAuthorizerを定義します.AssemblyLiftは、あなたが速く高性能Serverlessなアプリケーションを開発することができるオープンプラットホームです.サービス関数は、rustプログラミング言語で書かれ、webassemblyにコンパイルされます.AssemblyFill CLIは、必要なインフラストラクチャを構築し、展開するだけでなく、コードをコンパイルおよび配備することにも注意します!
準備と仮定
このガイドに従うにはAWS account あなたがすでに1を持たないならば.
また、必要がありますRust toolchain and NPM インストール.錆ツールチェーンは
rustup
インタラクティブインストーラ.インストール中の既定のオプションは罰金です.インストール後、インストールする必要がありますwasm32-unknown-unknown
Rusts toolchainのビルドターゲットrustup toolchain install wasm32-unknown-unknown
).したら、これらの前提条件を使用すると
cargo install assemblylift-cli
. ランasml help
インストールを確認します.⚠️ノート⚠️: あなたが以前AssemblyLiftをインストールしたならば、あなたが始める前に、あなたが最新版にいることを確認してください!バージョン
0.3.2
このガイドに影響を与えるバグ修正が含まれています.🙂仮定された知識
簡単な機能を書く予定ですRust は、DynamoDB テーブルは、あなたがさびに精通している必要があります(私たちのダイナモの使用法は非常に基本的になります).特に、あなたは快適でなければなりません.
このガイドはかなり簡単にする必要がありますが、我々はアセンブルリフトのいくつかのもう少し高度な機能を使用する予定です.これはAssemblyLiftを使用してあなたの初めての場合は、少し簡単です見てみることを検討.
また、Adobe IAMに慣れている必要があります.必要に応じてTerraform , プロジェクトコード内からこれらのアクセス許可を設定する方法も示します.😀
プロジェクト設定
お気に入りのプロジェクトディレクトリで、新しいAssemblyFillアプリケーションを作成し、そのディレクトリに変更します.
$ asml init -n auth-tutorial
$ cd auth-tutorial
を始めましょうdata
サービスは、私たちはput
新しい項目をDynamoDBテーブルに追加できる機能.新しいサービスと関数を生成します
$ asml make service data
$ asml make function data.put
AssemblyFillが新しいサービスを認識するためには、プロジェクトマニフェストに追加する必要がありますassemblylift.toml
:[project]
name = "auth0-tutorial"
[services]
data = { name = "data" }
あなたが好きなら、あなたはdefault
マニフェストからのサービスだけでなく、services/
.Auth 0 APIを作成する
AssemblyLift Projectの設定を基に、現在のところAutos 0で新しいAPIを作成するのに良い時間です.これはJWT認証を提供します
data.put
関数.Author 0のダッシュボードでアプリケーションのAPIに移動し、Create APIをヒットします.
署名アルゴリズムをRS 256として残し、APIに名前を付けます.識別子はOAuth 2.0でトークンを発行した認証サーバを識別するために使用されるユニークな文字列です.このAuthorizerに関連するエンドポイントのURLを使用することをお勧めしますが、あなたが好きな命名スキームを使用するには無料です!
設定
data
サービス次はデータサービスマニフェストを開きましょう
services/data/service.toml
, デフォルトの設定を次のように置き換えます.# data/service.toml
[service]
name = "data"
[api.functions.put]
name = "put"
http = { verb = "PUT", path = "/put" }
authorizer_id = "auth0"
[api.authorizers.auth0]
auth_type = "JWT"
Authorizerの設定
エー
JWT
最小の認可者audience
and issuer
パラメータ.オーディエンスは、あなたがあなたのAPIのために選んだ識別子です.発行者はフォームのURLになりますhttps://<tenant-id>.<region>.auth0.com
. On 0コンソールの設定タブでテナントIDと領域を見つけることができます.パラメータを
auth0
定義# data/service.toml
[api.authorizers.auth0]
auth_type = "JWT"
audience = ["your-identifier-here"]
issuer = "https://<tenant-id>.<region>.auth0.com"
データを書き込む
put
機能これは、実際に権威者によって保護されなければならない操作の例として、いくつかのデータをDynamoDBテーブルに書き込む比較的簡単な関数である😜
ダイナモに依存関係を追加する必要がありますIOmod . 依存関係は
service.toml
:# data/service.toml
[iomod.dependencies.dynamodb]
coordinates = "akkoro.aws.dynamodb"
version = "0.1.5"
また、貨物の依存性を追加する必要がありますput
関数.iomod依存性はiomodにAPIを提供する「ゲストcrates」と対をなします.CまたはC++プログラミング言語に精通している場合は、これをヘッダーファイルと同様に考えることができます.# Cargo.toml
[dependencies]
assemblylift-iomod-dynamodb-guest = "0.1"
次に、関数コードを見てみましょう.見つけるput/src/lib.rs
そして次のように更新します.// data/put/src/lib.rs
extern crate asml_awslambda;
use asml_core::GuestCore;
use asml_awslambda::*;
use assemblylift_iomod_dynamodb_guest::{put_item, structs::*};
handler!(context: LambdaContext<ApiGatewayEvent>, async {
let user_id = context.event.request_context
.unwrap()
.authorizer
.unwrap()
.claims
.unwrap()
.get("sub")
.unwrap()
.to_string();
let mut input = PutItemInput::default();
input.table_name = "auth0-tutorial".to_string(); // Change this to the name of your own DynamoDB table!
input.item = PutItemInputAttributeMap::default();
let mut pk_value = AttributeValue::default();
pk_value.s = Some(user_id);
input.item.insert(AttributeName::from("pk"), pk_value);
match put_item(input).await {
Ok(response) => http_ok!(response),
Err(err) => http_error!(err.to_string()),
}
});
この関数は PutItem
アクション、認証されたユーザIDをテーブルに書き込むauth0-tutorial
プライマリキーでpk
. ユーザIDが主キーとして書き込まれます.これはユーザデータを追跡している本当のテーブルの場合です.すべてのIOMOD呼び出しは、RUSTS
Future
, サポートを与えるawait
構文!このアクションはinput
structを構築し、HTTPレスポンスを返します.関数のパーミッション
我々の機能がDynamoDBにアクセスするために、我々はアクセスを許す機能の実行役割にIAM方針をつけなければなりません.
残念なことに、これは現在のところアセンブルリフトtomlで直接扱われません(私たちは、私たちの時間がアセンブルリフトでどのようにパーミッションがモデル化されるかを分類しています)🙂). あなたのオプションは、AWS IAM console そして、そこにポリシーを追加するか、またはCLIによって生成されたコードを使用して独自のterraformコードを含めることができますAssemblyLiftの機能を使用することができます!
AssemblyLiftは特定の形式で指定された関数のIAMロールを生成します
asml-{project name}-{service name}-{function name}
.あなた自身のterraformは、アセンブリの中にterraformモジュールを追加することによってAssemblyLiftプロジェクトに含まれます
user_tf
プロジェクトのルートでassemblylift.toml
).そのようなモジュールの例は以下の通りです.
provider aws {
region = "us-east-1"
}
data aws_caller_identity current {}
data aws_region current {}
locals {
account_id = data.aws_caller_identity.current.account_id
region = data.aws_region.current.name
prefix = "asml-auth0-tutorial"
table = "auth0-tutorial"
}
data aws_iam_role data-put {
name = "${local.prefix}-data-put"
}
data aws_iam_policy_document allow-dynamodb-put {
statement {
actions = ["dynamodb:PutItem"]
effect = "Allow"
resources = ["arn:aws:dynamodb:${local.region}:${local.account_id}:table/${local.table}"]
}
}
resource aws_iam_policy data-put-policy {
name = "${data.aws_iam_role.data-put.name}-dynamodb"
policy = data.aws_iam_policy_document.allow-dynamodb-put.json
}
resource aws_iam_role_policy_attachment data-put-policy {
role = data.aws_iam_role.data-put.name
policy_arn = aws_iam_policy.data-put-policy.arn
}
テラフォームdata
ルックアップ機能は、あなたのために作成された役割Assemblyliftをインポートするために使用されます.ここでの警告は、あなたが走る必要があるということですasml bind
少なくとも一度前に、このルックアップを追加するには、それを見つけるために!次のセクションをビルド&展開を参照してください!ビルドと展開
data
サービス!この部分はAssemblyliftでかなり簡単です!☺️
使用する
cast
コマンドを使用して関数コードをコンパイルし、terraform計画を生成します.その後、bind
シリアル化されたコードを展開するコマンド&走る前に
bind
, 実行中のすべてのプロセスの出力をチェックするcast
関数がコンパイルされたことを確認し、Terraformによって報告されたインフラストラクチャの変更が予期していないことを確認します.$ asml cast
$ asml bind
関数認証のテスト
権限をテストする最も簡単な方法は
curl
コマンドは、あなたのためにAuth 0ダッシュボードで生成されます!ダッシュボードのAPIのテストタブに移動します.探しているコマンドは以下の通りです.curl --request GET \
--url http://path_to_your_api/ \
--header 'authorization: Bearer <TOKEN>'
APIのエンドポイントURLはAWS API Gateway console . この端点はdata
サービス我々put
関数は、サービス定義tomlで定義されたパス(および動詞)です.curl --request PUT \
--url https://<api-id>.execute-api.<region>.amazonaws.com/put \
--header 'authorization: Bearer <TOKEN>'
認証ヘッダなしでエンドポイントを呼び出すと、HTTP禁断のエラーが返されます.さもなければ、空のJSONオブジェクトでHTTP OKを返すべきです{}
!開けるDynamoDB web console を呼び出し、putitem呼び出しが動作したことを確認するあなたのオーサ0ユーザIDを持つアイテムがあるはずです!
それはすべて、人々!
あなたが質問をするならば、以下のコメントで手を伸ばすのを躊躇しないでくださいon GitHub !
Reference
この問題について(ラムダ関数のHTTP認証をAuth 0とAssemblyFile ( WebBassembly +ラムダ+ APIゲートウェイ+ Rust )), 我々は、より多くの情報をここで見つけました https://dev.to/akkoro/lambda-function-http-authorization-with-auth0-and-assemblylift-webassembly-lambda-api-gateway-rust-4fl8テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol