Sessiyalar RESTfulness pozur?

RESTful API'sindəki iclaslardan istifadə həqiqətən RESTfulness pozuntusudur? Hər hansı bir istiqamətdə gedən bir çox fikir görmüşəm, amma RESTsiz sessiyalardan əmin deyiləm. Mənim baxımdan:

  • identifikasiyası RESTfulness üçün qadağan edilmir (əks halda RESTful xidmətlərin istifadəsi aşağı olacaq)
  • Kimlik doğrulaması, sorğuda, genelde bir başlığa bir kimlik doğrulama işareti göndererek yapılır
  • bu identifikasiya simvolu bir şəkildə qəbul edilməli və ləğv edilə bilər, bu halda yenilənməlidir
  • Kimlik doğrulama simgesi server tərəfindən təsdiqlənməlidir (əks təqdirdə, təsdiq edilməyəcəkdir).

Sessiyalar onu necə pozur?

  • müştəri tərəfi, iclaslar cookie faylları ilə həyata keçirilir
  • Çerez yalnız bir əlavə HTTP başlığıdır.
  • Sessiyanın çərəzi istənilən vaxt qəbul edilə və ləğv edilə bilər.
  • Kukilərin sessiya faylları zəruri hallarda sonsuz ömür ola bilər
  • seqment identifikasiyası (identifikasiya simgesi) server tərəfində yoxlanılır

Beləliklə, bir müştəri çerezi üçün, sessiya faylı hər hansı digər HTTP-based autentifikasiya identifikasiyası mexanizmi ilə eynidır, istisna olmaqla, o, Authorization və ya başqa bir xüsusi başlıq yerinə Cookie başlığını istifadə edir. Server tərəfində cookie dəyərinə aid heç bir sessiya yoxdursa, bu niyə dəyişir? Sunucu tərəfin tətbiqi, server RESTful davranırsa, müştəriyə toxunmamalıdır. Beləliklə, çərəzlərin özləri RESTless API yaratmırlar və sessiya müştərilər üçün yalnız kukilərdir.

Mənim fərziyyələrimdə səhv edirəmmi? RESTless bir sessiya cookie nə edir?

420
20 мая '11 в 9:13 2011-05-20 09:13 May ayının 20-də, '11 'də saat 9: 13- da təyin olunacaq 2011-05-20 09:13
@ 6 cavablar

Birincisi, bəzi şərtləri müəyyənləşdiririk:

  • RESTful:

    Bu bölmədə təsvir edilən REST məhdudiyyətlərinə uyğun olan tətbiqlər "RESTful" olaraq xarakterizə edilə bilər. [15] Əgər xidmət zəruri məhdudiyyətləri pozarsa, bu RESTful hesab edilə bilməz.

    wikipedia görə.

  • Saxlanmadan məhdudiyyət:

    Sonra müştəri-server qarşılıqlı bir məhdudiyyət əlavə edirik: əlaqə 3.4.3-cü bölmədə (Şəkil 5-3) müştəri-vətəndaşlıq-server (CSS) üslubunda olduğu kimi, təbiətdəki vətəndaşlığı olmayan şəxs olmalıdır. tələbi anlamaq üçün lazım olan məlumatı və serverdə saxlanılan kontekstdən istifadə edə bilməz. Bu səbəbdən iclas vəziyyəti müştəriyə tam olaraq saxlanılır.

    sahə üzrə dissertasiyaya görə.

Beləliklə, server tərəfli iclaslar REST dövlətinə və buna görə RESTfulness'e baxmayaraq, məhdudiyyəti pozur.

Beləliklə, müştəri üçün bir sessiya çerezi, HTTP başlıqlarına əsaslanan hər hansı digər bir autentifikasiya mexanizmi ilə eynidır, istisna olmaqla, Cookie başlığını və ya başqa bir xüsusi başlıq yerinə istifadə edir.

Oturum çerezlerinde, müştərinin vəziyyətini serverə saxlayır və istəkiniz kontekstə malikdir. Yük balansını və xidmətinizin başqa bir nüsxəsini sisteminizə əlavə edin. Bu halda, xidmət nümunələri arasında sessiyaları bölüşmək lazımdır. Belə bir sistemin qorunması və genişləndirilməsi çətindir, buna görə də bu miqyaslı deyil ...

Mənim fikrimcə, cookie ilə yanlış bir şey yoxdur. Cookie texnologiyası, saxlanan məlumatların hər bir tələb üçün avtomatik olaraq cookie başlıqlarına bağlı olduğu bir müştəri saxlama mühərriki. Bu texnologiya ilə bağlı problemləri olan REST-in məhdudiyyətlərini bilmirəm. Buna görə də texnologiyanın özü ilə heç bir problem yoxdur, problem onun istifadəsidir. Fielding, HTTP çerezlerinin niyə pis olduğunu düşündüyü bir bölüm yazdı .

Mənim baxımdan:

  • identifikasiyası RESTfulness üçün qadağan edilmir (əks halda RESTful xidmətlərin istifadəsi aşağı olacaq)
  • Kimlik doğrulaması, sorğuda, genelde bir başlığa bir kimlik doğrulama işareti göndererek yapılır
  • bu identifikasiya simvolu bir şəkildə qəbul edilməli və ləğv edilə bilər, bu halda yenilənməlidir
  • Kimlik doğrulama simgesi server tərəfindən təsdiqlənməlidir (əks təqdirdə, təsdiq edilməyəcəkdir).

Sizin fikriniz olduqca möhkəm idi. Yalnız problem serverdə bir identifikasiya simvolu yaratma konsepsiyası idi. Bu hissəyə ehtiyac yoxdur. İstifadəçi adını və şifrənizi müştəriyə saxlamaq və hər bir tələb ilə göndərmək lazımdır. Bunu HTTP əsas auth və şifrli bir əlaqədən daha çox etməyə ehtiyacınız yoxdur:

2019

253
01 дек. Cavab verilir inf3rno 01 Dekabr. 2013-12-01 15:15 '13 saat 15:15 'də 2013-12-01 15:15

Hər şeydən əvvəl, REST din deyil və belə bir şəkildə yaxınlaşa bilməz. RESTful xidmətlərə üstünlüklər olmasına baxmayaraq, yalnız REST prinsiplərinə riayət etməlisiniz, çünki tətbiq etdiyiniz üçün mantıksızdır.

Lakin, identifikasiyası və müştəri tərəfi dövləti REST prinsiplərini pozmur. REST, dövlət geçişlerinin qeyri-effektiv olmasını tələb edirsə, bu serverin özünə aiddir. Hər şeyin ürəyində bütün REST sənədlərdir. Vətəndaşsızlıq ideyası, SERVER müştəri deyil, vətəndaşlığı olmayan bir şəxsdir. Eyni bir sorğu verən hər hansı bir müştəri (eyni başlıqlar, cookies, URI, və s.) Tətbiqdə eyni yerə göndərilməlidir. Veb sayt server tərəfində bu naviqasiya dəyişənini yeniləyərək istifadəçinin cari yerini və idarə olunan naviqasiyanı saxladıysa, REST sınıq olacaq. Eyni sorğu məlumatına malik olan başqa bir müştəri, server tərəfindəki vəziyyətə görə fərqli bir yerə göndəriləcək.

Google Web Services RESTful sistemin fantastik nümunəsidir. Hər bir tələb ilə göndərilməlidir olan istifadəçi identifikasiyası açarı ilə identifikasiya başlığı olmalıdır. Bu, REST prinsiplərini bir az pozur, çünki server identifikasiya açarının vəziyyətini izləyir. Bu əsasın dövləti saxlanılmalı və bir müddətdən artıq olan bir müddətə malikdir, bundan sonra artıq bu imkanı təmin etməyəcəkdir. Ancaq mənim vəzifəmin əvvəlində qeyd etdiyim kimi, ərizənin işləməsi üçün qurbanlıq etmək lazımdır. Buna baxmayaraq, identifikasiya simvolları mümkün olan bütün müştərilərin real vaxt ərzində çıxış təmin etməyə davam edə biləcək şəkildə saxlanılmalıdır. Bir server, identifikasiya açarının vəziyyətini digər yük balansı server bu əsasa əsaslanan istəkləri qəbul edə bilməyəcək qədər idarə etsə, həqiqətən REST prinsiplərini pozmağa başlayırsınız. Google xidmətləri istənilən vaxt balans server A yükləmək üçün telefonunuzda istifadə etdiyiniz identifikasiya nişanından istifadə etmək və yük balansı server B masaüstünden göndərmək və hələlik sistemə daxil olmaq və eyni resurslara yönəldmək üçün təmin edir istəklər eyni idi.

border=0

Bütün qaynaqlar aşağıda verilmişdir ki, mümkün olduğunca çox REST xüsusiyyətləri saxlanıldığından əmin olmaq üçün identifikasiya nişanlarının hər hansı bir backup depoları (verilənlər bazası, önbellek, nə olursa) üçün yoxlanılmasını təmin etməlisiniz.

Ümid edirəm ki, hamısı mənada idi. Əgər siz artıq bunu etməmisinizsə, Dövlət Dövlət Təqdimatı təqdimatı haqqında Vikipediya məqaləsi məhdudiyyətlər bölməsini nəzərdən keçirməlisiniz. Bu, həqiqətən, müzakirə olunan məsələlər və REST prinsiplərinin səbəbləri baxımından xüsusilə maraqlıdır.

307
20 мая '11 в 9:36 2011-05-20 09:36 Cavab Jared Harding tərəfindən 20 May 'da 9:36' də verildi. 2011-05-20 09:36

Cookies identifikasiyası üçün nəzərdə tutulmur. Niyə təkərin təkrarlanmasın? HTTP yaxşı tərtib edilmiş autentifikasiya mexanizmlərinə malikdir. Çerezleri kullanırsak, HTTP'yi yalnız bir taşıma protokolü olaraq istifadə edirik, belə ki, kullanıcıları, yanlış kimlik doğrulamasını belirlediklerini (HTTP Www-Authenticate yanlış Www-Authenticate bildirmek üçün, məsələn, Www-Authenticate HTTP spesifikasiyası tələb olunur kimi müştərini doğrulayın :)). Qeyd etmək lazımdır ki, Set-Cookie müştəri üçün yalnız bir tövsiyədir. Onun məzmunu saxlanıla bilər və ya saxlanıla bilməz (məsələn, çerezlər aradan qaldırılsa) və Authorization başlığı hər bir tələb üçün avtomatik olaraq göndərilir.

Başqa bir şey bir cookie icazə almaq üçün, yəqin ki, ilk olaraq etimadnaməsini vermək istəyirsiniz? Əgər belədirsə, bu RESTless deyil? Sadə bir nümunə:

  • GET /a olmadan GET /a cəhd edin
  • Bir şəkildə icazəsiz istək alırsınız
  • Gedin və POST /auth kimi bir şey kimi daxil olun
  • Set-Cookie alırsınız
  • Çerez istifadə edərək GET /a istifadə edin. Lakin bu işdə GET /a idempotent işi varmı?

Xülasə etmək üçün, mən inanıram ki, müəyyən bir qaynağa daxil olmağımıza və kimlik doğrulamamız lazımdırsa, eyni qayda üzərində yoxlanılmalı və başqa bir yerdən deyil.

10
24 янв. başlanğıc hesabatının cavabı Jan 24 2013-01-24 12:52 '13 at 12:52 2013-01-24 12:52

Əslində, RESTfulness yalnız universal resurs identifikatorunun göstərdiyi kimi RESOURCES üçün aiddir. Belə ki, başlıqlar, çerezlər və s. REST ilə əlaqədar çox uyğun deyil. REST, HTTP vasitəsilə olsa belə hər hansı bir protokol üzərində işləyə bilər.

Əsas determinant aşağıdakılardır: əgər bir URI olan bir REST çağırışını göndərirsinizsə, onda zəng server ilə uğur qazanarsa, bu URI heç bir keçid edilmədikdə (PUT, POST, DELETE) eyni məzmunu edirmi? Bu test səhvləri aradan qaldırır və ya təsdiqlənmə tələblərini qaytarır, çünki bu halda sorğu hələ serverə çatmamışdır, yəni serveri və ya verilmiş URI-ə uyğun olan sənəd qaytarır.

Eynilə, POST və ya PUT halda, müəyyən bir URI / payload göndərə bilərsiniz və nə qədər mesaj göndərdiyinizdən asılı olmayaraq, həmişə eyni məlumatları yeniləyə bilərmi ki, sonrakı GET ardıcıl nəticəni verir?

REST məlumatların ötürülməsi üçün tələb olunan aşağı səviyyəli məlumat deyil tətbiq məlumatlarıdır.

Aşağıdakı blog yazısında, Roy Fielding bütün REST fikri yaxşı bir xülasə verdi:

http://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/5841

"RESTful sistemi bir stasionar dövlətdən növbəti mərhələyə keçir və hər bir belə davamlı vəziyyət həm potensial bir başlanğıc vəziyyəti, həm də potensial son vəziyyətdir. Yəni, RESTful sistem sadə bir sıra qaydalara riayət edən komponentlərin sayını bilmir, belə ki, həmişə REST-də və ya keçid zamanı bir RESTful başqa bir RESTful dövlət üçün getmək Hər bir dövlət tərkibində nümayəndəlik (lər) və tam təmin edə bilər, vahidlər ilə məhdud keçid ilə Sistem müxtəlif kompleks bir dövlət diaqramı ola bilər, lakin hər bir istifadəçi agenti bir anda yalnız bir dövlətə (mövcud sabit vəziyyətə) baxa bilər və buna görə də hər bir dövlət sadədir və müstəqil olaraq təhlil edilə bilər. hər hansı bir zamanda keçid (məsələn, bir URL daxil edin, bir bookmark seçin, bir redaktoru açın və s.).


Kimyəvi yoxlama probleminə keçid, məlumatları cookie və ya başlıqlardan istifadə etməli, əgər məlumat URI və POST yükünün bir hissəsidirsə, bu REST ilə heç bir əlaqəsi yoxdur. Beləliklə, vətəndaşlığı olmayan şəxslərin olmaması ilə bağlı biz yalnız ərizə məlumatlarından danışırıq.

Məsələn, istifadəçi bir qrafik istifadəçi interfeysi ekranında məlumat daxil olduqda, müştəri hansı sahələrə girildiyini və hansı eksik olan tələb olunan sahələri izləməsini davam etdirir. Bu, bütün MÜŞAHİDƏ kontekstidir və server tərəfindən göndərilməməli və ya izlənilməməlidir. Serverə göndərilən nişanlar, bu resursda bir RESTful dövlətdən digərinə keçid olması üçün IDENTIFIED resursunda (URI vasitəsilə) dəyişdirilməli olan sahələrin tam dəstidir.

Beləliklə, müştəri istifadəçinin nə etdiyini izləyir və yalnız serverə mantıksal tam dövlət keçişləri göndərir.

6
13 дек. Ken Kopelsonun 13 dekabrda verdiyi cavabı 2013-12-13 14:20 '13 saat 02:20 'da 2013-12-13 14:20

HTTP əməliyyatı, əsas giriş identifikasiyası, RBAC üçün uyğun deyil, çünki əsas giriş kimlik doğrulaması şifrelenmiş bir istifadəçi adı hər dəfə istifadə edir: parol və RBAC-də tələb olunan istifadəçi müəyyən bir zəng üçün istifadə etmək istədiyi rol. RBAC bir istifadəçi adına icazələrin yox, rollarda yox.

İstifadəçi adıRole: parol, ancaq bu pis bir tətbiqdir və istifadəçi daha çox rolu olduqda, autentifikasiya mexanizmi birləşmə içindəki bütün rolları yoxlamaq və hər bir çağırışı təkrarlamaq lazımdır. Bu, RBAC-in ən böyük texniki üstünlüklərindən birini, yəni çox sürətli avtorizasiya testini məhv edəcək.

Beləliklə, bu problem əsas giriş identifikasiyası ilə həll edilə bilməz.

Bu problemi həll etmək üçün bir sessiyanın davam etdirilməsi lazımdır və bəzi cavablara görə, REST-in əksinə olaraq görünür.

Cavabda REST'in bir din olaraq qəbul edilməməsi məndən budur. Məsələn, sağlamlıq sektorunda çətin iş şəraitində, RBAC tamamilə sıx və lazımlıdır. REST istifadə etməyə icazə verilmədikləri təqdirdə təəssüf ki, REST alətlərinin bütün dizaynçıları RESTi din olaraq qiymətləndirəcəklər.

Mənim üçün HTTP seansını saxlamaq üçün bir çox yol yoxdur. Siz sessionId və ya sessionId olan bir başlıq ilə cookies istifadə edə bilərsiniz.

Kimsə başqa bir fikri varsa, bunu eşitməyə sevinirəm.

0
16 июня '15 в 12:49 2015-06-16 12:49 Cavab Bert Verhees tərəfindən 16 İyun '15 'də saat 12:49' də verilir. 2015-06-16 12:49
  • Sessions RESTless deyil
  • REST xidmətinin yalnız http-istifadə üçün və ya mənimlə yanlış bir şey var deməkdir? Cookie əsaslı bir sessiya yalnız öz (!) Http-xidmətlər üçün istifadə olunmalıdır! (Bu cookie ilə problem ola bilər, məsələn, Mobil / Konsol / Masaüstü və s. İstifadə edərək)
  • Üçüncü tərəfin inkişaf etdiricilərinə RESTİCİ xidmət təqdim edirsinizsə, cookie əsaslı bir sessiyanı istifadə etməyin, təhlükəsizlik məsələlərindən qaçınmaq üçün əvəzinə istifadə edin.
-3
20 мая '11 в 9:37 2011-05-20 09:37 cavab 20 May 'da Maxim tərəfindən verildi , '11 da 9:37 2011-05-20 09:37