Laravel——API认证JWT(二)

在返回响应之前,大多数 API 需要通过某种形式的身份验证。 有时,经过和未经过身份验证的请求,响应的内容会有所不同。也就是登录之后的用户看到页面和没有登录看到页面是不一样的。

JSON Web Tokens (JWT)

tymon/jwt-auth 是使用第三方来集成 JWT 身份验证的软件包。

Laravel API 认证:JWT 认证 | Laravel China 社区

一旦您安装了这个软件包,您就可以在 config/api.php 文件或者引导文件中配置该服务提供者。

'auth' => [
    'jwt' => 'Dingo\Api\Auth\Provider\JWT',
],

安装 jwt-auth

composer require tymon/jwt-auth

发布配置文件

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

安装好之后,config文件夹加多一个jwt的配置

生成 JWT_SECRET 你可以通过运行如下命令自动生成 JWT_SECRET 到 .env 中

php artisan jwt:secret

执行之后

更新user模型

 

然后还需要加入下面代码

  // Rest omitted for brevity

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }

配置 Auth guard 

DinggoAPI配置

 在路由中限制登录需要验证的路由

$api->version('v1', function ($api) {
    $api->get('user', ['middleware' => 'api.auth', 'providers' => ['basic', 'oauth'], function () {
        // 这个路由将进行身份验证。
    }]);
});

 一般使用路由分组

<?php

$api = app('Dingo\Api\Routing\Router');
$api->version('v1',['middleware'=>'api.throttle','limit'=>60,'expires'=>1], function ($api) {
//路由组
    $api->group(['prefix'=>'auth'],function ($api){
//      用户注册
        $api->post('register',[\App\Http\Controllers\Auth\RegisterController::class,'store']);
//      登录的路由
        $api->post('login',[\App\Http\Controllers\Auth\LoginController::class,'login']);
//      需要登录之后验证的路由
        $api->group(['middleware'=>'api.auth'],function ($api){
//            退出登录
            $api->post('logout',[\App\Http\Controllers\Auth\LoginController::class,'logout']);
//            刷新token
            $api->post('refresh',[\App\Http\Controllers\Auth\LoginController::class,'refresh']);
        });
    });

});

 做登录生成token

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\BaseController;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use Illuminate\Http\Request;

class LoginController extends BaseController
{
    /**
     * 登录
     */
    public function login(LoginRequest $request)
    {

        $credentials = request(['username','email', 'password']);

        if (!$token = auth('api')->attempt($credentials)) {
            return $this->response->errorUnauthorized();
        }

//        检测用户状态
        $user = auth('api')->user();
        if($user->is_locked == 1){
            return $this->response->errorForbidden('被锁定');
        }
        return $this->respondWithToken($token);
    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth('api')->user());
    }

    /**
     * 退出登录
     */
    public function logout()
    {
        auth('api')->logout();

        return $this->response->noContent();
    }

    /**
     * 刷新token
     */
    public function refresh()
    {
        return $this->respondWithToken(auth('api')->refresh());
    }

    /**
     *格式化返回token
     */
    protected function respondWithToken($token)
    {
        return $this->response->array([
            'access_token' => $token,
            'token_type' => 'Bearer',
            'expires_in' => auth('api')->factory()->getTTL() * 60
        ]);
    }
}

这个 token 将可以被用来认证.

认证方式
支持以下两种方式。通过 HTTP 请求来认证:

Authorization header

Authorization: Bearer eyJhbGciOiJIUzI1NiI...

Query string parameter

http://example.dev/me?token=eyJhbGciOiJIUzI1NiI...
 通过token获取用户信息
//    jwt验证
    public function Users(){

//        获取所有用户
//        $users = User::all();
//        return $this->response
//            ->collection($users, new UserTransformer);

//        第一种方法 通过token获取用户信息
//        $user = app('Dingo\Api\Auth\Auth')->user();
//        return $user;
//        第二种方法 通过token获取用户信息
//        $user = auth('api')->user();
//        return $user;
//        第三种方法 通过token获取用户信息
        $user = $this->auth()->user();
        return $user;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值