Opis
Rozszerza WP REST API o nową metodę autoryzacji wykorzystując JSON Web Tokens.
JSON Web Tokens to otwarta, zgodna z standardem RFC 7519 metoda służąca do bezpiecznego przedstawiania oświadczeń między dwiema stronami.
Pomoc techniczna jest udzielana poprzez Github: https://github.com/Tmeister/wp-api-jwt-auth
WYMAGANIA
WP REST API V2
Ta wtyczka została stworzona by rozszerzyć funkcjonalność wtyczki WP REST API V2 i oczywiście została zbudowana w oparciu o nią.
Więc, aby używać wp-api-jwt-auth potrzebujesz zainstalować i włączyć WP REST API.
PHP
Minimalna wersja PHP: 7.4.0
Włączenie nagłówka autoryzacji PHP HTTP
Większość współdzielonych usług hostingowych posiada domyślnie wyłączony nagłówek autoryzacji HTTP.
Aby włączyć tą opcję będziesz potrzebował edytować plik .htaccess dodając następujący kod
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
WPENGINE
Aby włączyć tą opcję będziesz potrzebował edytować plik .htaccess dodając następujący kod
Zobacz https://github.com/Tmeister/wp-api-jwt-auth/issues/1
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
KONFIGURACJA
Konfiguracja klucza prywatnego
JWT potrzebuje klucza prywatnego aby podpisać token. Ten klucz prywatny musi być unikatowy i nigdy wcześniej nie ujawniony.
Aby dodać klucz prywatny otwórz plik wp-config.php i dodaj nową stałą o nazwie JWT_AUTH_SECRET_KEY
define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key');
Możesz użyć ciągu znaków z tej strony: https://api.wordpress.org/secret-key/1.1/salt/
Konfiguracja wsparcia CORs
Wtyczka wp-api-jwt-auth posiada opcję by włączyć wsparcie dla CORs.
Any włączyć wsparcie dla CORs edytuj plik wp-config.php i dodaj nową stałą o nazwie JWT_AUTH_CORS_ENABLE
define('JWT_AUTH_CORS_ENABLE', true);
Włącz wtyczkę poprzez wp-admin.
Przestrzeń nazw i punkty końcowe
Gdy wtyczka jest włączona, dodana jest nowa przestrzeń nazw
/jwt-auth/v1
Także, dwa nowe punkty końcowe zostały dodane do tej przestrzeni nazw
Endpoint | HTTP Verb
/wp-json/jwt-auth/v1/token | POST
/wp-json/jwt-auth/v1/token/validate | POST
ZASTOSOWANIE
/wp-json/jwt-auth/v1/token
Jest to punkt wyjścia dla autoryzacji JWT.
Sprawdza dane uwierzytelniające użytkownika, username i password, oraz zwraca token do użycia w kolejnych wywołaniach API
jeśli autoryzacja się powiodła, w przeciwnym razie zwraca błąd.
Przykładowe wywołanie z użyciem AngularJS
( function() {
var app = angular.module( 'jwtAuth', [] );
app.controller( 'MainController', function( $scope, $http ) {
var apiHost = 'http://yourdomain.com/wp-json';
$http.post( apiHost + '/jwt-auth/v1/token', {
username: 'admin',
password: 'password'
} )
.then( function( response ) {
console.log( response.data )
} )
.catch( function( error ) {
console.error( 'Error', error.data[0] );
} );
} );
} )();
Odpowiedź o powodzeniu z serwera
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8",
"user_display_name": "admin",
"user_email": "[email protected]",
"user_nicename": "admin"
}
Odpowiedź o błędzie z serwera
{
"code": "jwt_auth_failed",
"data": {
"status": 403
},
"message": "Invalid Credentials."
}
Gdy już pobierzesz token, musisz go gdzieś zapisać w swojej aplikacji, np. wykorzystując cookie lub używając localstorage.
Od tego momentu powinieneś przekazywać ten token przy każdym wywołaniu API
Przykładowe wywołanie z użyciem nagłówka autoryzacji wykorzystując AngularJS
app.config( function( $httpProvider ) {
$httpProvider.interceptors.push( [ '$q', '$location', '$cookies', function( $q, $location, $cookies ) {
return {
'request': function( config ) {
config.headers = config.headers || {};
//Assume that you store the token in a cookie.
var globals = $cookies.getObject( 'globals' ) || {};
//If the cookie has the CurrentUser and the token
//add the Authorization header in each request
if ( globals.currentUser && globals.currentUser.token ) {
config.headers.Authorization = 'Bearer ' + globals.currentUser.token;
}
return config;
}
};
} ] );
} );
wp-api-jwt-auth przechwyci każde wywołanie do serwera i będzie szukał nagłówka autoryzacji, jeśli nagłówek autoryzacji jest obecny, spróbuje zdekodować token i ustawi użytkownika zgodnie z przechowywanymi w nim danymi.
Jeśli token jest prawidłowy, wywołanie API będzie kontynuowane jak zawsze.
Przykładowe nagłówki
POST /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_s9.B5f-4.1JqM
BŁĘDY
Jeśli token jest nieprawidłowy, zostanie zwrócony błąd, oto kilka przykładów błędów.
Nieprawidłowe dane uwierzytelniające
[
{
"code": "jwt_auth_failed",
"message": "Invalid Credentials.",
"data": {
"status": 403
}
}
]
Niewłaściwy podpis
[
{
"code": "jwt_auth_invalid_token",
"message": "Signature verification failed",
"data": {
"status": 403
}
}
]
Wygasły token
[
{
"code": "jwt_auth_invalid_token",
"message": "Expired token",
"data": {
"status": 403
}
}
]
/wp-json/jwt-auth/v1/token/validate
Jest to pomocniczy punkt końcowy do sprawdzania poprawności tokena; wystarczy wykonać żądanie metodą POST, wysyłając nagłówek autoryzacji.
Prawidłowa odpowiedź z tokenem
{
"code": "jwt_auth_valid_token",
"data": {
"status": 200
}
}
DOSTĘPNE ZACZEPY
Wtyczka wp-api-jwt-auth jest przyjazna deweloperom i posiada dostępnych pięć filtrów pozwalających nadpisać domyślne ustawienia.
jwt_auth_cors_allow_headers
Zaczep jwt_auth_cors_allow_headers pozwala modyfikować dostępne nagłówki gdy wsparcie dla CORs jest włączone.
Wartość domyślna:
'Access-Control-Allow-Headers, Content-Type, Authorization'
jwt_auth_not_before
Zaczep jwt_auth_not_before pozwala zmienić wartość nbf przed utworzeniem tokena.
Wartość domyślna:
Creation time - time()
jwt_auth_expire
Zaczep jwt_auth_expire pozwala zmienić wartość exp przed utworzeniem tokena.
Wartość domyślna:
time() + (DAY_IN_SECONDS * 7)
jwt_auth_token_before_sign
Zaczep jwt_auth_token_before_sign pozwala modyfikować wszystkie dane tokena przed zakodowaniem i podpisaniem.
Wartość domyślna
<?php
$token = array(
'iss' => get_bloginfo('url'),
'iat' => $issuedAt,
'nbf' => $notBefore,
'exp' => $expire,
'data' => array(
'user' => array(
'id' => $user->data->ID,
)
)
);
jwt_auth_token_before_dispatch
Zaczep jwt_auth_token_before_dispatch pozwala ci na modyfikację całej tablicy odpowiedzi przed wysłaniem jej do klienta.
Wartość domyślna:
<?php
$data = array(
'token' => $token,
'user_email' => $user->data->user_email,
'user_nicename' => $user->data->user_nicename,
'user_display_name' => $user->data->display_name,
);
jwt_auth_algorithm
Zaczep jwt_auth_algorithm umożliwia modyfikowanie algorytmu podpisywania.
Domyślna wartość:
<?php
$token = JWT::encode(
apply_filters('jwt_auth_token_before_sign', $token, $user),
$secret_key,
apply_filters('jwt_auth_algorithm', 'HS256')
);
// ...
$token = JWT::decode(
$token,
new Key($secret_key, apply_filters('jwt_auth_algorithm', 'HS256'))
);
Testowanie
Stworzyłem małą aplikację do testowania podstawowej funkcjonalności wtyczki; możesz pobrać aplikację i zapoznać się ze szczegółami w repozytorium JWT-Client
Instalacja
Używając kokpitu WordPressa
- W kokpicie, na podstronie Wtyczki, kliknij 'Dodaj nową’
- Wyszukaj 'jwt-authentication-for-wp-rest-api’
- Kliknij 'Instaluj teraz’
- Włącz wtyczkę w kokpicie na stronie zarządzania wtyczkami
Przesyłanie w kokpicie WordPressa
- W kokpicie, na podstronie Wtyczki, kliknij 'Dodaj nową’
- Przejdź do obszaru 'Prześlij’
- Wybierz plik
jwt-authentication-for-wp-rest-api.zip
ze swojego komputera - Kliknij 'Instaluj teraz’
- Włącz wtyczkę w kokpicie na stronie zarządzania wtyczkami
Proszę przeczytać instrukcję konfiguracji wtyczki: https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/
Recenzje
Kontrybutorzy i deweloperzy
„Autoryzacja JWT dla WP REST API” jest oprogramowaniem open source. Poniższe osoby miały wkład w rozwój wtyczki.
ZaangażowaniPrzetłumacz wtyczkę “Autoryzacja JWT dla WP REST API” na swój język.
Interesuje cię rozwój wtyczki?
Przeglądaj kod, sprawdź repozytorium SVN lub czytaj dziennik rozwoju przez RSS.
Rejestr zmian
1.3.6
- Added Safeguard in enqueue_plugin_assets to Handle Null or Empty $suffix
1.3.5
- Notice: Add JWT Authentication Pro beta announcement notice.
1.3.4
- Naprawa: Pomiń każdy typ walidacji, gdy nagłówek autoryzacji nie jest okazicielem (Bearer).
- Funkcja: Dodano stronę ustawień, aby udostępnić dane oraz dodać informacje o wtyczce.
1.3.3
- Aktualizuj php-jwt do 6.4.0
- Napraw ostrzeżenia php (https://github.com/Tmeister/wp-api-jwt-auth/pull/259)
- Naprawa warunku w którym sprawdzane jest, czy zapytanie jest zapytaniem REST (https://github.com/Tmeister/wp-api-jwt-auth/pull/256)
1.3.2
- Napraw konflikty z innymi wtyczkami które używają tej samej biblioteki JWT, dodając do klasy JWT przestrzeń nazw.
1.3.1
- Aktualizacja minimalnej wersji PHP do wersji 7.4
- Waliduj algorytm podpisywania względem wspieranych algorytmów @zobacz https://www.rfc-editor.org/rfc/rfc7518#section-3
- Zdezynfekuj wartości REQUEST_URL oraz HTTP_AUTHORIZATION przed wykorzystaniem
- Użyj get_header() zamiast $_SERVER do pobrania nagłówka autoryzacji, jeśli to możliwe.
- Dodano wpisane właściwości do klasy JWT_Auth tam, gdzie było to możliwe
- Razem z tym wydaniem, wydaję do celów testowych nowego prostego klienta JWP Client App @zobacz https://github.com/Tmeister/jwt-client
1.3.0
- Zaktualizuj firebase/php-jwt do wersji 6.3
- Napraw ostrzeżenie, register_rest_route zostało wywołane niepoprawnie
- Pozwól na podstawowe uwierzytelnienie (Basic Auth) poprzez zaniechanie prób walidacji nagłówków autentykacji (Authentication Headers) jeśli adekwatny użytkownik został już określony (zobacz: https://github.com/Tmeister/wp-api-jwt-auth/issues/241)
- Dodano nowy filtr (jwt_auth_algorithm), aby umożliwić dostosowanie algorytmu używanego do podpisywania tokena
- Props: https://github.com/bradmkjr
1.2.6
- Zgodność plików cookies z tokenem
- Naprawiono źródło problemu z Gutenbergiem, nieskończoną pętlą, i udostępniono możliwość generowania/sprawdzania tokenu w sytuacji gdy istnieje WP cookie
- Więcej informacji (https://github.com/Tmeister/wp-api-jwt-auth/pull/138)
- Props: https://github.com/andrzejpiotrowski
1.2.5
- Dodano kompatybilność z Gutenbergiem
- Więcej informacji (https://github.com/Tmeister/wp-api-jwt-auth/issues/126)
1.2.4
- Zaktualizowano firebase/php-jwt do v5.0.0 ( https://github.com/firebase/php-jwt )
- Dodano tag 'Requires PHP’
1.2.3
- Napraw błąd rekurencji w WordPress 4.7 #44
1.2.2
- Dodaj dodatkowe sprawdzanie poprawności, aby uzyskać nagłówek autoryzacji
- Podniesiono priorytet determine_current_user Rozwiązuje problem #13
- Dodano obiekt użytkownika jako parametr do zaczepu jwt_auth_token_before_sign
- Poprawiono komunikaty błędów przy niepowodzeniu autoryzacji #34
- Przetestowano z 4.6.1
1.2.0
- Przetestowano z 4.4.2
1.0.0
- Pierwsze wydanie.