{"id":231034,"date":"2022-12-26T12:19:00","date_gmt":"2022-12-26T09:19:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231034"},"modified":"2022-12-26T17:59:36","modified_gmt":"2022-12-26T14:59:36","slug":"praca-z-transjentami-i-uwierzytelnianiem-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/praca-z-transjentami-i-uwierzytelnianiem-wordpress\/","title":{"rendered":"Praca z transjentami i uwierzytelnianiem WordPress"},"content":{"rendered":"\n<p>Kontynuuj\u0105c tre\u015b\u0107 <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/uzywasz-przejsciowek-wordpress-zamiast-plikow-cookie\/\" title=\"poprzedniego posta\">poprzedniego posta<\/a>, wa\u017cne jest r\u00f3wnie\u017c rozwa\u017cenie u\u017cycia transjent\u00f3w i uwierzytelniania.<\/p>\n<p>Poniewa\u017c istniej\u0105 scenariusze, w kt\u00f3rych u\u017cytkownicy s\u0105 uwierzytelniani w witrynie (pomy\u015bl o obszarze witryny tylko dla cz\u0142onk\u00f3w) i lub nie s\u0105 uwierzytelniani w witrynie (na przyk\u0142ad odwiedzaj\u0105cy witryn\u0119).<\/p>\n<p>Tego typu sytuacje s\u0105 obecne zar\u00f3wno na blogach, jak i w innych witrynach i aplikacjach internetowych na ca\u0142ym \u015bwiecie.<\/p>\n<h2>Przej\u015bciowe stany przej\u015bciowe i uwierzytelnianie WordPress<\/h2>\n<p>Jak mo\u017cemy przechowywa\u0107 informacje o u\u017cytkownikach dla tych u\u017cytkownik\u00f3w? Na szcz\u0119\u015bcie PHP zapewnia nam pewn\u0105 funkcjonalno\u015b\u0107, kt\u00f3ra daje nam mo\u017cliwo\u015b\u0107 robienia tego bez potrzeby korzystania z API WordPressa.<\/p>\n<p>Ostatecznym celem, do kt\u00f3rego d\u0105\u017cymy, jest serializacja danych przej\u015bciowych przy u\u017cyciu klucza, kt\u00f3ry u\u017cywa identyfikatora uwierzytelnionego u\u017cytkownika lub nieuwierzytelnionego u\u017cytkownika.<\/p>\n<p>A oto jak to zrobi\u0107.<\/p>\n<h3>API WordPressa<\/h3>\n<p>Zak\u0142adaj\u0105c, \u017ce u\u017cytkownik jest uwierzytelniony w WordPressie, mo\u017cemy u\u017cy\u0107 funkcji <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_current_user_id\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_current_user_id<\/a>. To te\u017c jest proste.<\/p>\n<p>Z odniesienia do kodu:<\/p>\n<blockquote>\n<p>Uzyskaj identyfikator bie\u017c\u0105cego u\u017cytkownika<\/p>\n<\/blockquote>\n<p>Mo\u017cemy nast\u0119pnie u\u017cy\u0107 tej funkcji w konstruktorze, aby ustawi\u0107 w\u0142a\u015bciwo\u015b\u0107 przechowuj\u0105c\u0105 identyfikator u\u017cytkownika. I za chwil\u0119 poka\u017c\u0119 kod do tego, ale co z sytuacj\u0105, gdy u\u017cytkownik nie jest zalogowany?<\/p>\n<h3>API PHP<\/h3>\n<p>Je\u015bli chodzi o przechowywanie informacji dla u\u017cytkownik\u00f3w, kt\u00f3rzy nie s\u0105 uwierzytelnieni, nadal potrzebujemy sposobu ich identyfikacji. Mo\u017cna to zrobi\u0107 na wiele sposob\u00f3w, u\u017cywaj\u0105c r\u00f3\u017cnych warto\u015bci utrzymywanych przez PHP w celu do\u0142\u0105czenia do klucza przej\u015bciowego.<\/p>\n<p>Pami\u0119taj, \u017ce klucz musi by\u0107 unikalny i dop\u00f3ki jest unikalny dla u\u017cytkownika witryny, powinien by\u0107 dobry.<\/p>\n<p>Dwie funkcje, kt\u00f3re oferuje PHP to:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.php.net\/manual\/en\/function.get-current-user.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pobierz_bie\u017c\u0105cego_u\u017cytkownika<\/a><\/li>\n<li><a href=\"https:\/\/www.php.net\/manual\/en\/function.posix-getuid.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">posix_getuid<\/a><\/li>\n<\/ul>\n<p>Je\u015bli chodzi o drug\u0105, to nie b\u0119dzie dzia\u0142a\u0107 z IIS ani \u017cadnymi serwerami z systemem Windows. Ale wspominam o tym tutaj jako o innej alternatywie dla host\u00f3w opartych na *nix (poniewa\u017c tak wiele jest, szczeg\u00f3lnie w odniesieniu do WordPressa).<\/p>\n<p>Funkcja <strong>get_current_user<\/strong> jest wystarczaj\u0105co przejrzysta:<\/p>\n<blockquote>\n<p>Pobiera nazw\u0119 w\u0142a\u015bciciela bie\u017c\u0105cego skryptu PHP<\/p>\n<\/blockquote>\n<p>W instrukcji jest jeszcze co\u015b, na co warto zwr\u00f3ci\u0107 uwag\u0119. Wyra\u017anie stwierdza to \u201e[zwraca] imi\u0119 i nazwisko w\u0142a\u015bciciela bie\u017c\u0105cego skryptu PHP&quot;. Zajm\u0119 si\u0119 tym przed ko\u0144cem postu.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159934-61e7008cd3f22.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159934-61e7008cd3f22.png\" alt=\"Praca z transjentami i uwierzytelnianiem WordPress\"><\/a><\/p>\n<p>Co wi\u0119cej, <strong>get_current_user<\/strong> mo\u017ce r\u00f3wnie\u017c nie by\u0107 tym, czego szukasz, w zale\u017cno\u015bci od konfiguracji serwera i tego, kt\u00f3ry u\u017cytkownik jest \u201ew\u0142a\u015bcicielem&#8221; skryptu PHP dzia\u0142aj\u0105cego na serwerze.<\/p>\n<p>Ale wystarczy powiedzie\u0107, \u017ce w tym przyk\u0142adzie to dzia\u0142a. A oto dlaczego: staram si\u0119 pokaza\u0107, jak u\u017cywa\u0107 warto\u015bci, kt\u00f3re s\u0105 unikalne dla u\u017cytkownika, kt\u00f3ry nie jest uwierzytelniony w witrynie, do generowania klucza, z kt\u00f3rego mo\u017cemy pobra\u0107 informacje.<\/p>\n<p>Spos\u00f3b generowania klucza jest drugorz\u0119dny w stosunku do rzeczywistego kodu.<\/p>\n<h3>\u0141\u0105cz\u0105c to wszystko razem<\/h3>\n<p>Jak wi\u0119c wygl\u0105da kod, je\u015bli mamy wykorzysta\u0107 powy\u017csze funkcje? To znaczy, je\u015bli utrzymujemy w\u0142a\u015bciwo\u015b\u0107, kt\u00f3ra przechowuje identyfikator u\u017cytkownika, a nast\u0119pnie robi to zar\u00f3wno dla uwierzytelnionych, jak i nieuwierzytelnionych u\u017cytkownik\u00f3w?<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f6f57f45405f609fcd14905c54b30f25#file-01-data-store-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">By\u0107 mo\u017ce to<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Initializes the User ID properly this is what's going to be appended to incoming\n * keys when saving or checking for values.\n *\n * Use PHP's native get_current_user function then fall back to WP's\n * and use that to help generate the key.\n *\/\npublic function __construct() \n{\n    $this-&gt;user_id = get_current_user();\n    if (get_current_user_id()) {\n        $this-&gt;user_id = get_current_user_id();\n    }\n}<\/code><\/pre>\n<p>A to da ci funkcjonalno\u015b\u0107 niezb\u0119dn\u0105 do tworzenia unikalnego identyfikatora u\u017cytkownika zar\u00f3wno dla uwierzytelnionych u\u017cytkownik\u00f3w, jak i nieuwierzytelnionych u\u017cytkownik\u00f3w.<\/p>\n<h3>A co z kluczami przej\u015bciowymi?<\/h3>\n<p>Tak \u2013 cz\u0119\u015bci\u0105 tego, o czym m\u00f3wimy, jest r\u00f3wnie\u017c tworzenie unikalnych kluczy przej\u015bciowych.<\/p>\n<p>Aby to zrobi\u0107, stwierdzi\u0142em, \u017ce do\u015b\u0107 \u0142atwo jest po\u0142\u0105czy\u0107 identyfikator u\u017cytkownika, kt\u00f3ry wygenerowali\u015bmy powy\u017cej i do\u0142\u0105czy\u0107 go do klucza u\u017cywanego podczas serializacji przej\u015bciowej.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f6f57f45405f609fcd14905c54b30f25#file-02-get-unique-key-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Na przyk\u0142ad<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Creates a unique key using a combination of the incoming database key and the user's ID.\n *\n * @param string $key The key used to store transient data.\n * @return string     The unique key used to store values associated with the data store.\n *\/\nprivate function getUniqueKey(string $key) \n{\n    return $key .= '-'. $this-&gt;user_id;\n}<\/code><\/pre>\n<p>Nast\u0119pnie, z warto\u015bci\u0105 zwracan\u0105 przez t\u0119 funkcj\u0119, mo\u017cemy jej u\u017cy\u0107 do zapisania danych jako nieustalonych za pomoc\u0105 unikalnych kluczy.<\/p>\n<h2>Jeszcze inne opcje<\/h2>\n<p>Jak wspomniano, zwyk\u0142e u\u017cywanie funkcji wbudowanych w PHP mo\u017ce nie by\u0107 w\u0142a\u015bciw\u0105 drog\u0105. Ale to nie znaczy, \u017ce nie ma innych warto\u015bci, kt\u00f3re zapewniaj\u0105 unikaln\u0105 warto\u015b\u0107 temu, czego potrzebujesz.<\/p>\n<p>W takich przypadkach wa\u017cne jest, aby okre\u015bli\u0107, w jaki spos\u00f3b chcesz zidentyfikowa\u0107 u\u017cytkownika, jakiego systemu operacyjnego u\u017cywaj\u0105 i jakie konto u\u017cytkownika jest w\u0142a\u015bcicielem aplikacji.<\/p>\n<p>Je\u015bli to nie zapewnia wystarczaj\u0105co unikalnego ustawienia (i jest bardzo prawdopodobne, \u017ce nie nast\u0105pi to w pewnych warunkach), zasada nadal obowi\u0105zuje \u2013 wystarczy zamieni\u0107 wywo\u0142anie funkcyjne <strong>get_current_user()<\/strong> na co\u015b, co dzia\u0142a najlepiej dla ty.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Podczas pracy z witrynami ukierunkowanymi na cz\u0142onkostwo nale\u017cy r\u00f3wnie\u017c wzi\u0105\u0107 pod uwag\u0119 u\u017cycie transjent\u00f3w i uwierzytelniania.<\/p>\n","protected":false},"author":1,"featured_media":237010,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,897,784,752,805,836,845,866],"tags":[1169],"class_list":["post-231034","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-oprogramowanie-open-source","category-otwarte-zrodlo","category-php-7","category-przewodnik-dla-poczatkujacych","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231034","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=231034"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231034\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/237010"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=231034"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=231034"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=231034"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}