微服务(二) php laravel 用户客户端

本文介绍了如何在Laravel环境中配置和使用gRPC客户端调用GoKratos服务端,完成用户注册和登录功能。涉及内容包括安装grpcprotobuf,生成客户端代码,添加jwt中间件和jwt服务,以及实现注册和登录控制器。
摘要由CSDN通过智能技术生成

本节主要讲解通过laravel 作为客户端调用go kratos 服务端,实现用户注册登录

环境

docker desk
laradock
laravel

环境准备

  1. 通过laradock php-fpm 安装 grpc protobuf
  2. workspace 安装protoc安装 protoc 与 grpc_php_plugin 可执行文件(这个plugin创建整很久)
  3. 为方便把grpc_php_plugin放到GRPC文件目录
  4. 在worksapce使用protoc 与 grpc_php_plugin 生成客户端代码
protoc --proto_path=./ --php_out=./php-src/ --grpc_out=./php-src/ --plugin=protoc-gen-grpc=./grpc_php_plugin  ./api/user/v1/user.proto

生成客户端代码
在这里插入图片描述

实现

  1. 添加客户端调用服务层代码
    在这里插入图片描述
  2. 添加grpc 调用组件及GRPC服务的自动加载
composer require grpc/grpc
composer require google/protobuf

grpc 服务文件自动加载

"autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/",
            "GPBMetadata\\":"GRPC/php-src/GPBMetadata/",
            "":"GRPC/php-src/"
        }
    },
  1. 增加jwt 中间件
composer require firebase/php-jwt

添加中间件app/Http/Middleware/ApiJwt.php

<?php

namespace App\Http\Middleware;

use App\Service\Jwt;
use Closure;
use Illuminate\Http\Request;

class ApiJwt
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        //将token放入header中传输
        $token = $request->header('Authorization');
        if (!$token) {
            return response()->json(['code' => 500, 'msg' => 'token不存在', 'data' => []]);
        }
        $result = Jwt::decodeToken($token);
        if ($result) {
            //将加密id解密传入下一步
            $request->attributes->add(['user_id' => $result->user_id, 'nickname' => $result->nickname]);
        } else {
            return response()->json(['code' => 500, 'msg' => 'token过期', 'data' => []]);
        }
        return $next($request);
    }
}

添加jwt 服务app/Service/Jwt.php

<?php
namespace App\Service;

use Firebase\JWT\JWT as JwtService;
use Firebase\JWT\Key;

class Jwt
{
    protected static $key = 'laravel-tiway';

    //加密
    public static function createToken($userId, $nickname)
    {
        $payload = array(
            "iss" => "http://example.org",
            "aud" => "http://example.com",
            'exp' => time() + (24 * 3600),
            'user_id' => $userId,
            'nickname' => $nickname,
        );
        $jwt = JwtService::encode($payload, self::$key, 'HS256');
        return $jwt;
    }

    //解密
    public static function decodeToken($jwt)
    {
        $decoded = JwtService::decode($jwt, new Key(self::$key, 'HS256'));
        if ($decoded) {
            return $decoded;
        } else {
            return false;
        }

    }
}
  1. 实现登录注册 app/Http/Controllers/UserController.php
<?php

namespace App\Http\Controllers;

use App\Service\GrpcUser;
use App\Service\Jwt;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \Exception
     */
    public function register(Request $request)
    {
        $input = $request->only('nickname', 'mobile', 'password');
        //用户手机号码是否已注册
        $user = GrpcUser::getUserByMobile($input['mobile']);
        if (isset($user['id'])) {
            throw new \Exception('手机号码已被注册');
        }
        //创建用户
        $user = GrpcUser::CreateUser($input['nickname'], $input['mobile'], $input['password']);
        if (!isset($user['id'])) {
            throw new \Exception('创建失败');
        }

        return response()->json([
            'success' => true,
            'data' => $user
        ], 200);
    }

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \Exception
     */
    public function login(Request $request)
    {
        $input = $request->only('mobile', 'password');
        //是否已经存在相同手机号码
        $isLogin = GrpcUser::checkoutUserPassword($input['mobile'], $input['password']);
        if (!$isLogin) {
            throw new \Exception('账号或密码错误');
        }
        //获取用户信息
        $user = GrpcUser::getUserByMobile($input['mobile']);
        //jwt
        if (isset($user['id'])) {
            $token = Jwt::createToken($user['id'], $user['nickname']);
        }

        return response()->json([
            'success' => true,
            'token' => $token,
        ]);
    }

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function getUser(Request $request)
    {
        $userId = $request->attributes->get('user_id');
        $user = GrpcUser::getUserById($userId);
        return response()->json(['user' => $user]);
    }

}

代码参考:laravel-tiway

总结

  1. 后期有时间把用户信息全部添加一个redis 缓存
  2. 简化controller,添加仓库层实现数据
  3. 如果你也是用docker desk,为求方便,联系我,我将提供workspace 和php-fpm 的镜像压缩包
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值