ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
Drupalでフィールド単位で公開・非公開を設定する

Drupalでフィールド単位で公開・非公開を設定する

概要 Omeka Sではフィールド単位で公開・非公開を設定することができます。これをDrupalで実現する方法のメモです。 インストール composer.phar require 'drupal/field_permissions:^1.4' ./vendor/bin/drush en field_permissions 設定 以下のような、あるコンテンツタイプのあるフィールドの編集画面に遷移します。 /admin/structure/types/manage/bib_1/fields/node.bib_1.field_003_permission_number 以下に示すように、フィールドの可視性を設定することができます。 プログラムによるアクセス 以下のように、access関数を使って、フィールドのビュー権限をチェックすることができました。 // ログインユーザーのアカウントを取得 $current_user = \Drupal::currentUser(); $fieldDefinitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', $nodeType); foreach ($fieldDefinitions as $fieldName => $definition) { $field = $nodeEntity->get($fieldName); // フィールドのビュー権限をチェック if (!$field->access('view', $current_user)) { continue; } ... まとめ よりよい方法があるかもしれませんが、Drupalでフィールド単位での公開・非公開にあたり、参考になりましたら幸いです。

Drupal:

Drupal:

概要 Drupalでキャッシュを削除した際、以下のようなエラーが発生することがありました。 ./vendor/bin/drush cr In CheckExceptionOnInvalidReferenceBehaviorPass.php line 88: The service "access_check.contact_personal" has a dependency on a non-exist ent service "user.data". 本エラーへの対応方法に関する備忘録です。 参考 以下が参考になりました。 https://www.drupal.org/forum/support/upgrading-drupal/2018-04-26/after-upgrade-to-853-the-service-access_checkcontact 対策 Featuresモジュールにより、userというモジュールが作成されていました。 /modules/custom/user これを削除することにより、当該エラーを回避することができました。 その他 同様に、commentというモジュールが悪さをすることもありました。同様に削除することにより、エラーを回避できました。 まとめ 同様のエラーでお困りの方の参考になりましたら幸いです。

DrupalのREST APIを使って、複数のコンテンツを一括削除する

DrupalのREST APIを使って、複数のコンテンツを一括削除する

概要 DrupalのREST APIを使って、複数のコンテンツを一括削除する機会がありましたので、備忘録です。 参考 REST APIを使用せずにコンテンツを一括削除する方法として、以下も参考にしてください。 準備 まず、HTTP Basic AuthenticationモジュールとJSON:APIモジュールを有効化します。 さらに、REST resourcesにおいて、DELETEを有効化します。 /admin/config/services/rest 実行例 以下の自作ライブラリを使用します。 https://github.com/nakamura196/drupal_tools 以下でも処理内容をご確認いただけます。 https://nakamura196.github.io/drupal_tools/ インストール pip install git+https://github.com/nakamura196/drupal_tools .envの準備 DRUPAL_URL=http://example.org/drupal DRUPAL_USERNAME=username DRUPAL_PASSWORD=password 実行 以下のように実行します。 item_idsは、field_name(ここでは、field_item_id)に対応する一意の値のリストです。 from drupal_tools.api import DrupalAPIClient import pandas as pd def get_item_ids(): # Load a CSV file containing item ids into a DataFrame. df = pd.read_csv("./uuids.csv") item_ids = [row["asset_uuid"] for _, row in df.iterrows()] return item_ids # Call the function to get the list of item ids. item_ids = get_item_ids() # Load Drupal credentials from a .env file using the DrupalAPIClient. DRUPAL_URL, DRUPAL_USERNAME, DRUPAL_PASSWORD = DrupalAPIClient.load_credentials("../.env") # Create an instance of the DrupalAPIClient with the loaded credentials. drupal = DrupalAPIClient(DRUPAL_URL, DRUPAL_USERNAME, DRUPAL_PASSWORD) field_name = "field_item_id" nids = drupal.get_nids(item_ids, field_name) results = drupal.delete_from_nids(nids) まとめ 不具合等が含まれる可能性がありますので、使用される際は十分にご注意ください。 ...

Docker + Traefikで運用するDrupalのリバースプロキシ設定

Docker + Traefikで運用するDrupalのリバースプロキシ設定

概要 以下の記事で紹介したDocker + Traefikを用いて、HTTPS化したDrupalを運用していました。 この時、Drupalのデフォルト設定の場合、以下のように、httpのURLが設定されていました。 この問題として、以下の記事になるように、例えばGoogleアカウントでログインするようにした際、リダイレクトURLがhttpから始まるURLとなり、Google Cloud コンソールにはhttpsから始まるURLを入力する必要があり、この齟齬によって、認証ができないケースなどがありました。 https://drupalfan.com/【drupal】googleアカウントでログインできるようにする/ 本記事では、この問題に対処するための方法についてメモします。 方法 以下の記事が参考になりました。 https://www.58bits.com/blog/canonical-urls-https-and-drupal-89-reverse-proxy-settings 以下の3行を追加することで、Drupalの内部的にもhttpsから始まるURLに設定されました。 ... $settings['reverse_proxy'] = TRUE; $settings['reverse_proxy_addresses'] = array($_SERVER['REMOTE_ADDR']); $settings['reverse_proxy_trusted_headers'] = \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_FOR | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PROTO | \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_PORT; ... まとめ 考慮不足の点があるかもしれませんが、参考になりましたら幸いです。

Drupal: Prepopulateモジュールを使って、事前に入力する値を設定する

Drupal: Prepopulateモジュールを使って、事前に入力する値を設定する

概要 Drupalのコンテンツ作成画面にアクセスする際、クエリパラメータを指定することにより、事前に入力する値を設定することができましたので、備忘録です。以下のモジュールを使用します。 https://www.drupal.org/project/prepopulate 使い方 例えば、poemsというコンテンツタイプに新規のコンテンツを追加する際、以下のように、クエリパラメータを追加します。 </node/add/poems?edit[field_spot][widget][0][target_id]=1&edit[title][widget][0][value]=テスト> その結果、以下のように、初期値が入力された状態の登録画面が表示されます。 まとめ 参考になりましたら幸いです。

プログラムを使ってDrupalにログインする

プログラムを使ってDrupalにログインする

プログラムを使ってDrupalにログインする方法に関する備忘録です。 以下の記事が参考になりました。 https://drupal.stackexchange.com/questions/185494/how-do-i-programmatically-log-in-a-user-with-a-post-request curl --location 'http://drupal.d8/user/login?_format=json' \ --header 'Content-Type: application/json' \ --data '{ "name": "admin", "pass": "admin" }' 上記のようなリクエストをおくることで、以下のようなレスポンスを取得できました。 {"current_user":{"uid":"1","roles":["authenticated","administrator"],"name":"admin"},"csrf_token":"wBr9ldleaUhmP4CgVh7PiyyxgNn_ig8GgAan9-Ul3Lg","logout_token":"tEulBvihW1SUkrnbCERWmK2jr1JEN_mRAQIdNNhhIDc"} 参考になりましたら幸いです。

Drupalで登録済みのコンテンツをCSV形式で一括エクスポートする

Drupalで登録済みのコンテンツをCSV形式で一括エクスポートする

概要 Drupalで登録済みのコンテンツをCSV形式でエクスポートする機会があり、その備忘録です。 以下のモジュールを使用しました。 https://www.drupal.org/project/content_export_csv インストール 通常の方法でインストールできました。 composer require 'drupal/content_export_csv:^4.7' ./vendor/bin/drush en content_export_csv 使い方 インストール後、Administration > Content > Content にアクセスすると、「Export Content」ボタンが表示されます。 次の画面で、エクスポートしたいコンテンツタイプを選択することで、指定したコンテンツタイプのコンテンツ一覧をエクスポートできました。 まとめ Drupal内のコンテンツの一括エクスポートにあたり、参考になりましたら幸いです。

Drupalのイベントをトリガーとして、GitHub Actionsを起動する

Drupalのイベントをトリガーとして、GitHub Actionsを起動する

概要 Drupalのイベントをトリガーとして、GitHub Actionsを起動する方法の備忘録です。 以下のサイトが参考になりました。 https://qiita.com/hmaruyama/items/3d47efde4720d357a39e pipedreamの設定 triggerとcustom_requestを含むワークフローを作成します。 triggerについては、以下を参考にしてください。 https://qiita.com/hmaruyama/items/3d47efde4720d357a39e#pipedream側の設定 custom_requestにおいて、dispatchに関する設定を行います。 https://docs.github.com/ja/rest/repos/repos?apiVersion=2022-11-28#create-a-repository-dispatch-event 以下のような設定を行います。 curl -L \ -X POST \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer <YOUR-TOKEN>" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/OWNER/REPO/dispatches \ -d '{"event_type":"webhook"}' Drupalの設定 以下のモジュールをインストールします。 https://www.drupal.org/project/webhooks インストール後、以下のページで設定を行います。 /admin/config/services/webhook GitHub Actionsの設定 以下のようにrepository_dispatchを設定します。これにより、pipedreamからのリクエストに基づき、GitHub Actionsが実行されます。 name: Build and Deploy to Production on: push: branches: - main # Allows external webhook trigger repository_dispatch: types: - webhook permissions: contents: read concurrency: group: "build-and-deploy" cancel-in-progress: true jobs: ... まとめ pipedreamを使用せずに、Drupalのカスタムモジュールを作成することにより、GitHubに通知を送る方法もありそうです。(すでにそのようなモジュールが開発されている可能性が高そうですが、見つけることができませんでした。) ...

Drupalで翻訳がないノードの一覧を取得する

Drupalで翻訳がないノードの一覧を取得する

概要 Drupalで翻訳がないノードの一覧を取得する機会がありましたので、備忘録です。 方法 色々とやり方があるかと思いますが、今回はjsonapiを使用します。 マスタ言語が日本語(ja)、追加したい翻訳言語を英語(en)とします。 jsonapiによって、例えばcollectionというタクソノミーであれば、以下で取得できます。 https://xxx/jsonapi/taxonomy_term/collection また、以下のように/enを追加することで、翻訳ノードがある場合には、その情報が返却されます。 https://xxx/en/jsonapi/taxonomy_term/collection この時、翻訳ノードがある場合には、attributes/langcodeがenになりますが、翻訳がないノードについては、jaのままとなりました。 { "jsonapi": { "version": "1.0", "meta": { "links": { "self": { "href": "http://jsonapi.org/format/1.0/" } } } }, "data": [ { "type": "taxonomy_term--collection", "id": "1e3d1e6f-5178-4980-96bd-7b045f2cc66e", "links": { "self": { "href": "https://xxx/en/jsonapi/taxonomy_term/collection/1e3d1e6f-5178-4980-96bd-7b045f2cc66e?resourceVersion=id%3A19" } }, "attributes": { "drupal_internal__tid": 19, "drupal_internal__revision_id": 19, "langcode": "en", "revision_created": null, "revision_log_message": null, ... この性質を利用して、指定した言語と異なる言語コードがlangcodeに含まれた場合、その言語に対する翻訳がないノードとして抽出できそうです。 なお、JSON:APIの仕様に基づき、以下のようなpageクエリを使用することで、ページネーションを行うことができます。これを使って、データの一括取得を行います。 https://xxx/en/jsonapi/taxonomy_term/collection?page[offset]=50&page[limit]=50 まとめ 他にも良い方法があるかと思いますが、参考になりましたら幸いです。

DrupalのSearch APIにおいて、大文字・小文字を無視して検索する

DrupalのSearch APIにおいて、大文字・小文字を無視して検索する

概要 DrupalのSearch APIを用いた検索において、大文字・小文字を無視した検索を行うための備忘録です。 方法 以下にアクセスして、Ignore caseにチェックを入れます。 /admin/config/search/search-api/index/<コンテンツタイプ>/processors さらに画面下部のProcessor settings において、本処理を適用したいフィールドを選択します。以下のように、すべてのフィールドを選択することもできました。 再インデックスを行うことで、上記の設定が反映されます。 まとめ 参考になりましたら幸いです。

Input value "page" contains a non-scalar value.への対処

Input value "page" contains a non-scalar value.への対処

概要 以下の記事で、同エラーへの対応を行いました。 ただし、上記の対応を行なっても、エラーを解決することができないケースがありましたので、追加の対応を記載します。 エラーの内容 エラーの内容は以下です。特に、jsonapi_search_api_facetsを有効化した際に発生しました。 { "jsonapi": { "version": "1.0", "meta": { "links": { "self": { "href": "http://jsonapi.org/format/1.0/" } } } }, "errors": [ { "title": "Bad Request", "status": "400", "detail": "Input value \"page\" contains a non-scalar value.", "links": { "via": { "href": "http://localhost:61117/web/jsonapi/index/document?page%5Blimit%5D=24&sort=field_id" }, "info": { "href": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1" } }, "source": { "file": "/app/vendor/symfony/http-kernel/HttpKernel.php", "line": 83 }, "meta": { "exception": "Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException: Input value \"page\" contains a non-scalar value. in /app/vendor/symfony/http-foundation/InputBag.php:38\nStack trace:\n#0 /app/web/modules/contrib/facets/src/Plugin/facets/url_processor/QueryString.php(92): Symfony\\Component\\HttpFoundation\\InputBag->get('page')\n#1 /app/web/modules/contrib/facets/src/Plugin/facets/processor/UrlProcessorHandler.php(76): Drupal\\facets\\Plugin\\facets\\url_processor\\QueryString->buildUrls(Object(Drupal\\facets\\Entity\\Facet), Array)\n#2 /app/web/modules/contrib/facets/src/FacetManager/DefaultFacetManager.php(339): ... 対応 そこで、上記で言及されている以下のファイルについて、buildUrlsを修正しました。 <?php namespace Drupal\facets\Plugin\facets\url_processor; use Drupal\Core\Cache\UnchangingCacheableDependencyTrait; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\EventSubscriber\MainContentViewSubscriber; use Drupal\facets\Event\ActiveFiltersParsed; use Drupal\facets\Event\QueryStringCreated; use Drupal\facets\Event\UrlCreated; use Drupal\facets\FacetInterface; use Drupal\facets\UrlProcessor\UrlProcessorPluginBase; use Drupal\facets\Utility\FacetsUrlGenerator; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; use Drupal\jsonapi\Query\OffsetPage; // 追加 /** * Query string URL processor. * * @FacetsUrlProcessor( * id = "query_string", * label = @Translation("Query string"), * description = @Translation("Query string is the default Facets URL processor, and uses GET parameters, for example ?f[0]=brand:drupal&f[1]=color:blue") * ) */ class QueryString extends UrlProcessorPluginBase { ... /** * {@inheritdoc} */ public function buildUrls(FacetInterface $facet, array $results) { // No results are found for this facet, so don't try to create urls. if (empty($results)) { return []; } // First get the current list of get parameters. $get_params = $this->request->query; // When adding/removing a filter the number of pages may have changed, // possibly resulting in an invalid page parameter. /* // コメントアウト if ($get_params->has('page')) { $current_page = $get_params->get('page'); $get_params->remove('page'); } */ // 追加 if ($get_params->has(OffsetPage::KEY_NAME)) { $page_params = $get_params->all(OffsetPage::KEY_NAME); unset($page_params[OffsetPage::OFFSET_KEY]); $get_params->set(OffsetPage::KEY_NAME, $page_params); } 上記の修正は、以下のファイルを参考に、Drupal\jsonapi\Query\OffsetPageを追加して、pageの処理を修正しました。 ...

DrupalのSimple OAuthとPostmanを使ったOAuth認証の確認

DrupalのSimple OAuthとPostmanを使ったOAuth認証の確認

概要 DrupalのSimple OAuthとPostmanを使ったOAuth認証の確認を行います。 以前に以下の記事を書きましたが、もう少し掘り下げてみます。 DrupalでSimple OAuthの設定を行う 以下を参考にしてください。 https://tech.ldas.jp/ja/posts/e4ce978db12227/#oauthクライアントの作成 Postman グラントタイプがpasswordの場合 /oauth/token に対して、Body > x-www-form-urlencoded に以下を指定しました。 キー 値 grant_type password client_id {作成したCLIENT_ID。例:gt8UKlKltI4qs1XP5KLucIXiYw9ulGb0xS4RyO437dc} client_secret {作成したCLIENT_SECRET。例:test} username {ユーザ名。例:yamato} password {パスワード。例:yamato} 結果、以下のようなJSONが返却されました。 { "token_type": "Bearer", "expires_in": 300, "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJS...", "refresh_token": "def50200295e412f..." } jwt.ioで確認したところ、以下のようにデコードされました。 { "aud": "gt8UKlK...", "jti": "6dc1fee..", "iat": 1709386974, "nbf": 1709386974, "exp": 1709387274.122002, "sub": "2", "scope": [ "authenticated", "cj" ] } subはDrupalのユーザのIDに該当し、scopeはDrupalで設定した値が返却されました。 異なるユーザでログインした場合、異なるsubが与えられました。 ユーザ名またはパスワードをまちがえる 以下が返却されました。 { "error": "invalid_grant", "error_description": "The user credentials were incorrect.", "message": "The user credentials were incorrect." } 間違ったscopeを指定する 以下のように、間違ったscopeを指定します。 キー 値 grant_type password client_id {作成したCLIENT_ID。例:gt8UKlKltI4qs1XP5KLucIXiYw9ulGb0xS4RyO437dc} client_secret {作成したCLIENT_SECRET。例:test} username {ユーザ名。例:yamato} password {パスワード。例:yamato} scope test 以下が返却されました。 ...

Drupal: FeedsモジュールでURLからファイルを登録する

Drupal: FeedsモジュールでURLからファイルを登録する

概要 Feedsモジュールを使って、URLからファイルを登録する方法です。以下が参考になりました。 https://www.drupal.org/docs/contributed-modules/feeds/feeds-howtos/importing-files 方法 ドロップダウン リストからファイル フィールドを見つけて、ファイルまたは画像フィールドのマッピング ターゲットを作成します。 「ファイルID」には、完全な URL (http/https プレフィックスを含む) へのマッピングを指定します。 「Reference by」で「ファイルID」を選択します。 フィードが既存のファイルを処理するようにアクションを構成します。 これらの変更を構成した後、マッピングを保存します。 CSV 以下のようなCSVファイルを用意して登録します。 title url オタクのイラスト https://1.bp.blogspot.com/-EGQiXxfkfQA/U5gFr1g8qHI/AAAAAAAAhDM/17wwYnxWmHE/s800/otaku.png 結果、以下のように登録されました。 まとめ Feedsモジュールを用いたファイルの登録にあたり、参考になりましたら幸いです。

Drupalでファイルを一括削除する方法

Drupalでファイルを一括削除する方法

Drupalでファイルを一括削除する方法のメモです。以下が参考になりました。 https://www.drush.org/12.x/commands/entity_delete/ drush entity:delete file Drupal\Core\File\Exception\InvalidStreamWrapperExceptionなどが発生し、ファイルが閲覧できなくなってしまった際などの対処法として参考になりましたら幸いです。

Omeka Sで非公開ファイルを扱う

Omeka Sで非公開ファイルを扱う

概要 Omeka Sでは、リソース(アイテムセット、アイテム、メディアなど)単位で公開/非公開の設定を行うことができますが、メディア等に紐づけられた画像などのファイルについては、非公開の設定が適用されていても、ファイルのURLを知っていれば誰でもアクセスすることができます。通常、以下のようなURLになります。 <Omekaのインストールディレクトリ>/files/original/<ハッシュ値>.jpg メディアに非公開の設定が適用されていれば、このファイルのURLが知られることは稀かと思いますが、「リンクを知っている全員」がアクセスできてしまう状況を避けたいケースがあります。 上記に対応するモジュールとして、「Access」がありました。 https://omeka.org/s/modules/Access/ 本記事では、本モジュールについて簡単に紹介します。 参考: Drupalの場合 Drupalにおいては、Private filesを使って、上記の問題に対応することができました。この実現にあたっては、以下の記事が参考になりました。 https://wheelercreek.com/blog/how-configure-private-files-directory-drupal-9-10 ファイルをPrivate filesとして登録し、 Access Content や Field Permissions モジュールと組み合わせて、匿名ユーザによるPrivate filesへのアクセスを制限することができました。 Accessモジュールの使い方 本モジュールはIPアドレスによるアクセス制御や Guest モジュールとの組み合わせによる匿名ユーザによるアクセス制御など、多様な設定を行うことができるようです。 今回は、単純な設定として、original(オリジナル)およびlarge(オリジナルより小さいサイズの画像)、medium(ラージよりも小さい画像)などについて、匿名ユーザはoriginalおよびlargeの画像は閲覧できないが、medium以下の画像は閲覧できるようにしてみます。 つまり、非ログインユーザは、大きな画像は閲覧できないが、比較的小さな画像のみ閲覧できる環境を構築します。 インストール 通常の方法でインストールできます。 ウェブサーバの設定 この点が少し面倒かもしれません。以下に記載があります。 https://github.com/Daniel-KM/Omeka-S-module-Access?tab=readme-ov-file#configuration-of-the-web-server 以下、Apacheの例ですが、.htaccessファイルのRewriteEngine Onに後に、以下を追記します。 # Set rule for original and selected derivative files (usually at least large thumbnails). RewriteRule "^files/(original|large)/(.*)$" "/access/files/$1/$2" [P] 上記は、ドメインまたはサブドメインのルートにOmeka Sがインストールされている場合です。その他の方法でインストールされた場合の設定例についても、上記のマニュアルに記載されています。 上記により、<Omekaのインストールディレクトリ>/files/original/<ハッシュ値>.jpgなどにアクセスすると、<Omekaのインストールディレクトリ>/access/files/original/<ハッシュ値>.jpgというURLに書き換えられます。 書き換えられた後のURLはOmeka Sが動的に作成するもので、IPアドレスやログイン状態などを考慮して、画像を返却するかを決定するようです。 先に紹介したDrupalにおいては、Public filesがファイルが格納されているパス、Private filesがDrupalが動的に生成するURLになるようなので、このような切り替えをOmeka Sでも実現していることになります。 設定 モジュールのインストール後、以下のような設定画面が表示されます。今回の用途では、全てのチェックを外しておきます。 本モジュールを有効にすることにより、リソースごとにAccess levelを設定できるようになります。今回の用途では、禁止を与えます。 「いらすとや」さんの画像を利用しています。Access statusがforbiddenになっていますが、ログインユーザは当該画像を閲覧できています。 一方、非ログインユーザで画像を閲覧した際には、鍵のアイコンが表示されるようになりました。オリジナル画像等にアクセスできていないことが確認できます。 ...

Drupalのsimple_oauthモジュールを用いたRESTリソースのoauth2認証を試す

Drupalのsimple_oauthモジュールを用いたRESTリソースのoauth2認証を試す

概要 DrupalのSimple OAuth (OAuth2) & OpenID ConnectモジュールはOAuth 2.0認証フレームワークRFCの実装と説明されています。 https://www.drupal.org/project/simple_oauth 関連する記事として、cookie認証の例や、jwt認証の例も参考にしてください。 インストール simple_oauthモジュールには、5系と6系があるようですが、今回は5系を使用します。以下でインストールします。 composer.phar require 'drupal/simple_oauth:^5.2' ただし、さくらレンタルサーバを使用している場合、以下のエラーが発生しました。PHP's sodium extensionが必要でした。 composer.phar require 'drupal/simple_oauth:^5.2' ./composer.json has been updated Running composer update drupal/simple_oauth Loading composer repositories with package information Updating dependencies Your requirements could not be resolved to an installable set of packages. Problem 1 - steverhoades/oauth2-openid-connect-server v2.4.0 requires lcobucci/jwt 4.1.5 -> satisfiable by lcobucci/jwt[4.1.5]. - steverhoades/oauth2-openid-connect-server[v2.6.0, ..., v2.6.1] require lcobucci/jwt 4.1.5|^4.2|^4.3|^5.0 -> satisfiable by lcobucci/jwt[4.1.5, ..., 4.4.x-dev, 5.0.0, ..., 5.3.x-dev]. - steverhoades/oauth2-openid-connect-server v2.5.0 requires lcobucci/jwt 4.1.5|^4.2 -> satisfiable by lcobucci/jwt[4.1.5, ..., 4.4.x-dev]. - drupal/simple_oauth[5.2.0, ..., 5.x-dev] require drupal/core ^8 || ^9 -> found drupal/core[8.0.0-beta6, ..., 8.9.x-dev, 9.0.0-alpha1, ..., 9.5.x-dev] but the package is fixed to 10.2.0 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command. - lcobucci/jwt[4.1.5, ..., 4.4.x-dev, 5.0.0, ..., 5.3.x-dev] require ext-sodium * -> it is missing from your system. Install or enable PHP's sodium extension. - drupal/simple_oauth[5.2.3, ..., 5.2.x-dev] require steverhoades/oauth2-openid-connect-server ^2.4 -> satisfiable by steverhoades/oauth2-openid-connect-server[v2.4.0, v2.5.0, v2.6.0, v2.6.1]. - Root composer.json requires drupal/simple_oauth ^5.2 -> satisfiable by drupal/simple_oauth[5.2.0, ..., 5.x-dev]. To enable extensions, verify that they are enabled in your .ini files: - /usr/local/php/8.1/etc/php.ini - /usr/local/php/8.1/etc/conf.d/apcu.ini - /usr/local/php/8.1/etc/conf.d/imagick.ini - /usr/local/php/8.1/etc/conf.d/mcrypt.ini - /usr/local/php/8.1/etc/conf.d/opcache.ini You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode. Alternatively, you can run Composer with `--ignore-platform-req=ext-sodium` to temporarily ignore these required extensions. Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions. Installation failed, reverting ./composer.json and ./composer.lock to their original content. そこで、以下のサイトを参考に、PHP-sodium 拡張を追加しました。 ...

DrupalのSocial Auth GitHubモジュールを試す

DrupalのSocial Auth GitHubモジュールを試す

概要 DrupalのSocial Auth GitHubモジュールを試します。 https://www.drupal.org/project/social_auth_github/ 本モジュールは以下のように説明されています。 Social Auth GitHub allows users to register and login to your Drupal site with their GitHub account. (日本語訳)Social Auth GitHubは、ユーザーがGitHubアカウントを使用してDrupalサイトに登録およびログインすることを可能にします。 以下のように、GitHubアカウントを使用してログインできるようにすることを目指します。 インストール composer.phar require 'drupal/social_auth_github:^4.0' vendor/bin/drush en social_auth_github 上記のインストールにより、social_authとsocial_apiも有効化されます。 設定 以下のページを参考に設定を進めます。 https://www.drupal.org/project/social_auth_github/ Drupal 以下にアクセス /admin/config/social-api/social-auth さらに、以下にアクセス /admin/config/social-api/social-auth/github Authorized redirect URLの値をコピーしておきます。 GitHub OAuth Appsを作成します。以下のような入力を行います。 Drupal 以下に戻り、Client IDやClient secretを入力します。 /admin/config/social-api/social-auth/github この結果、/user/login/githubにアクセスすると、GitHubのログイン画面が表示され、成功すると、Post login pathで指定したページに戻ります。 (参考)ブロックの追加 以下のように、ログイン画面にGitHubへのログインブロックを設置してみます。 /admin/structure/blockにアクセスし、「ブロックを配置」を押します。 「Social Auth Login」の「ブロックを配置」を押します。 ...

Postmanを使って、DrupalのRESTリソースのcookie認証を試す

Postmanを使って、DrupalのRESTリソースのcookie認証を試す

概要 以下の記事で、JWTモジュールを使ったJWT認証を試しました。 今回は、cookie認証を試します。 インストール restuiモジュールをインストールしていない場合には、以下のようなコマンドをインストールと有効化を行います。 composer.phar require 'drupal/restui:^1.21' vendor/bin/drush en restui 設定 今回は、以下のように、cookie認証を使用します。設定方法の詳細については、冒頭の関連記事をご確認ください。 Postman ログイン POST /user/login Body > x-www-form-urlencoded Key Value name {ユーザー名} pass {パスワード} form_id user_login_form ログインに成功すると、Cookieが発行されます。 セッショントークンの取得 GET /session/token Headersタブをみると、先に発行したCookieが設定されていることが確認できます。また、結果としてセッショントークンが取得できています。 コンテンツの作成 POST /node?_format=json Headersタブで、上記で取得したセッショントークンをX-CSRF-TokenKeyのValueとして設定します。 Bodyの値は、以下を例として使用しました。 { "type": [ { "target_id": "article" } ], "title": [ { "value": "新しい記事のタイトル" } ] } なお、誤ったセッショントークンを入力して試してみると、以下が返却されました。 { "message": "X-CSRF-Token request header is invalid" } 参考:ログアウト GET /user/logout 上記により、発行されたセッションクッキーが削除されました。 まとめ DrupalのRESTリソースのcookie認証を試しました。誤っている点があるかと思いますが、参考になりましたら幸いです。

Drupal JSON Web Token Authenticationモジュールを試す

Drupal JSON Web Token Authenticationモジュールを試す

概要 DrupalのJSON Web Token Authenticationモジュールを試してみます。 https://www.drupal.org/project/jwt 以下のページを参考にしました。 https://preston.so/writing/decoupled-drupal-authentication-with-json-web-tokens/ なお、類似するモジュールとして、以下があるようです。 https://www.drupal.org/project/rest_api_authentication 上記モジュールを使ったjwt認証は以下で説明されています。 https://www.drupal.org/docs/contributed-modules/api-authentication/jwt-authentication しかし、以下の記事に記載したように、上記モジュールでjwt認証を使用するには有料プランに加入する必要があるようでした。 そこで、今回は、jwtモジュールのほうを試してみます。 インストールと有効化 jwtモジュール 注意点として、jwtだけでなく、jwt_auth_consumerやjwt_auth_issuerも有効化する必要がありました。 composer.phar require 'drupal/jwt:^2.0' vendor/bin/drush en jwt jwt_auth_consumer jwt_auth_issuer restuiモジュール composer.phar require 'drupal/restui:^1.21' vendor/bin/drush en restui 設定 以下にアクセスして、キーを作成します。 /admin/config/system/keys Key typeとしてJWT HMAC Keyを選択して、JWT AlgorithmとしてSHA-256を選択しました。 次に、以下にアクセスして、JWTの設定を行います。 AlgorithmとしてデフォルトのSHA-256を選択して、Secretとして先ほど作成したキー(ここではjwt)を選択します。 その後、ログインした状態で、以下にアクセスしてみます。 /jwt/token すると、以下のようなトークンが得られます。 参考までに、このトークンをjwt.ioで検証してみます。 https://jwt.io/ PAYLOADの箇所を見てみると、iat(Issued A: トークンが発行された時刻)やDrupalの「User ID」を確認することができます。 RESTリソースの設定 以下にアクセスします。 /admin/config/services/rest ここでは、コンテンツに対して、POSTを有効化し、認証プロバイダとしてjwt_authを選択します。 Postman Postmanを使って、コンテンツの作成を試してみます。 まず、Authorizationを指定せずに、コンテンツの作成試してみます。 Bodyはrawを選択して、フォーマットをJSONとします。以下の最低限のデータで、articleタイプのコンテンツの作成してみます。 { "type": [ { "target_id": "article" } ], "title": [ { "value": "新しい記事のタイトル" } ] } POST先のURLは以下です。 ...

Drupal REST & JSON API Authenticationモジュールの調査

Drupal REST & JSON API Authenticationモジュールの調査

概要 以下の記事を参考に、JWT認証を試してみます。 https://www.drupal.org/docs/contributed-modules/api-authentication/jwt-authentication ただ試してみた結果、JWT認証を行うには、有料プランに加入する必要がありそうで、そこで調査が止まりました。 前提条件: ダウンロードとインストール 以下の2つのモジュールをインストールして有効化します。 https://www.drupal.org/project/rest_api_authentication https://www.drupal.org/project/restui composer.phar require 'drupal/rest_api_authentication:^2.0' composer.phar require 'drupal/restui:^1.21' vendor/bin/drush en rest_api_authentication JWT ベースの API 認証を構成する手順 以下の説明に従って、APIを有効化して、JWTベースのAPI認証をセットアップします。 https://www.drupal.org/docs/contributed-modules/api-authentication/jwt-authentication#s-steps-to-configure-jwt-based-api-authentication しかし、メソッドを選択する場面で、以下に示すように、JWTを選択するには、プレミアムという有料プランに加入する必要がありそうでした。 まとめ 現在調査中のため、情報が不正確かもしれませんが、JWT認証を行うモジュールとして、以下があるようです。 https://www.drupal.org/project/jwt また、OAuth2を使用するモジュールとして、以下があるようです。 https://www.drupal.org/project/simple_oauth 次は、上記の2つのモジュールの使用方法について調査します。