JWT Authentication for WP REST API

Beschrijving

Breidt de WP REST API uit met JSON web tokens authenticatie als authenticatiemethode.

JSON web tokens zijn een open, industriestandaard RFC 7519 methode om claims tussen twee partijen veilig weer te geven.

Ondersteuning en aanvragen graag in GitHub: https://github.com/Tmeister/wp-api-jwt-auth

VEREISTEN

WP REST API V2

Deze plugin is bedacht om de functies van de WP REST API V2 plugin uit te breiden en is daar natuurlijk bovenop gebouwd.

Dus, om de wp-api-jwt-auth te gebruiken moet je WP REST API installeren en activeren.

PHP

Minimum PHP versie: 7.4.0

PHP HTTP autorisatie header inschakelen

De meeste shared hosting heeft de HTTP authorization header standaard uitgeschakeld.

Om deze optie in te schakelen moet je je .htaccess bestand bewerken en het volgende toevoegen

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

WPENGINE

Om deze optie in te schakelen moet je je .htaccess bestand bewerken en het volgende toevoegen

Bekijk https://github.com/Tmeister/wp-api-jwt-auth/issues/1

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

CONFIGURATIE

De geheime sleutel configureren

Het JWT heeft een geheime sleutel nodig om het token te ondertekenen. Deze geheime sleutel moet uniek zijn en mag nooit worden onthuld.

Om de geheime sleutel toe te voegen bewerk je wp-config.php bestand en voeg een nieuwe constante toe genaamd JWT_AUTH_SECRET_KEY

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key');

Je kunt een string gebruiken vanaf hier https://api.wordpress.org/secret-key/1.1/salt/

Configureren van COR’s ondersteuning

De wp-api-jwt-auth plugin heeft de optie om CORs ondersteuning te activeren.

Om de CORs ondersteuning in te schakelen bewerk je wp-config.php bestand en voeg een nieuwe constante toe genaamd JWT_AUTH_CORS_ENABLE

define('JWT_AUTH_CORS_ENABLE', true);

Activeer tenslotte de plugin in je wp beheer.

Namespace en endpoints

Wanneer de plugin wordt geactiveerd, wordt een nieuwe namespace toegevoegd

/jwt-auth/v1

Ook worden twee nieuwe endpoints toegevoegd aan deze namespace

Endpoint | HTTP Verb
/wp-json/jwt-auth/v1/token | POST
/wp-json/jwt-auth/v1/token/validate | POST

GEBRUIK

/wp-json/jwt-auth/v1/token

Dit is het ingangspunt voor de JWT authenticatie.

Valideert de gebruikersgegevens, gebruikersnaam en wachtwoord, en stuurt een token terug voor gebruik in een toekomstig verzoek aan de API als de authenticatie correct is, of een fout als de authenticatie mislukt.

Voorbeeldaanvraag met 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] );
      } );

  } );

} )();

Succesvolle reactie van de server

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8",
    "user_display_name": "admin",
    "user_email": "admin@localhost.dev",
    "user_nicename": "admin"
}

Fout reactie van de server

{
    "code": "jwt_auth_failed",
    "data": {
        "status": 403
    },
    "message": "Invalid Credentials."
}

Zodra je het token hebt, moet je het ergens in je applicatie opslaan, bijvoorbeeld in een cookie of met behulp van localstorage.

Vanaf dit punt moet je dit token doorgeven aan elke API aanroep

Voorbeeldoproep met de autorisatie header in 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;
      }
    };
  } ] );
} );

De wp-api-jwt-auth onderschept elke oproep naar de server en zoekt naar de autorisatieheader. Als de autorisatieheader aanwezig is, probeert hij het token te decoderen en stelt hij de gebruiker in volgens de gegevens die erin zijn opgeslagen.

Als het token geldig is, gaat de API aanroep flow door zoals altijd.

Voorbeeld headers

POST /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_s9.B5f-4.1JqM

FOUTEN

Als het token ongeldig is, wordt een foutmelding gegeven. Hier volgen enkele voorbeelden van fouten.

Ongeldige credentials

[
  {
    "code": "jwt_auth_failed",
    "message": "Invalid Credentials.",
    "data": {
      "status": 403
    }
  }
]

Ongeldige handtekening

[
  {
    "code": "jwt_auth_invalid_token",
    "message": "Signature verification failed",
    "data": {
      "status": 403
    }
  }
]

Verlopen Token

[
  {
    "code": "jwt_auth_invalid_token",
    "message": "Expired token",
    "data": {
      "status": 403
    }
  }
]

/wp-json/jwt-auth/v1/token/validate

Dit is een eenvoudig helper endpoint om een token te valideren; je hoeft alleen een POST aanvraag te verzenden met de autorisatie header.

Geldig token reactie

{
  "code": "jwt_auth_valid_token",
  "data": {
    "status": 200
  }
}

BESCHIKBARE HOOKS

De wp-api-jwt-auth is dev vriendelijk en heeft vijf filters beschikbaar om de standaardinstellingen te overschrijven.

jwt_auth_cors_allow_headers

Met de jwt_auth_cors_allow_headers kan je de beschikbare headers wijzigen wanneer de CORs ondersteuning is ingeschakeld.

Standaardwaarde:

'Access-Control-Allow-Headers, Content-Type, Authorization'

jwt_auth_not_before

Met de jwt_auth_not_before kan je de nbf waarde te wijzigen voordat het token wordt aangemaakt.

Standaardwaarde:

Creation time - time()

jwt_auth_expire

Met de jwt_auth_expire kan je de waarde exp voordat het token wordt aangemaakt.

Standaardwaarde:

time() + (DAY_IN_SECONDS * 7)

jwt_auth_token_before_sign

Met de jwt_auth_token_before_sign kan je alle tokengegevens wijzigen voordat ze worden gecodeerd en ondertekend.

Standaardwaarde

<?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

Met de jwt_auth_token_before_dispatch kan je toestaan de gehele reactie array wijzigen voordat deze naar de client wordt verzonden.

Standaardwaarde:

<?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_algoritme

Met jwt_auth_algorithm kan je het ondertekeningsalgoritme wijzigen.

Standaardwaarde:

<?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'))
);

Testen

Ik heb een kleine app gemaakt om de basisfunctionaliteit van de plugin te testen; je kunt de app krijgen en alle details lezen op de JWT-Client repo

Installatie

Het WordPress dashboard gebruiken

  1. Navigeer naar ‘Nieuwe plugin’ in het plugins dashboard
  2. Zoeken naar ‘jwt-authentication-for-wp-rest-api’
  3. Klik op ‘Nu installeren
  4. Activeer de plugin op het plugin dashboard

Uploaden in WordPress dashboard

  1. Navigeer naar ‘Nieuwe plugin’ in het plugins dashboard
  2. Navigeer naar het ‘Upload’ gebied
  3. Selecteer jwt-authentication-for-wp-rest-api.zip van je computer
  4. Klik op ‘Nu installeren
  5. Activeer de plugin in het plugin dashboard

Lees hoe je de plugin https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/ configureert

Beoordelingen

13 maart 2024
I integrated it with my Flutter app, and it works flawlessly. Here is a little piece of code that I implemented to get User ID and Role: add_filter('jwt_auth_token_before_dispatch', 'add_user_id_and_role_to_jwt_response', 10, 2); function add_user_id_and_role_to_jwt_response($data, $user) { // Aggiungi il campo 'user_id' al JSON della risposta $data['user_id'] = $user->data->ID; // Ottieni il ruolo dell'utente $user_roles = $user->roles; $user_role = !empty($user_roles) ? $user_roles[0] : ''; // Aggiungi il campo 'user_role' al JSON della risposta $data['user_role'] = $user_role; // Restituisci il nuovo array dati modificato return $data; }
30 januari 2024
Perfect! This plugin is very easy to install and use. It's also easy to extend and add your own return data.
21 november 2023
It totally works fine. It was challenging to set it up in start but this plugin is helping me to extend the functionalities for my mobile app.
5 september 2023 4 reacties
Hi, The new version (1.3.3) block woocommerce api call. I use OAuth1 for woocommerce so I didn't use jwt for that (only for sign in) but now I have a 403 error. Message: "Authorization header malformed." Can you tell why and how to resolved that ? Thank you.
Lees alle 43 beoordelingen

Bijdragers & ontwikkelaars

“JWT Authentication for WP REST API” is open source software. De volgende personen hebben bijgedragen aan deze plugin.

Bijdragers

Changelog

1.3.4

  • Fix: Skip any type of validation when the authorization header is not Bearer.
  • Feature: Added a setting page to share data and add information about the plugin.

1.3.3

  • Update php-jwt naar 6.4.0
  • PHP waarschuwingen opgelost (https://github.com/Tmeister/wp-api-jwt-auth/pull/259)
  • Fix the condition where it checks if the request is a REST Request (https://github.com/Tmeister/wp-api-jwt-auth/pull/256)

1.3.2

  • Conflicten oplossen met andere plugins die dezelfde JWT bibliotheek gebruiken door een wrapper namespace toe te voegen aan de JWT klasse.

1.3.1

  • Updaten van de minimum versie van PHP naar 7.4
  • Valideer het ondertekeningsalgoritme aan de hand van de ondersteunde algoritmen @see https://www.rfc-editor.org/rfc/rfc7518#section-3
  • De REQUEST_URI en HTTP_AUTHORIZATION waarden zuiveren alvorens ze te gebruiken
  • Gebruik get_header() in plaats van $_SERVER om de autorisatie header te krijgen wanneer mogelijk
  • Getypte eigenschappen toegevoegd aan de JWT_Auth klasse waar mogelijk
  • Samen met deze release breng ik een nieuwe eenvoudige JWT client app uit voor testdoeleinden @zie https://github.com/Tmeister/jwt-client

1.3.0

  • Firebase/php-jwt naar 6.3 updaten
  • Lost waarschuwing, register_rest_route werd verkeerd aangeroepen op
  • Basic auth toestaan, door niet te proberen authentication headers te valideren als er al een geldige gebruiker is vastgesteld (zie: https://github.com/Tmeister/wp-api-jwt-auth/issues/241)
  • Een nieuw filter toegevoegd (jwt_auth_algorithm) om het algoritme voor het ondertekenen van het token aan te passen toe te staan
  • Met dank aan: https://github.com/bradmkjr

1.2.6

  • Cookies && token compatibiliteit
  • Het Coreprobleem met oneindige lussen in Gutenberg oplossen en de token validatie/generatie toestaan als de WP cookie bestaat.
  • Meer info (https://github.com/Tmeister/wp-api-jwt-auth/pull/138)
  • Met dank aan: https://github.com/andrzejpiotrowski

1.2.5

  • Gutenberg compatibiliteit toevoegen
  • Meer info (https://github.com/Tmeister/wp-api-jwt-auth/issues/126)

1.2.4

  • Update firebase/php-jwt naar v5.0.0 ( https://github.com/firebase/php-jwt )
  • PHP tag toevoegen vereist

1.2.3

  • Max recursiefout oplossen in WordPress 4.7 #44

1.2.2

  • Een extra validatie toevoegen om de autorisatie header te krijgen
  • Verhoog determine_current_user prioriteit fix #13
  • Voeg het gebruikersobject toe als parameter in de jwt_auth_token_before_sign hook
  • Foutbericht verbetert wanneer auth mislukt #34
  • Getest met 4.6.1

1.2.0

  • Getest met 4.4.2

1.0.0

  • Initiële release.