Flutter WordPress 应用的 JWT 认证

这个 Flutter 应用程序旨在通过 Tmeister/wp-api-jwt-auth 存储库获取的 JWT 身份验证 API 促进登录 WordPress 站点。该应用程序允许用户注册、登录和访问特定页面。它通过实施基于 JWT 令牌的身份验证,提供了安全且可扩展的架构。

特点

  • 带 Flutter 的 JWT 身份验证应用
  • 使用 WordPress API 服务登录 WordPress
  • 已认证用户的令牌生成和验证
  • 基于令牌的身份验证以访问受保护页面
  • 与 WordPress API 集成以进行用户注册和登录
  • 使用 shared_preferences 进行数据存储
  • 使用 secure_storage 安全存储令牌

截图

login screen

注册屏幕

register screen

主屏幕

home screen

个人资料屏

profile screen

图书页面

book screen

入门

请按照以下步骤在您的本地环境中运行该项目。

要求

  • Flutter SDK
  • 依赖项

安装

  1. 克隆项目

    git clone https://github.com/nurullahturkoglu/flutter-jwt-auth-for-wordpress.git
    
  2. 安装必需的依赖项

    flutter pub get
    
  3. 运行应用程序

    flutter run
    

用法

下面,您将找到有关项目中文件用途的重要文件和详细信息。

身份验证中间件

auth_middleware.dart 文件用于启用页面的令牌验证。如果用户没有令牌、令牌已过期或提供了无效令牌,他们将被自动重定向到登录页面。

Future<void> validateToken() async {
    bool isValid = await WordPressAuthMethods().validateUserToken();

    if (!isValid) {
      navigateToLoginPage();
      return;
    }

    setState(() {
      isAuthenticated = isValid;
    });
}

WordPress 身份验证方法

wordpress_auth_methods.dart 文件处理 WordPress 登录、注册和验证过程。用户信息使用 shared_preferences 存储,而令牌使用 secure_storage 安全存储。如果令牌不可用或已过期,用户将被自动重定向到登录页面。

WordPress 登录函数

注意: ⚠️ 我对 Tmeister/wp-api-jwt-auth 存储库中的 jwt-authentication-for-wp-rest-api/public/class-jwt-auth-public.php 文件进行了一些修改。下面,您将找到添加到 generate_token 部分的代码片段

'user_id'         => $user->data->ID,
'user_role'       => $user->roles[0],

通过这样做,您可以像这样获得登录成功的响应

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.***",
    "user_id": "13",
    "user_email": "[email protected]",
    "user_nicename": "Nurullah Turkoglu",
    "user_display_name": "turkoglu1",
    "user_role": "subscriber"
}

validate_token 函数中,我添加了以下代码以更有效地检索用户 ID

'data' => [
    'status' => 200,
    'user_id' => $token->data->user->id,
],

如果令牌有效,您可以获得如下响应

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

WordPress 注册函数

我添加了一个作为 API 的注册函数,独立于 Tmeister/wp-api-jwt-auth 存储库。此注册函数允许您在 WordPress 中执行用户注册。如果您想激活注册过程,应将以下代码添加到插件的 api/public/class-jwt-auth-public.php 文件中的 add_api_routes() 函数

register_rest_route($this->namespace, '/register', array(
    'methods'             => 'POST',
    'callback'            => array($this, 'create_user'),
    'permission_callback' => '__return_true',
));

此外,您需要创建 phpcreate_user() 函数

function create_user($request) {
    $params = $request->get_params();

    // Get the username and password
    $username = sanitize_text_field($params['username']);
    $password = sanitize_text_field($params['password']);

    // Check if a user with the same username already exists
    $existing_user = get_user_by('login', $username);
    if ($existing_user) {
        // A user with the same username already exists
        $response = array(
            'status'  => 'error',
            'message' => 'The username is already taken.',
        );
    } else {
        // Create a new user
        $user_id = wp_create_user($username, $password);

        if (!is_wp_error($user_id)) {
            // Successful registration
            $response = array(
                'status'  => 'success',
                'message' => 'User created successfully.',
                'user_id' => $user_id,
            );
        } else {
            // Error occurred
            $error = $user_id->get_error_message();
            $response = array(
                'status'  => 'error',
                'message' => "Failed to create user. $error",
            );
        }
    }

    // Return the response
    return $response;
}

通过这样做,您可以通过向地址 https://yourdomain.com/wp-json/jwt-auth/v1/register 发送 POST 请求以及以下 JSON 负载来创建新的成员资格

{
    "username": "test123",
    "password": "123"
}

主代码

项目的主文件包含以下代码

return MaterialApp(
  title: 'JWT Auth Tutorial',
  routes: {
    '/login': (context) => const LoginPage(),
    '/register': (context) => const RegisterPage(),
    '/home': (context) => const AuthMiddleware(child: HomePage()),
    '/book': (context) => const AuthMiddleware(child: BookPage()),
    '/profile': (context) => const AuthMiddleware(child: ProfilePage()),
  },
  home: const LoginPage(),
);

上面的代码使用 AuthMiddleware 小部件将令牌验证添加到不同的页面。这确保了在访问某些页面之前会执行令牌验证。

鸣谢

使用 TMeister JWT Auth 在 WordPress 中生成令牌和验证令牌。

贡献

我们欢迎为本项目做出贡献!如果您想做出贡献,请遵循以下步骤

  1. Fork该存储库。
  2. 为您的功能或 bug 修复创建新分支。
  3. 进行更改并提交。
  4. 将您的更改推送到您的分叉存储库。
  5. 提交一个描述您的更改的拉取请求。

请确保您的贡献符合本项目的编码约定和指南。

许可证

本项目根据 MIT 许可证授权。有关详细信息,请参阅 LICENSE 文件。

GitHub

查看 Github