Ինչ չի անում JSON:API-ը
JSON:API-ն ամբողջությամբ հիմնված է էյնթիթիների վրա։ Սա նշանակում է, որ այն չի կարող մշակել բիզնես կանոններ կամ կատարել այնպիսի գործողություններ, որոնք հնարավոր չէ դիտարկել որպես "CRUD" (ստեղծում, ընթերցում, թարմացում, ջնջում): Բիզնես լոգիկան՝ ինչպես նոր հաշվի գրանցումը, օգտագործողի մուտքագրումը կամ գաղտնաբառի վերականգնումը, չեն ընդգրկված JSON:API-ում։ Այս գործողություններից շատերը արդեն հասանելի են Drupal core-ով։
Ստորև ներկայացված է ամենահաճախ օգտագործվող հնարավորությունների և դրանց լուծումների ոչ լրիվ ցանկը։
Հետաքրքրող ուղիներն են.
- /session/token
- /user/register
- /user/login
- /user/login_status
- /user/logout
Սեսիայի թոքեն ստանալը
Թոքեն ստանալ
curl \
--request GET http://drupal.d8/session/token
Թոքենը վերադարձվում է պարզ տեքստով (ոչ JSON ձևաչափով) պատասխանի մարմնում։
Թոքենների օգտագործում
Բացի սեսիայի թոքենից, մուտք գործելիս դուք ստանում եք նաև csrf_token և logout_token։ logout_token-ը պետք է օգտագործել համակարգից դուրս գալու համար (տե՛ս ստորև): csrf_token-ը կամ session token-ը անհրաժեշտ են փոփոխելի հարցումների համար (օրինակ՝ POST, PATCH և DELETE):
Օգտագործողի գրանցում
Մինչև JSON:API-ն core-ով նոր օգտագործողների գրանցումը չի ապահովում, կարող եք տեղադրել JSON:API User Resources մոդուլը՝ օգտագործողի հետ կապված JSON:API վերջնակետեր ավելացնելու, այդ թվում՝ գրանցման, գաղտնաբառի վերականգնման և փոփոխման համար։
Այլընտրանքորեն, կարող եք օգտագործել core REST մոդուլը։ REST-ի միջոցով գրանցումը ակտիվացնելու համար անհրաժեշտ է միացնել user_registration REST ռեսուրսը (տե՛ս REST UI-ի օրինակը ներքևում):
curl \
--header "Content-Type: application/json" \
--header "X-CSRF-Token: 57sTS-KS7UoYAWAPyzt0iJmo300CFct3jdKyWM-UiiQ" \
--request POST "https://drupal.d9/user/register?_format=json" \
--data '{"name": {"value": "thename123"}, "pass": {"value": "thepass"}, "mail": {"value": "someone@example.com"}}'
Օգտագործեք session token-ը X-CSRF-Token վերնագրում։ Հաջող գրանցումից հետո պատասխանում կստանաք օգտագործողի որոշ դաշտեր, ներառյալ նոր ստեղծված օգտագործողի UUID-ը.
{
"uuid" : [ { "value" : "3e75b757-831e-4bf7-bbb6-25b8c50c7ac0" } ]
}
Նշենք նաև, որ պատասխանում չկա "Set-Cookie" վերնագիր՝ անկախ նրանից, թույլատրված է, թե ոչ այցելուների կողմից հաշվի ինքնուրույն ստեղծումը։ Այսինքն՝ եթե հաստատում կամ հաստատման պահանջ չկա, գրանցումից հետո կարող եք անմիջապես մուտք գործել նույն անունով և գաղտնաբառով։
Օգտագործողի մուտք
curl \
--header "Content-type: application/json" \
-c cookie.txt \
--request POST "http://drupal.d8/user/login?_format=json" \
--data '{"name":"admin", "pass":"admin"}'
-c cookie.txt
հրամանը curl-ին ասում է պահպանել cookie։ Պատասխանը նման է լինելու հետևյալին.
{
"csrf_token" : "57sTS-KS7UoYAWAPyzt0iJmo300CFct3jdKyWM-UiiQ",
"logout_token" : "zzRaD8ZgLT1TkG804mYpVVTyM-pgoDm4h9XZ9JHSoCw",
"current_user" : {
"roles" : [
"authenticated",
"administrator"
],
"name" : "admin",
"uid" : "1"
}
}
Օգտագործողի կարգավիճակ
curl \
--header "Content-type: application/json" \
-b cookie.txt \
--request GET "http://drupal.d8/user/login_status?_format=json"
-b cookie.txt
հրամանը curl-ին ասում է ուղարկել (ոչ թե պահպանել) cookie-ն նախորդ հարցումից։ Եթե մուտք գործած եք, պատասխանը կվերադարձնի 1
(պարզ տեքստ), հակառակ դեպքում՝ 0
։
Օգտագործողի դուրս գալ
curl \
--header "Content-type: application/json" \
-b cookie.txt \
--request POST "http://drupal.d8/user/logout?_format=json&token=zzRaD8ZgLT1TkG804mYpVVTyM-pgoDm4h9XZ9JHSoCw"
Այս հարցումը cookie.txt-ով նույնականացված օգտագործողին դուրս կգրի համակարգից։ Օգտագործեք logout_token արժեքը՝ token query parameter-ի մեջ։
Նույնականացման մեխանիզմներ
Վերոնշյալը նույնականացման բազմաթիվ մեխանիզմներից ընդամենը մեկն է։ Ուսումնասիրեք, թե որ մեխանիզմն է ավելի հարմար Ձեր կարիքների համար։
Կա նաև Drupal OAuth մոդուլ՝ simple_oauth։
Հղումներ
Ավելին՝ հետևյալ հղումներում՝
- https://www.drupal.org/node/2720655 (login, login_status և logout)
- https://www.drupal.org/node/2752071 (register)
Նույնականացման այլ տարբերակների մասին կարող եք կարդալ այստեղ՝ օգտագործելով այլ նույնականացման պրոտոկոլներ։
Եթե ձեր front-end-ը (օր.՝ Javascript հավելված) և Drupal-ը տարբեր դոմենների վրա են, բրաուզերը կարողանա պահել session cookies միայն, եթե SameSite cookie պարամետրը դրված է "None"։ Դրա համար services.yml-ում ավելացրեք հետևյալը՝
parameters:
session.storage.options:
cookie_samesite: None
REST UI
REST UI մոդուլը թույլ է տալիս կարգավորել core REST մոդուլի ռեսուրսները։ Օրինակ, ինչպես ակտիվացնել օգտվողի գրանցման հնարավորությունը՝
- REST UI մոդուլը տեղադրելուց և միացնելուց հետո գնացեք /admin/config/services/rest էջ և միացրեք "User registration" ռեսուրսը։ Խմբագրեք ռեսուրսը, միացրեք POST մեթոդը, JSON ֆորմատը և օրինակ՝ Cookie provider-ը։ "Method"-ի granularit-ը ընտրելու դեպքում կարող եք տարբեր request մեթոդների համար տարբեր ֆորմատներ ու providers հատկացնել։
- Անանուն օգտագործողներին տվեք "Access POST on User registration resource" իրավունքը՝ /admin/people/permissions/module/rest էջում։
- Վերջապես, ստուգեք, որ այցելուները կարողանան ինքնուրույն հաշիվ ստեղծել՝ /admin/config/people/accounts էջում։
Հոդվածը վերցված է Drupal Documentation-ից։