利用 tymondesigns/jwt-auth ,搭建 Web 和 API 认证系统.

最近想搭建一个 api 的系统,主要的功能要有:

  • 1.web 网页端正常地登录,用 laravel 自带的 php artisan make:auth 认证系统
  • 2.api 手机端用基于 JWT 的 认证系统
  • 3.以上的两种能够自由地进行各自的功能,互不干扰.
  • 4.底层的环境:
    PHP 7.2.6 
    "laravel/framework": "5.6.*",
    "tymon/jwt-auth": "1.0.*"

实现的步骤

1.先根据 Laravel 的用户认证系统 教程,搭建出正常的 PC 端的认证系统.

2.然后再根据 JWT-AUTH Start ,搭建出 JWT API 认证系统

  • 1.注意 jwt 的版本应为 "tymon/jwt-auth": "1.0.*"

  • 2.因为 config/auth.php 中的 defaults.guard 默认为 web ,所以要在 AuthController 中,手动指定 guard 为 api , 如: auth .

  • 3.在用 postman 模拟的请求中,注意参数中的名字, 认证的 token 的几种方法

    • 1.如果是在 header 中认证,就为 Authorization: Bearer eyJhbGciOiJIUzI1NiI...
    • 2.其它,如 Query string Post parameter Cookies 等等,就用 token 为 key ,后面接相应的值.
      file
  • 4.发现的问题(按照教程搭建后,PC web 端登录 session 没有传递)

    • 1.在 config/auth.php 中改变了默认的 guard ,如把 web 改为 api,则 api 方面登录拿到 token 后,可以正常地用 token 拿到数据,但是在浏览器中的登录会被弹出,一直登录不上,反之改变 default/guardweb 也一样.
    • 2.解决方法:
      • 1.在 config/auth.php 中修改 default->guardweb
      • 2.AuthController.php 文件的配置:
                <?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('api', ['except' => ['login']]);
    }

    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = auth('api')->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

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

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth('api')->logout(true);

        return response()->json(['message' => 'Successfully logged out']);
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth('api')->refresh());
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth('api')->factory()->getTTL() * 60
        ]);
    }

    protected function getData(){
//        auth('api');
        if(!auth('api')->user()){
            return response()->json(['message' => 'token 无效!']);
        }
        return response()->json(['message' => '成功拿到所需的数据']);
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
一个想成为建筑设计师的砖瓦工.
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!