codelight-eu/wp-api-jwt-auth

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

资助包维护!
Patreon

安装次数: 89

依赖项: 0

建议者: 0

安全性: 0

星标: 1

关注者: 1

分支: 160

类型:wordpress-plugin

1.2.8 2022-04-06 16:49 UTC

This package is auto-updated.

Last update: 2024-09-23 12:59:32 UTC


README

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

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

要求

WP REST API V2

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

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

PHP

最低 PHP 版本:5.3.0

启用 PHP HTTP 认证头

共享主机

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

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

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

WPEngine

要启用此选项,您需要编辑您的 .htaccess 文件,添加以下内容(见 Tmeister#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,
);

测试

从版本1.1.0开始,我添加了一个新的测试套件,以确保此插件的基本功能符合预期。

您可以使用以下命令运行此测试

composer install
includes/vendor/bin/phpunit tests

Command Line Output

所有测试都可以在https://github.com/Tmeister/wp-api-jwt-auth/tree/develop/tests/GeneralTest.php找到

##致谢 WP REST API V2

来自firebase的PHP-JWT

##许可 GPLv2