Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

REST API - teoria i praktyka - WordUp Trójmiasto

858 views

Published on

Moja prezentacja z WordUp Trójmiasto o tym jak wykorzystać REST API oraz o dobrych praktykach pracy z REST API

Published in: Technology
  • Be the first to comment

  • Be the first to like this

REST API - teoria i praktyka - WordUp Trójmiasto

  1. 1. REST API 
 teoria i praktyka Tomasz Dziuda WordUp Trójmiasto 30.09.2017
  2. 2. Tak miało być...
  3. 3. {JSON}{JSO N } {JSON} {JSO N } {JSO N } {JSO N } {JSO N } {JSO N } {JSO N } {JSON} {JSON} {JSON} {JSON} {JSON} {JSON} {JSON} {JSON} {JSON}
  4. 4. a z reguły jest...
  5. 5. Co poszło nie tak?
  6. 6. add_filter('rest_enabled', '__return_false'); add_filter('rest_jsonp_enabled', '__return_false'); Security Checklist
  7. 7. Jeżeli projektujesz rozwiązanie dla mas... nie licz na REST API
  8. 8. Jeżeli projektujesz rozwiązanie dla mas... nie licz na REST API
  9. 9. Jednak wciąż możesz wykorzystać REST API na wiele ciekawych sposobów...
  10. 10. Zanim użyjesz REST API...
  11. 11. Włącz HTTPS
  12. 12. Źródło: https://blog.chromium.org/2017/04/next-steps-toward-more-connection.html
  13. 13. Źródło: https://jwt.io/
  14. 14. Uzyskiwanie tokena
  15. 15. Wysyłamy zapytaniem POST do endpointa /wp-json/jwt-auth/v1/token 
 login i hasło użytkownika, którego chcemy autoryzować: { username: 'admin', password: 'password' } Uzyskiwanie tokena
  16. 16. Wysyłamy zapytaniem POST do endpointa /wp-json/jwt-auth/v1/token 
 login i hasło użytkownika, którego chcemy autoryzować: { username: 'admin', password: 'password' } { "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ...", "user_display_name": "admin", "user_email": "admin@localhost.dev", "user_nicename": "admin" } Gdy dane są poprawne otrzymujemy token i dane użytkownika: Uzyskiwanie tokena
  17. 17. Do każdego zapytania wymagającego 
 autoryzacji dodajemy nagłówek: Authorization: Bearer WARTOŚĆ_TOKENA
  18. 18. Wymuś autoryzację klientów
  19. 19. Publiczne API to...
  20. 20. Brak kontroli nad dostępem do danych LOG
  21. 21. Ryzyko wycieku danych https://example.com/wp-json/wp/v2/users
  22. 22. Możliwość określenia wersji WordPressa wp-json/wp/v2/posts - WordPress >= 4.7 wp-json/wp/v3/posts - WordPress > 5.* wp-json/wp/v2/posts - WordPress < 4.7
  23. 23. Karmienie botów informacjami
  24. 24. Zwiększone zużycie zasobów serwera Crawler 1 Crawler 2 Crawler 3 Crawler 4 Crawler 5 Crawler 6
  25. 25. Jak ograniczyć dostęp?
  26. 26. Jak ograniczyć dostęp? Całkowite wyłączenie REST API może w przyszłości skutkować problemy z działaniem niektórych funkcji kokpitu
  27. 27. Jak ograniczyć dostęp? add_filter( 'rest_authentication_errors', function( $result ) {     if ( ! empty( $result ) ) {         return $result;     }     if ( ! is_user_logged_in() ) {     return new WP_Error( 
 'rest_not_logged_in', 
 'You are not currently logged in.', 
 array( 'status' => 401 ) 
 );     }     return $result; }); Źródło: https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can-i-disable-the-rest-api
  28. 28. Jak ograniczyć dostęp? Źródło: https://pl.wordpress.org/plugins/jwt-authentication-for-wp-rest-api/
  29. 29. Niektóre wtyczki nie będą działać po wyłączeniu REST API
  30. 30. Źródło: https://wordpress.org/plugins/disable-json-api/ Wyłączenie wybranych endpointów
  31. 31. Źródło: https://wordpress.org/plugins/wp-rollback/ Bardziej brutalne podejście ;-)
  32. 32. Pamiętaj o CORS
  33. 33. Pamiętaj o CORS Cross-Origin Resource Sharing
  34. 34. Pamiętaj o CORS Cross-Origin Resource Sharing
  35. 35. function dziudek_rest_api_allow_all_cors() { remove_filter('rest_pre_serve_request', 'rest_send_cors_headers'); add_filter('rest_pre_serve_request', function($value) { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST, GET, PUT, DELETE'); header('Access-Control-Allow-Credentials: true'); return $value; }); } add_action('rest_api_init', 'dziudek_rest_api_allow_all_cors', 20); Pamiętaj o CORS
  36. 36. JSONP
  37. 37. JSONP <script src="https://test.com/wp-json/wp/v2/posts?_jsonp=parse">
  38. 38. JSONP <script src="https://test.com/wp-json/wp/v2/posts?_jsonp=parse"> Pomijamy CORS
  39. 39. JSONP /**/parse({ code: "rest_not_logged_in", message: "You are not currently logged in.", data: 
 { status: 401 } })
  40. 40. JSONP /**/parse({ code: "rest_not_logged_in", message: "You are not currently logged in.", data: 
 { status: 401 } })
  41. 41. JSONP /**/parse({ code: "rest_not_logged_in", message: "You are not currently logged in.", data: 
 { status: 401 } })
  42. 42. JSONP function parse(input) { console.log(input); } /wp-json/wp/v2/posts?_jsonp=parse
  43. 43. JSONP /**/parse({ code: "rest_not_logged_in", message: "You are not currently logged in.", data: 
 { status: 401 } })
  44. 44. Podatność Rosetta Flash https://blog.avira.com/understanding-rosetta-flash-vulnerability/
  45. 45. Nie psuj REST API
  46. 46. REST API jest/będzie używane NIE tylko przez Ciebie
  47. 47. Unikaj modyfikowania domyślnych pól endpointów add_filter('rest_prepare_POST_TYPE', ... + unset($endpoint->data['field']);
  48. 48. W razie potrzeby dodawaj brakujące dane jako nowe pola add_filter('rest_prepare_POST_TYPE', ... + $endpoint->data['new_field'] = 'abc';
  49. 49. ... lub twórz własne endpointy https://developer.wordpress.org/rest-api/extending-the- rest-api/adding-custom-endpoints/
  50. 50. Staraj się nie modyfikować domyślnych parametrów REST API add_filter('rest_post_collection_params', 'prefix_per_page', 10, 1); function prefix_per_page($params) { if(isset( $params['per_page'])) { $params['per_page']['maximum'] = 200; } return $params; }
  51. 51. Wyposaż się w narzędzia
  52. 52. Postman Źródło: https://www.getpostman.com/
  53. 53. Rozszerzenie JSON Viewer Do pobrania: https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh
  54. 54. 5 przepisów na wykorzystanie REST API
  55. 55. 1. Wymiana treści między stronami
  56. 56. XML jest passé
  57. 57. JSON Feed Źródło: https://jsonfeed.org/
  58. 58. XML jest passé • JSON można łatwiej obsłużyć z poziomu klienta • Nie zawsze musimy się martwić o CORS (JSONP) • Nie musimy angażować kodu PHP
  59. 59. XML jest passé • JSON można łatwiej obsłużyć z poziomu klienta • Nie zawsze musimy się martwić o CORS (JSONP) • Nie musimy angażować kodu PHP
  60. 60. XML jest passé • JSON można łatwiej obsłużyć z poziomu klienta • Nie zawsze musimy się martwić o CORS (JSONP) • Szybsze ładowanie się strony (swoisty lazy load danych)
  61. 61. 80 MB w XML nawet 10 MB jako JSON * * Zysk zależy głównie od struktury danych, ale plik JSON w zasadzie zawsze będzie lżejszy.
  62. 62. 2. Eksport/import danych
  63. 63. JSON
  64. 64. Choć nie zawsze
  65. 65. Źródło: https://getpublii.com
  66. 66. Choć nie zawsze • REST API może być wyłączone • By mieć pełny dostęp do danych trzeba się autoryzować, a Publii jest aplikacją desktopową, zatem użytkownik musiałby zainstalować dodatkowy plugin autoryzujący (np. poprzez JWT)
  67. 67. Choć nie zawsze • REST API może być wyłączone • By mieć pełny dostęp do danych trzeba się autoryzować, a Publii jest aplikacją desktopową, zatem użytkownik musiałby zainstalować dodatkowy plugin autoryzujący (np. poprzez JWT)
  68. 68. 3. WordPress jako headless CMS
  69. 69. Źródło: https://www.contentful.com/
  70. 70. {JSON}{JSO N } {JSON} {JSO N } {JSO N } {JSO N } {JSO N } {JSO N } {JSO N } {JSON} {JSON} {JSON} {JSON} {JSON} {JSON} {JSON} {JSON} {JSON}
  71. 71. Źródło: https://www.slideshare.net/dziudek/electron-wordpress
  72. 72. Źródło: https://ma.tt/2017/09/on-react-and-wordpress/
  73. 73. Źródło: https://code.facebook.com/posts/300798627056246/relicensing-react-jest-flow-and-immutable-js/
  74. 74. Autoryzacja Cookies we wszystkich wypadkach poza motywem SPA nie zadziałają. Rozważ inne formy autoryzacji np. JWT
  75. 75. 4. Dedykowane panele administracyjne
  76. 76. Źródło: https://developer.wordpress.com/calypso/
  77. 77. 5. Sprawdzenie wiedzy publiki o WordPressie ;-)
  78. 78. Pytanie 1. Ile darmowych motywów znajduje się w oficjalnym repozytorium? ~5000
 Pytanie 2. W której wersji WP dodano obsługę treści poprzez REST API? 4.7.0
 Pytanie 3. Twórca WordPressa i CEO firmy Automattic to: Matt Mullenweg
 Pytanie 4. Gdzie odbył się tegoroczny WordCamp Polska? W Lublinie
 Pytanie 5. Która z poniższych licencji nie jest w pełni zgodna z licencją GPL? Apache
 Pytanie 6. Które z poniższych nie jest alternatywą dla REST API? SCP
 Pytanie 7. Jaka jest najstarsza gałąź WordPressa otrzymująca łatki bezpieczeństwa? 4.1
 Pytanie 8. Które z poniższych nie jest metodą zapytania HTTP? REMOVE Odpowiedzi do Quizu
  79. 79. Jak działa WordUp Quiz?
  80. 80. Jak działa WordUp Quiz? • Pobierane są podstrony tworzące pytania • Aplikacja je przetwarza przy ładowaniu • Użytkownik odpowiada na pytania* • Odpowiedzi są wysyłane do dedykowanego endpointu • Endpoint zapisuje dane w bazie i zwraca wynik
  81. 81. Jak działa WordUp Quiz? • Pobierane są podstrony tworzące pytania • Aplikacja je przetwarza przy ładowaniu • Użytkownik odpowiada na pytania* • Odpowiedzi są wysyłane do dedykowanego endpointu • Endpoint zapisuje dane w bazie i zwraca wynik
  82. 82. Jak działa WordUp Quiz? • Pobierane są podstrony tworzące pytania • Aplikacja je przetwarza przy ładowaniu • Użytkownik odpowiada na pytania* • Odpowiedzi są wysyłane do dedykowanego endpointu • Endpoint zapisuje dane w bazie i zwraca wynik
  83. 83. Jak działa WordUp Quiz? • Pobierane są podstrony tworzące pytania • Aplikacja je przetwarza przy ładowaniu • Użytkownik odpowiada na pytania* • Odpowiedzi są wysyłane do dedykowanego endpointu • Endpoint zapisuje dane w bazie i zwraca wynik
  84. 84. Jak działa WordUp Quiz? • Pobierane są podstrony tworzące pytania • Aplikacja je przetwarza przy ładowaniu • Użytkownik odpowiada na pytania* • Odpowiedzi są wysyłane do dedykowanego endpointu • Endpoint zapisuje dane w bazie i zwraca wynik
  85. 85. Podsumujmy
  86. 86. Pamiętaj o:
  87. 87. Pamiętaj o:
  88. 88. Pamiętaj o:
  89. 89. Stosować REST API czy nie?
  90. 90. Realizujesz projekt dla konkretnego klienta Stosować REST API czy nie?
  91. 91. Realizujesz projekt dla konkretnego klienta Tworzysz ogólnodostępną wtyczkę bazującą na REST API Stosować REST API czy nie?
  92. 92. Stosować REST API czy nie?
  93. 93. Szukasz gotowego, łatwo rozszerzalnego back-endu dla swojej aplikacji Stosować REST API czy nie?
  94. 94. Szukasz gotowego, łatwo rozszerzalnego back-endu dla swojej aplikacji Wyłącz publiczny dostęp do REST API jeśli go nie używasz Stosować REST API czy nie?
  95. 95. Stosować REST API czy nie?
  96. 96. Nie potrzebujesz dostępu do REST API na stronach na które nie masz wpływu Stosować REST API czy nie?
  97. 97. Nie potrzebujesz dostępu do REST API na stronach na które nie masz wpływu Chcesz stworzyć usługę bazującą na tym, że REST API jest włączone Stosować REST API czy nie?
  98. 98. Pytania?
  99. 99. tomasz@dziuda.com @dziudek http://dziudek.pl http://www.slideshare.net/dziudek Tomasz Dziuda

×