codelight-eu / wp-api-jwt-auth
一个简单的插件,用于向 WP REST API 添加 JSON Web Token (JWT) 身份验证。
Requires
- php: >=5.3
- composer/installers: ~1.0
- firebase/php-jwt: ^5.0.0
Requires (Dev)
- guzzlehttp/guzzle: ^6.1
- phpunit/phpunit: ^5.2
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
所有测试都可以在https://github.com/Tmeister/wp-api-jwt-auth/tree/develop/tests/GeneralTest.php找到
##致谢 WP REST API V2
##许可 GPLv2