概要

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.pharrequire'drupal/simple_oauth:^5.2'

ただし、さくらレンタルサーバを使用している場合、以下のエラーが発生しました。PHP's sodium extensionが必要でした。

cRLUYTYAUIo/uopooolsnmcnaduPutespondarreetomiito-------ncrtaspnnirbaanhleoggnelsssdldRb/////naelrsgqetttrcroluuuuuta.eccumeeeuouoesssssaiotproodivvvpbptrrrrrlvpih.mmer1eeeauae/////setoajppperrrlclcxlllllolinrsooemhhhc/otoooooyoossneoosismecccccr,nfrneednaaai/ipnaaaaauaerretdddmjmoslllllnyiqhnseeepwpsi////o-luaurcsssltleppppp`uweispeic/e[ernhhhhhpidrdpeoo_4_.sppppphct,ebaosuaaao.oj,/////pahetsluuua1as88888n-r'eeidtttu.uov.....aednthhht5tne11111-rlvrdon222h,hr/////iuleuurro---[[rieeeeenn-rppuitooo55eftttttidtadpeppp..qyccccc`Ceilaasbeee2.2u/////opn/tlennn.,.itpccccimegse/wiii03rhhoooonpnidsirddd,4,eapnnnnodmite---.st.ffffase/pmhsccc4i....enclpoooo.dtnddddtrcoelplnnn.x.rhi////eim_eavnnn,-,ueaimorwepo_ceeeedpypmcpmisoaokdccc5e5acarcitsuaattt.v.laugyanhetugt---x,2r.ipca-rhteosss-.seicthl`W.:heeed5xink.e-)j^iarrre.-mei.i.t-s5nnvvvv0dpninioito.feee].elaningon2oirrr0vebiisn'rn[r,]_leoaamsvvveoeerlnat222qradeldta...ueuw-oil465i.qtihpwol...r,uhnil/na000eicaucb,5r^yhtpolrrd.e5ofgmeeer3.uforpqqu.s2riraosu.upxtlmdsei,ia-e.e-eetrrldvisrsreve/eene,.os2scvrsiaqlf.o]har=dol6lrotfeeocpc.ceraiixwkao1oedslutncb]b^qefes-gtkuu8usisesroacrci/a:doagcecrobddteiqiealbiehs/u/ueyuse.jij^etmiwrw9xhbP`artett2yHn--Ptdo4l4sodor.c.opriri1o1fdeunteg.b.oinpemi5u5uuiaCmonc|nmdlLpvac^d-/Ioali4csrl/.doimascsj2rnmoroawunpdifnttpelelotiaice.yres4ltt_nf.s/-oipti1acisaga.a.toseuncb5irrtokl|semvhrae^f[ie[eg4i8sr5eb.a.s.tsy2b0i^2h|l.n2.ecl^e0g.0suc4-4,ero.bbfrb3yerreu|toenc^lam.qtc5c6s,uli.o,yaiy0bot5rjuui.elwcrsxdotc.f-c[i,sidek4s/yaexe.aj8sbvtd1tw.tl]e.it9ee.nt5s[.mso]f4x.bi.i.-yosa1dInpb.enssel5vst.ce,,teiavfb9leiy.lrc.0hl,.oovc0raeo4-drb.aeesu4lnsic.pa/ocxhboni-alas/d1eu.je,twvPht]H2[.P-4.'o.,sp1e.9sn5.oi,5dd.i-xuc-mo.dn,eenvxe4]tc.et4bn-.ussxtie-ordtnveh.ever,[pv5a2.c.0k4.a.0g0,e,ivs2..,f5i.5x0.e,3d.vxt2-o.d6e1.v00].,.2.v02.(6l.o1c]k.fileversion)byapartialupdateandthatversiondoesnotmatch.Makesureyoulistitasanargumentfortheupdatecommand.

そこで、以下のサイトを参考に、PHP-sodium 拡張を追加しました。

https://qiita.com/tomcat0090/items/2564baa9179747b4d855

ただし、上記のサイトではPHPのバージョンが8.0系を対象にしているのに対して、今回使用しているPHPのバージョンが8.1.24だったため、「3. Download and Compile PHP Extension」の部分を一部変更しています。

#m#cwtcmm#cwtc/mg#cceE#pskdgad/aadgadu/ampaxOho1d2erckk3erscka4ttF5pd.i.~tloee.~tprek.me.ir/xin/-hneon-uCDuhzbf&iDuhxplfId<sVcmr-ostvsi&nostj-oitnuEieepwrtfogswrtf8cgeslOor~an/pdumtn/p.austeFni/t{llsliraallsp1lrtas=fwe~oo:iuekloo:h./el/$yw/ac/bmelac/p2plsHwWuda/s-da/-4hoOI/osldo1-clw8p-td$Mnprra/od.pha/w.e/whiHEshk/nswi0rensw1x8ieuO/tpildrnu.ecdr..t.tmMua.noclm1fkcp21hP.EsligcCo-8iCh4s-Hsrlnaoa1xop.bpPw/aiDlmd.=m.tdihwlti/p.0$pnainpE~wi-rsil.Hieru/-x/comerli1Olt.mpctupancceb8Mebhoeshl|t,s.Edzpnnrpo~lot/Pi2ifs/.pgr/idauHsziilihriubirsPtegoonpeessu.rr=nci/psromg/Ei/ae/d.zlxb#ulxsliootus/toourcetErpedcmganin/hnia/lsoslpsullinuo/im/iosrceopbn/eaxnhsplt/poht/es/dphpnoei-ihsdxu8spiitm./oue/1p8nmnr.o./.se2i1sil4n/ooe.tbnatsi}sanerts.p/bhlzypi2o-bucsroo#ndPfiAHiudPgmj-u81s.-.t1w0i.lbt1iih8nn-.kastroafydroi.rugmzthPeKGc_oCrOrNeFcItG_PPHAPTH8=.$1H.O2M4E/suosurr/cleocal/lib/pkgconfig/LDFLAGS=-L$HOME/usr/local/lib/

上記を行った後に、再度以下を実行した結果、モジュールのインストールに成功しました。

composer.pharrequire'drupal/simple_oauth:^5.2'

その後、以下でモジュールを有効化しました。

vendor/bin/drushensimple_oauth

OAuthクライアントの作成

simple_oauthモジュールの設定に関するドキュメントをうまく見つけることができなかったのですが、今回は以下の「Next.js for Drupal」のドキュメントを参考にします。

https://next-drupal.org/learn/preview-mode/create-oauth-client

操作方法は上記のドキュメントに記載されていますので、画面キャプチャやメモを以下に記載します。

1. Create Role

/admin/people/roles

2. Assign Permissions

特に、Bypass content access controlは後述の過程で必要な項目のようでした。

3. Create User

/admin/people/create

今回は、nextという名前のユーザを作成しました。

4. Generate keys

/admin/config/people/simple_oauth

Generate keys を行うにあたり、../が例示されていますが、さくらレンタルサーバを使用している場合には、/home/{ユーザ名}/.ssh/drupalなどのほうが適切かと考えられます。

そのため、まず以下のようなコマンドでフォルダを作成し、

mkdir-p/home/{}/.ssh/drupal

Generate keys のボタンをクリックした際に表示されるフォームに、上記のパスを入力します。

その後、「構成を保持」のボタンをクリックして、設定を保存します。

5. Create Consumer

/admin/config/services/consumer/add

以上で、OAuthクライアントの作成は完了です。

Postmanで試す

POST{DRUPALのパス}/oauth/tokenを指定します。

Bodyでは、x-www-form-urlencodedを指定して、Keygrant_typeValueclient_credentialsを指定します。

また、Pre-request Scriptで、以下を指定します。

ccccpooooonnnnssssstttttmaDDmenRRyn.UUScsPPtoeAArdtLLieE__ndnCCgSvLLtiII=rrEEioNN`nnTT$gm__{eISD=nDERtCUbV=RPtaEAor"TLai{_(a=CmbLyl"ISe{Et(Nr"Tie_nnCIgcLD)oI};dE:eNC$dTL{A_IDuIERbtDNUth}TPo""_Aa,SLE_eCCnRL使cEIoTEd}Nbe"Tad_sSSetE6rC4iRnEgT)};`;

結果、以下のようなJSONデータを取得できます。

{}"""teaoxckpceienrs_ests_y_tpioenk""e::n""3:B0e0"a,eryeJr0"e,XAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6..."

上記のaccess_tokenをjwt.ioで検証してみると、以下のように、User IDが4、scopeとして「認証済みユーザー」および先ほど指定した「Next.js Site」が設定されていることが確認できます。

DrupalのREST UIでoauth2認証を試す

Drupalでの設定

Postmanを使い方については、以下の記事も参考にしてください。

/admin/config/services/rest/resource/entity%3Anode/editにアクセスして、認証プロバイダで、「oauth2」を選択します。

Postmanでの操作(JSON:APIの場合)

以下のようにPOSTリクエストを投げてみます。

{DRUPALをインストールしたパス}/jsonapi/node/article

{}"}data""}"ta:ytpt{er""it:biut"tlneeos"d":e:-"-{PaargteicTliet"l,e"

この時、AuthorizationBear Tokenを選択して、先ほど取得したトークンを入力しておきます。

結果、正しくコンテンツを追加できました。

トークンの有効期限が切れている場合などは、以下のように、「未承認」という結果が返却されました。

Postmanでの操作(非JSON:APIの場合)

一方、{DRUPALをインストールしたパス}/node?_format=jsonにリクエストした場合、以下の結果が返却されました。

{}"message":"Accesstokencouldnotbeverified"

JSON Web Token Authenticationモジュールを使用した際にはうまくいったので、設定等のどこかに間違いがあるのかもしれません。引き続き調査してみたいと思います。

まとめ

simple_oauthモジュールの使用例を紹介しました。誤っている点などがあるかもしれませんが、参考になりましたら幸いです。