初心者による初心者のためのInternet Computerチュートリアル備忘録その12「Add access control with identities」
プログラミング(C#)歴半年の私でりおてんちょーが、Internet Computerチュートリアルを進めていく上で
- 分かりづらかったところ
- めっちゃ調べたところ
などを、備忘録としてこちらにまとめていきます。
【目次】
Internet Computerチュートリアル備忘録その1「Explore the default project」
Internet Computerチュートリアル備忘録その2「Query using an actor」
Internet Computerチュートリアル備忘録その3「Pass text arguments」
Internet Computerチュートリアル備忘録その4「Increment a natural number」
Internet Computerチュートリアル備忘録その5「Use integers in calculator functions」
Internet Computerチュートリアル備忘録その6「Import library modules」
Internet Computerチュートリアル備忘録その7「Use multiple actors」
Internet Computerチュートリアル備忘録その8「Customize the front-end」
Internet Computerチュートリアル備忘録その9「Add a stylesheet」
Internet Computerチュートリアル備忘録その10「Make inter-canister calls」
Internet Computerチュートリアル備忘録その12「Add access control with identities」
Internet Computerチュートリアル備忘録その13「Accept cycles from a wallet」
Internet Computerチュートリアルが終わったらやること1「examplesを動かして遊ぶ」
今回は、12個目のチュートリアル「Add access control with identities 」についてです。
これからInternet Computerチュートリアルを始める方に、少しでも役立てていただけると幸いです。
また、この記事ではMacでの作業となりますこと、あらかじめご了承ください。
※11個目のチュートリアル「Create scalable apps」に関しては読み物なので、備忘録としての記事化の方は割愛させていただきます。
新しいプロジェクトを作成する
1. ターミナルシェルをまだ開いていない場合は、ローカルコンピューターで開きます。
まずはターミナルを開きます。
2. 別の作業フォルダーを使用している場合は、インターネットコンピュータープロジェクトに使用しているフォルダーに移動します。
クイックスタートで「ic-projects」というフォルダを作り、私はそこにまとめるようにしたので、『cd ic-projects』で移動します。
ちなみに『pwd』コマンドで、現在の場所が確認できますよ。(pwd:print working directoryの略)
3. 『dfx new access_hello』のコマンドを実行して、新しいプロジェクトを作成します。
この呪文で∞マークっぽいのが表示されれば、プロジェクトの作成成功です。
4. 『cd access_hello』のコマンドを実行して、プロジェクトディレクトリに移動しておきます。
デフォルトのプログラムを変更する
1. 「src/access_hello/main.mo」ファイルをテキストエディタで開き、既存のコンテンツを削除します。
これを全部削除します。
2. 次のサンプルコードをコピーしてmain.moファイルに貼り付けます。
チュートリアルのコードをコピペします。
プログラムのいくつかの重要な要素については、チュートリアルを一読しておきましょう。
3. 変更を保存し、main.moファイルを閉じて続行します。
「command + S」で保存して終了しましょう。
ローカルネットワークを開始します
『dfx start --background』のコマンドを実行して、ローカルコンピューターでインターネットコンピューターネットワークを起動しましょう。
--backgroundオプションを使うことで、ローカルコンピューターで別のターミナルシェルを開かずに済みますよ。
アプリケーションを登録、ビルド、およびデプロイする
1. 必要に応じて、プロジェクトのルートディレクトリにいることを確認してください。
「access_hello」にいることを確認しましょう。
2. 『dfx deploy access_hello』のコマンドを実行して、アプリケーションを登録、ビルド、およびデプロイします。
現在のIDコンテキストを確認します
1. 『dfx identity whoami』のコマンドを実行して、現在アクティブなIDを確認します。
「default」と表示されます。
2. 『dfx identity get-principal』のコマンドを実行して、プリンシパルのdefaultのユーザーIDを確認します。
こんな感じで出力されます。
3. 『dfx canister --wallet=$(dfx identity get-wallet) call access_hello my_role』のコマンドを実行して、defaultのユーザーIDに関連付けられているロールを確認します。
defaultのユーザーIDは「owner」になっていますね。
ちなみに補足ですが、my_role関数はmain.moファイルの90行目で定義しています。
『return get_role』となっていますが、そのget_role関数に「owner」の表記が見当たりますね。
新しいユーザーIDを作成する
プログラムでアクセス制御のテストを開始するために、いくつかの新しいユーザーIDを作成し、それらのユーザーを異なるroleに割り当てていきます。
1. 必要に応じて、プロジェクトのルートディレクトリにいることを確認してください。
「access_hello」にいることを確認しましょう。
2. 『dfx identity new ic_admin』のコマンドを実行して、新しいadminユーザーIDを作成します。
こんな感じで出力されます。
3. my_role関数を呼び出して、新しいユーザーIDがどのロールにも割り当てられていないことを確認します。
nullは何もないという意味なので、どのロールにも割り当てられていないことを示しています。
4. 『dfx identity use ic_admin && dfx identity get-principal』のコマンドを実行して、現在アクティブなIDコンテキストを切り替えて新しいic_adminユーザーIDを使用し、ic_adminユーザーに関連付けられているプリンシパルを表示します。
こんな感じで出力されます。(この出力は後で使うのでメモしておきましょう。)
5. 『dfx canister call access_hello callerPrincipal』のコマンドを実行して、access_helloキャニスターの呼び出しに使用されるプリンシパルを確認します。
アクセス制御を説明するためには、ユーザーコンテキストに関連付けられたプリンシパルを使用する必要があります。
ただし、その手順に進む前に、ic_adminユーザーにroleを割り当てましょう。
これを行うには、ownerのroleを持つdefaultのユーザーIDに切り替える必要があります。
IDにroleを割り当てます
1. 『dfx identity use default』のコマンドを実行して、現在アクティブなIDコンテキストを切り替えてdefaultのユーザーIDを使用します。
2.『dfx canister --wallet=$(dfx identity get-wallet) call access_hello assign_role '((principal "c5wa6-3irl7-tuxuo-4vtyw-xsnhw-rv2a6-vcmdz-bzkca-vejmd-327zo-wae"),opt variant{admin})'』のようなコマンドを実行することにより、ic_adminプリンシパルにadmin roleを割り当てます。
※「"c5wa6-3irl7-tuxuo-4vtyw-xsnhw-rv2a6-vcmdz-bzkca-vejmd-327zo-wae"」の部分は、「新しいユーザーIDを作成する」の4. で出力されたものを使用します。
()と出力されました。
+++
オプションで、『dfx --identity ic_admin canister call access_hello my_role』コマンドを再実行してmy_role関数を呼び出し、roleの割り当てを確認できます。
ちゃんとroleがadminに変更されていますね。
1. 最後に『dfx --identity ic_admin canister call access_hello greet "Internet Computer Admin"』のコマンドを実行して、admin roleを割り当てたic_adminユーザーIDを使用してgreet関数を呼び出してみます。
authorizedユーザーIDを追加
owner、adminと追加できたので、次はauthorizedのroleを追加します。
1. 必要に応じて、プロジェクトのルートディレクトリにいることを確認してください。
「access_hello」にいることを確認しましょう。
2. 『dfx identity new alice_auth』のコマンドを実行して、新しいadminユーザーIDを作成します。
こんな感じで出力されます。
3. 『dfx identity use alice_auth』のコマンドを実行して、現在アクティブなIDコンテキストを切り替えて新しいalice_authユーザーIDを使用します。
4. 『ALICE_ID=$(dfx identity get-principal)』のコマンドを実行して、alice_authユーザーのプリンシパルを環境変数に格納します。
さらに『echo $ALICE_ID』のコマンドを実行して、保存されているプリンシパルを確認できます。
5. 下のコマンドを実行して、ic_admin IDを使用し、authorized roleをalice_authに割り当てます。
※『$ALICE_ID』には、4. で出力したものを貼り付けます。
()と出力されました。
6. my_role関数を呼び出して、roleの割り当てを確認します。
ちゃんとroleがauthorizedに変更されていますね。
7. 『dfx canister call access_hello greet "Alice"』のコマンドを実行して、authorized roleを割り当てたばかりのalice_authユーザーIDを使用してgreet関数を呼び出します。
unauthorized(権限のない)ユーザーIDを追加する
roleに割り当てられていない、または特別なアクセス許可が与えられていないユーザーIDを作成します。
1. 必要に応じて、プロジェクトのルートディレクトリにいることを確認してください。
「access_hello」にいることを確認しましょう。
2. 必要に応じて、『dfx identity whoami』のコマンドを実行して、現在アクティブなIDを確認します。
『alice_auth』と出力されるはずです。
3. 『dfx identity new bob_standard』のコマンドを実行して、新しいユーザーIDを作成します。
こんな感じで出力されます。
4. 『BOB_ID=$(dfx --identity bob_standard identity get-principal)』のコマンドを実行して、bob_standardユーザーのプリンシパルを環境変数に格納します。
5. bob_standardIDを使用して、roleを割り当ててみてください。
『The Replica returned an error: code 4, message: "unauthorized"』
と返されました。
6. 下のコマンドを実行して、defaultのユーザーIDを使用してbob_standardにowner roleを割り当ててみます。
しかし、ユーザーにowner roleを割り当てることができないため、このコマンドは失敗します。
6. 下のコマンドを実行して、bob_standardユーザーIDを使用してgreet関数を呼び出します。
以下のように出力されれば、成功です。
複数のコマンドのユーザーIDを設定する
1つのユーザーIDで、複数のコマンドを実行していきます。
1. 必要に応じて、プロジェクトのルートディレクトリにいることを確認してください。
「access_hello」にいることを確認しましょう。
2. 『dfx identity list』のコマンドを実行して、現在使用可能なユーザーIDを一覧表示します。
現時点でアクティブなユーザーID(ここではalice_auth)には『*』がついています。
3. リストから新しいユーザーIDを選択し、『dfx identity use ic_admin』のようなコマンドを実行して、それをアクティブなユーザーコンテキストにします。
『dfx identity list』コマンドを再実行すると、ic_adminユーザーIDに『*』が表示され、現在アクティブなユーザーコンテキストであることを示します。
これで、コマンドラインで--identityを指定せずに、選択したユーザーIDを使用してコマンドを実行できるようになりました。
ローカルネットワークを停止します
テストができたら、最後にローカルネットワークを止めておきましょう。
ターミナルが現在稼働中であれば「Control-C」を押して、「%」が表示される状態にします。
最後に『dfx stop』コマンドを入力すれば、12個目のチュートリアルは終了です。お疲れ様でした。
思っていた以上に多くの反響をいただき、大変ありがたい次第です。よければHiÐΞやTwitterのフォローお願い致します!
需要がありそうであれば、他のチュートリアルも備忘録を残していきますので、何かしらアクションいただけると大変励みになりますし嬉しいです!
次はこちら(↓)をどうぞ
初心者による初心者のためのInternet Computerチュートリアル備忘録その13「Accept cycles from a wallet」