RX100で撮り歩くブログ

RX100で撮った写真を中心によりよい生活を目指すブログ

AWS Amplifyで認証方法の変更とTodoを作成したユーザーに絞って取得

Amplifyの知見メモ。今回は以前やってみたものの、方法がイマイチ分からずコレジャナイ感で済ませてたのが、やっと正しい方法らしきものを発見したのでメモしておきます。

まだ走り書きみたいな状態なので、一通り手順が身についたらまとめる予定です。

App Syncの認証方法を変更

まずはこちらの記事で、Amplifyプロジェクトを立ち上げる時に認証モードをお手軽なAPI keyにしてると有効期限が切れてどうしようという問題です。

blog.mismith.me

参考にした記事はこちら。この記事ではIAMですが、Cognito User Poolに変更します。

qiita.com

最初からプロジェクトを作る場合はAPI keyを選んでいたところをCognito User Poolにすればいいですが、すでにプロジェクトを立ち上げてしまってる場合は以下のコマンドを打つ。

amplify update api

またGraphQLにするかどうかなど聞かれて選択しなおし、「Choose the default authorization type for the API」というところでAPI keyはもう不要なので、Cognito User Poolを選べばいいです。あとは残りの質問にも答え、最後までいくといろいろ処理が走りアップデートされます。

これで有効期限もなく、使えるようになりました。

Todoモデルの中からあるユーザーが作成したTodoだけを取得

続いてはこちらの記事。Amplifyのサンプルで認証+Todoアプリのサンプルはめちゃくちゃ調べるとでてきますが、そのログインしてるユーザーが登録したTodoだけをリストで取得する方法が書かれているのが、全然見当たらず困っていました。

以下の記事ではTodoモデルにownerを持たせて、user idにあたるものを登録、Todoを取得するときにAmplifyでfilterが用意されてるので、ownerでフィルタリングして取得していました。これでも意図した通りに取得できるんですが、ユーザーがたくさん増えたとして、データが膨大になった時でもこのfilterでいいのか気になっていました。そもそも検索とかサジェストで絞る時に使うものなんじゃないかとか。

blog.mismith.me

とりあえず絞れるし、何か方法見つけたら実装しようと思いつつ、Amplifyの情報を調べていた時に見つけた記事がこちら。Amplifyアドベントカレンダーの中にありました。アドベントカレンダーは情報が短期間で集まるので本当にありがたいです。

qiita.com

読み進めていくと@authという章があります。

Amplify CLI GraphQL TransformとディレクティブでAppSync+DynamoDBをいじってみよう!(@model @auth, @key) - Qiita

「amplify/backend/api/hogehoge/schema.graphql」というファイルに「@auth(rules: [{allow: owner}])」を追加すればいいようです。

その上でamplify pushで反映。

そしてownerには「Auth.currentAuthenticatedUser()」やログイン後に取得できるデータの中にあるusernameを値でもたせるようにコード修正します。そして、何かしら登録したりすると、ちゃんとそのユーザーが登録したデータだけが返ってくる様になりました。

ownerには普遍的なuidのようなものを入れるのかと思ったら、それでは動かずusernameじゃないとダメでした。他に方法あるのんでしょうか?usernameって変更される可能性ありそうだし、その場合はTodoのownerを全部修正する必要あるし...。

さいごに

まだまだ気になることはありますが、なかなか情報が得られずゆっくり実装してます。

とはいえ、基本的な機能はほぼできてるので、やっとフロント側の作り込みに着手できそうです。