StrapiでAPIをリクエストする際に、認証を追加してリクエストできるユーザーに制限をかける方法を試してみます。
今回の動作検証時のAPIリクエスト部分はNuxt.jsを使用しています。
設定方法
まず今回取得するコンテンツタイプを作成します。
今回はArticleという名前で作成して、以下のようなフィールドを用意しました。
権限は特に設定していないので、http://localhost:1337/articles にアクセスしても403が返ってくる状態です。
次にロールと権限を作成します。
左メニューの Settings > USERS & PERMISSIONS PLUGIN > Roles を選択して、右上のAdd new roleをクリックします。
名前をReaderにして、Application > Article でfind、findOne、countにチェックを入れて保存します。
次にユーザーを作成します。
左メニューの Users を選択して、右上のAdd New Usersをクリックします。
Roleを先ほど作成したReaderにして、それ以外は適宜設定して保存します。
これで管理画面上での設定は完了です。
APIリクエストの実装
まずは今作成したユーザーでサイト上からログインするようにNuxt.jsで実装してみます。
pagesディレクトリ内で下記内容のファイルを追加します。
<template> <h1>Hello world</h1> </template> <script> export default { async asyncData({ $axios }) { // ログイン const login = await $axios.$post('http://localhost:1337/auth/local', { identifier: 'ユーザー作成時に設定したメールアドレス', password: 'ユーザー作成時に設定したパスワード' }); console.log('login', login); } } </script>
ログイン後のAPIのレスポンスは以下のようになっています。(一部改変しています。)
{ jwt: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNTc2OTM4MTUwLCJleHAiOjE1Nzk1MzAxNTB9.UgsjjXkAZ-anD257BF7y1hbjuY3ogNceKfTAQtzDEsU', user: { id: 1, username: 'reader', email: 'xxxxx@xxxxx.xxx', provider: 'local', confirmed: false, blocked: false, role: { id: 3, name: 'Reader', description: 'Reader role', type: 'reader' }, created_at: 'XXX', updated_at: 'XXX' } }
このjwtの値をリクエストヘッダーに含めることで、APIリクエストができるようになります。
先ほどのログイン処理後に、Articleの一覧を取得するようにしてみます。
<template> <ul> <li v-for="article of articles"> {{ article.title }} </li> </ul> </template> <script> export default { data() { return { articles: [] } }, async asyncData({ $axios }) { // ログイン const login = await $axios.$post('http://localhost:1337/auth/local', { identifier: 'ユーザー作成時に設定したメールアドレス', password: 'ユーザー作成時に設定したパスワード' }); console.log('login', login); const res = await $axios.$get('http://localhost:1337/articles', { headers: { Authorization: 'Bearer ' + login.jwt, }, }); return { articles: res } } } </script>
これでArticleの一覧を取得してページに表示することができました。
コメントが承認されるまで時間がかかります。