drozzi-pro / wp-api-jwt-auth
一个简单的插件,用于向WP REST API添加JSON Web Token (JWT) 身份验证。
Requires
- php: >=7.4
- composer/installers: ~2.2
- firebase/php-jwt: ^6.3
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-19 03:12:31 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 上获取该应用程序并查看所有详细信息。
鸣谢
##许可证 GPLv2