Open15

Hasura の JWT Claims(AAD B2C) Mapping を試してみる

mongolyymongolyy

Hasura cloudでプロジェクトを作った時の導線が微妙に違う

ドキュメントでは繋ぐDBはHerokuになっているが、これは古そう
neonが無料で使えるようなのでこれを使ってみる

mongolyymongolyy

手順通り users テーブルを作ってみる

Row select permissionsについて、 x-hasura-user-id を指定すると書いてあるが、キャプチャでは、 X-Hasura-User-Id となっているので、それに合わせる
影響があるかはよくわからないが、、

mongolyymongolyy

ディレクトリ名の指定はなかったので、適当につけた

$ mkdir azure-function-for-hasura
$ cd azure-function-for-hasura
$ func init .

func init . の後に対話で色々聞かれたが、ドキュメント通りnode, javascriptを選択してみる

mongolyymongolyy
$ func new
Running with stdin\stdout redirected. Command must specify --template, and --name explicitly.
See 'func help function' for more details

templateとnameの指定が必要っぽい

mongolyymongolyy

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-core-tools-reference?tabs=v2 によると、func templates list で分かるっぽい

$ func templates list
JavaScript Templates:
  Azure Blob Storage trigger
  Azure Cosmos DB trigger
  Durable Functions activity
  Durable Functions entity
  Durable Functions Entity HTTP starter
  Durable Functions HTTP starter
  Durable Functions orchestrator
  Azure Event Grid trigger
  Azure Event Hub trigger
  HTTP trigger
  IoT Hub (Event Hub)
  Kafka output
  Kafka trigger
  Azure Queue Storage trigger
  RabbitMQ trigger
  SendGrid
  Azure Service Bus Queue trigger
  Azure Service Bus Topic trigger
  SignalR negotiate HTTP trigger
  SQL Input Binding
  SQL Output Binding
  SQL Trigger
  Timer trigger
  Azure Blob Storage trigger
  Azure Cosmos DB trigger
  Durable Functions entity
  Durable Functions orchestrator
  Azure Event Grid trigger
  Azure Event Hub trigger
  HTTP trigger
  Azure Queue Storage trigger
  Azure Service Bus Queue trigger
  Azure Service Bus Topic trigger
  Timer trigger
  Dapr Publish Output Binding
  Dapr Service Invocation Trigger
  Dapr Topic Trigger

HTTP trigger がいっぱいあるのが気になるが、ドキュメントにはこれが書かれているのでこれを指定してみる

func new --template "HTTP Trigger" --name "getHasuraInfo"

で、できた

mongolyymongolyy
$ npm install
up to date, audited 41 packages in 1s

3 packages are looking for funding
  run `npm fund` for details

1 low severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

$ func start
Azure Functions Core Tools
Core Tools Version:       4.0.5611 Commit hash: N/A +591b8aec842e333a87ea9e23ba390bb5effe0655 (64-bit)
Function Runtime Version: 4.31.1.22191

[2024-04-16T13:30:43.233Z] File 'C:\Program Files\dotnet\dotnet.exe' is not found, 'dotnet' invocation will rely on the PATH environment variable.
[2024-04-16T13:30:44.755Z] File 'C:\Program Files\dotnet\dotnet.exe' is not found, 'dotnet' invocation will rely on the PATH environment variable.
[2024-04-16T13:30:45.204Z] Worker process started and initialized.

Functions:

        getHasuraInfo: [GET,POST] http://localhost:7071/api/getHasuraInfo

For detailed output, run func with --verbose flag.

も普通にできた

mongolyymongolyy

Azure functionはグローバルでユニークキーでないといけないのか、、
とりあえず、作れた

VSCodeの拡張を使用したdeploy、開発者体験良い感じ

mongolyymongolyy

https://learn.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-tenant
に従って、AzureAD B2Cのテナントを作った

https://learn.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-user-flows?pivots=b2c-custom-policy
にしたがって、ポリシーキーを作成した

「Custom policy starter pack」の直前までやった

ドキュメントが英語なので、Azure Portalの言語設定も英語にした
Azure Portalの言語設定を日本語にしていると、何を指してるのかよくわからなかった

mongolyymongolyy

HasuraのドキュメントにFacebookのログインはスキップすると書いてあるので、 SocialAndLocalAccounts ではなく、 LocalAccounts のstarter packを使う

IdentityExperienceFrameworkAppIdProxyIdentityExperienceFrameworkAppIdを書き換えるときはMetadataのブロックと、InputClaimsのブロック両方を書き換えた

ポリシーのuploadをしてログインしてみようとすると

The application with identifier '<ProxyIdentityExperienceFrameworkのapplication id>' has not been granted consent and is unable to be used for local accounts.

のエラーが出る、、

mongolyymongolyy

https://stackoverflow.com/questions/53713958/the-application-has-not-been-granted-consent-and-is-unable-to-be-used-for-local

https://stackoverflow.com/questions/57443751/custom-policies-application-has-not-been-granted-consent-and-is-unable-to-be-us
を見てやってみたが、うまくいかず、、

SocialAndLocalAccounts べきだったかもしれない
が、エラーメッセージ的に、そういうことを指摘されているわけでもないように思える