drozzi-pro/wp-api-jwt-auth

一个简单的插件,用于向WP REST API添加JSON Web Token (JWT) 身份验证。

资助包维护!
Patreon

安装次数: 26

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分叉: 0

类型:wordpress-plugin

1.1.3 2023-11-06 10:49 UTC

README

一个简单的插件,用于向WP REST API添加 JSON Web Token (JWT) 身份验证。

要了解更多关于JSON Web Tokens的信息,请访问 https://jwt.net.cn

要求

WP REST API V2

此插件是为了扩展 WP REST API V2 插件的功能而设计的,并且当然是在其基础上构建的。

因此,要使用 wp-api-jwt-auth,您需要安装并激活 WP REST API

PHP

最低PHP版本:7.4.0

启用PHP HTTP授权头

共享主机

大多数共享主机默认禁用了 HTTP授权头

要启用此选项,您需要编辑您的 .htaccess 文件,并添加以下内容

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

WPEngine

要启用此选项,您需要编辑您的 .htaccess 文件,并添加以下内容(见 Tmeister/wp-api-jwt-auth#1

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

安装与配置

下载zip文件,然后像其他WordPress插件一样进行安装。

或者克隆此存储库到您的WordPress安装的wp-content/plugins文件夹中。

配置密钥

JWT需要一个 密钥 来签名令牌。此 密钥 必须是唯一的,并且永远不要泄露。

要添加 密钥,请编辑您的 wp-config.php 文件,并添加一个名为 JWT_AUTH_SECRET_KEY 的新常量。

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

您可以使用这里提供的字符串 https://api.wordpress.org/secret-key/1.1/salt/

配置CORS支持

wp-api-jwt-auth 插件具有激活 CORS 支持的选项。

要启用CORS支持,请编辑您的 wp-config.php 文件,并添加一个名为 JWT_AUTH_CORS_ENABLE 的新常量

define('JWT_AUTH_CORS_ENABLE', true);

最后,在插件仪表板中激活插件。

命名空间和端点

当插件激活时,会添加一个新的命名空间。

/jwt-auth/v1

此外,还向此命名空间添加了两个新端点。

使用方法

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

这是JWT身份验证的入口点。

验证用户凭据,即 用户名密码,如果身份验证正确,则返回用于将来API请求的令牌,如果身份验证失败,则返回错误。

使用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] );
      } );

  } );

} )();

来自服务器的成功响应

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

来自服务器的错误响应

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

一旦您获得了令牌,您必须将其存储在您的应用程序中,例如在 cookie 中或使用 localstorage

从这一点开始,您应该在每次API调用中传递此令牌。

使用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》插件将拦截对服务器的所有调用,并查找授权头。如果存在授权头,它将尝试解码令牌,并根据其中存储的数据设置用户。

如果令牌有效,API调用流程将像往常一样继续。

示例头信息

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

错误

如果令牌无效,将返回错误。以下是错误示例:

无效凭证

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

无效签名

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

令牌过期

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

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

这是一个简单的辅助端点,用于验证令牌;您只需要发送包含授权头的POST请求。

有效令牌响应

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

可用钩子

《wp-api-jwt-auth》对开发者友好,并提供了五个过滤器来覆盖默认设置。

jwt_auth_cors_allow_headers

jwt_auth_cors_allow_headers 允许您在启用CORs支持时修改可用头信息。

默认值

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

jwt_auth_not_before

jwt_auth_not_before 允许您在创建令牌之前更改 nbf 值。

默认值

Creation time - time()

jwt_auth_expire

jwt_auth_expire 允许您在创建令牌之前更改 exp 值。

默认值

time() + (DAY_IN_SECONDS * 7)

jwt_auth_token_before_sign

jwt_auth_token_before_sign 允许您在编码和签名之前修改所有令牌数据。

默认值

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

jwt_auth_token_before_dispatch 允许您在将响应数组发送到客户端之前修改所有响应数组。

默认值

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

jwt_auth_algorithm 允许您修改签名算法。

默认值

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

测试

我创建了一个小程序来测试该插件的基本功能;您可以在 JWT-Client Repo 上获取该应用程序并查看所有详细信息。

鸣谢

WP REST API V2

来自firebase的PHP-JWT

##许可证 GPLv2