概要

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_consumerjwt_auth_issuerも有効化する必要がありました。

cvoemnpdoosre/rb.ipnh/adrrursehqueinrejw'tdrjuwpta_la/ujtwht_:c^o2n.s0u'merjwt_auth_issuer

restuiモジュール

cvoemnpdoosre/rb.ipnh/adrrursehqueinrere'sdtruuipal/restui:^1.21'

設定

以下にアクセスして、キーを作成します。

/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を指定せずに、コンテンツの作成試してみます。

Bodyrawを選択して、フォーマットをJSONとします。以下の最低限のデータで、articleタイプのコンテンツの作成してみます。

{}"]"]t,tyipte{}l{}"e:":[""t[vaarlgueet"_:id"":"article""

POST先のURLは以下です。

{DRUPALをインストールしたパス}/node?_format=json

結果、以下のような結果が返却されます。

{}"""scetoradrteou"rs:_"d:"e4s"0ce1rr"ir,potri"o,n":"MISSINGAUTHORIZATIONHEADER"

次に、AuthorizationBear Tokenを選択して、先ほど取得したトークンを入力してpostしてみます。

結果、以下のようにコンテンツを作成することができました。

{}"]"]"]"]"]"]"]""]"]"]"]"]"]"]"]"]"]""n,u,v,l,t,r,r,rs,u,t,c,c,p,s,d,r,p,bfiuiayeeetiirhrteeaoididnpvvvadteaoifvtde"{}d{}"{}g{}e{}i{}i{}it{}"{}l{}a{}n{}m{}c{}a{}i{}h{}yl:":c"sssu:etgokus""d:o:iiis"eetyli::_[[dooo"[:dde"toi"[""e"["""n""n""""n:"""""""""""""":"_"n"["""[mvvv"vttt_vf_tttu_vtttu[v:vf:vf:vvlv_vapl]aaaa:aaaataouaaarl[aaaaraaoaoa[aaatalia,gllllrrrilrirrrlolrrrll[lr[lr[llnlrlidneuuu[ugggmumdggg"guggg"uumumuuguaua"g"eeeeeeeeea"eee:"eeee:eeaeaeecenes:c:""""ttts"t:ttt:"ttt""t"t""o"s""o::::___t:"___":___"::":"::d:l::nd[itua:[itu/[itu/::eaue]2"2"dyum"dyux]tdyux"""tf"tttnl"829j"pip2""pix,r"pix2"2"ra:rirul:961a:ed"0Y:edxu:edx0Y0Yuluoul,036""":2-""/e""/2-2-es[enel"8"::3m1::u1::u3m3me_,j6a[--,s,s----aa9r""1d""e""e1d1df"0tn92\ufrufr2\2\faio7-\sc/sc/-\-\e-cd43Te11e113T3Tcelea1Hr0"r0"1H1Ht6e_1T:"b"b"T:T:ec"tb0i,1,10i0id3,y27:ee7:7:"-p0:sff:s:s:4e-1P--1P1P7"94"cc4"4"[2,9:44::3639933-5333338-+--++44044003507700ab:55::-c0dd003-0--0089"bb""c5,22,,9a0056661---f044543386bb06449edda566"3116ee0ee411077a11""",,

(参考)JSON:APIの場合

次に、JSON:APIを使った場合の結果も確認してみます。

設定

まずウェブサービスのJSON:APIを有効化します。

次に、/admin/config/services/jsonapiにアクセスして、すべての操作を許可します。

なお、この設定を行わずに後述するpostを行うと、以下のエラーが返却されます。

{}"}"]j,esrorn""}o{}avmrpeesirt""sa"}:""""}"}"}:i"ltsdl,s,mo:i[iteioe{nntatnut"{k"}ltak"}"}r""a:sseuisv,icfl""e"sl"ineii:":l:"":af"ln1f"::""o":ee{.{"h"{:h"h""0:rM""r:r{::"ee4J{ee,{ft0Sf{f"7"h5O""x6:o"N::xd,:x"A""/hNPxhctoIxtottxtrpi/pe:Asj://ls/m/lco/ojoonwdswnawuoefpwlndii.ea"g/wsp,un3/iro.j.edosoderor/gngta/a/orPpftrioaio/rcctsmcloraeecctp"o//tlR1so.o/u0nrt/lfi"ycn2gr6/e1Ra6ed/ardofOpcne2lr6ya1Mt6oi-doseneMsce.1t0hS.oihdttFemilla#tdsemeric.n1pi0hs.pt4"r.,a6t"orscanconfigurethisatxxx/admin/config/services/jsonapi.",

Postman

JSON:APIを用いる場合には、以下のようなjsonデータを使ってコンテンツを作成します。

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

articleタイプのコンテンツを作成する場合のPOST先のURLは以下です。

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

Authorizationを指定せずに、コンテンツの作成を試みます。結果、以下のように、先ほどと同様の結果が得られます。

{}"""scetoradrteou"rs:_"d:"e4s"0ce1rr"ir,potri"o,n":"MISSINGAUTHORIZATIONHEADER"

Authorizationを指定した場合、以下のようにコンテンツが作成されました。

{}"}"j,dsaotn""}a"""avm"tilpee:ydiirtp"n"sa"}{e:k":i"l"sso:i:""e{nna:l"{k"}"4f:ssn3{""eo3:":ld81f"ea{.{"h-60:r-4"ea-,{fr2"tf:i8c4"l-he4t"6t,8p5:-/9/ajbsfo-n9a5p1i9.ao3rcge/effo0r9m"a,t/1.0/"

まとめ

DrupalのJWTモジュールを用いたAPIの利用例について紹介しました。

十分に考慮できていない点が多いかと思いますが、本モジュール等の使い方の参考になりましたら幸いです。