[Day13] 第十三章-完成登入API (产生jwt token给前端使用)

前言

前面我们完成了注册相关的api
今天我们接续完成登入吧!!
今天的目标除了是使用laravel 提供的Auth函式
我们也可以使用jwt套件完成

勘误


app/models/user.php

我发现之前Class引用错了
我前面打成laravel的Sanctum
use Laravel\Sanctum\HasApiTokens;
这个会导致後面要产生呼叫错误
不会产生JWTtoken

我们修正一下改成Passport的Class

use Laravel\Passport\HasApiTokens;

补充

在开始之前想跟大家推荐一个套件(侦测路径使用)

PHP Intelephense

之前我装一大堆大件所以没有发现
现在是新环境而且不是phpstrom这种内建邦你包好很多plugin的IDE
会遇到我在key一些laravel class找不到相关路径提示字(尤其laravel超多class.....)
有时候找key又臭又长的class真的会很想哭/images/emoticon/emoticon02.gif

来给各位看一下前後比对

这边是没有安装套件的

接者是有安装套件的

实作

1.测试laravel Auth::attemp登入验证函式

先把我们之前的authcontroller打开吧!
app/http/controllers/AuthController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\CreateUser;
use App\models\User;
use Illuminate\Support\Facades\Auth; //新增auth函式

class AuthController extends Controller
{
    //
    public function signup(CreateUser $request)
    {
        $validateData = $request->validated();
        $user = new User([
            'name'=> $validateData['name'],
            'email' =>$validateData['email'],
            'password' => bcrypt($validateData['password']),
        ]);
        $user->save();
        return response($user,201);
    }
    public function login(Request $request)
    {
        $validateData = $request->validate([
            'email' => 'required|string|email',
            'password' => 'required|string'
        ]);
        if(!Auth::attempt($validateData)){
            return response('登入失败',401);
        }
        $user = $request->user();
        return $user;
    }
}

小常识 Illuminate 是灯光的意思。laravel开发者希望laravel提供的套件模组向灯光一样指引我们开发者喔!

新增程序码:

  • 这边我们新增了laravel 提供的Auth Class它提供了取多登入的验证还有授权function使用
  • 新增了login这个function并且透过attemp来验证使用者
  • 我们一样透过validate这个验证function验证前端的request判别是否资料符合型态

小知识: laravel 在做完auth认证成功时 会在$request物件里面新增user资料

都完成後我们来把route补齐
routes/web.php

Route::post('login','AuthController@login');

补上我们的login路由

最後我们使用昨天注册的会员资料来验证结果吧!
帐号:[email protected]
密码:12345678

先测试一下错误示范
密码先故意打错

成功会长这样

有没有很神奇呢!?
laravel自动把 user 物件挖出来了!!

安装jwt套件

首先我们先安装 jwt套件

composer require lcobucci/jwt

如果你跟我一样是比较新的laravel版本(8.1後)
可能会遇到一些错误我们一一解决吧!!


这边有两个小问题要解决

  1. 相依套件可一起升级(-W在安装套件可加此参数升级套件)
  2. 修改php.ini(把扩充sodium打开)

如果你跟我一样是xampp安装有福了就不需要很辛苦地找他位置在哪
我们把xampp打开 congfig里面的php.ini

打开後把分号注解拿掉储存即可!!

最後会长这样

看到这画面代表成功了(洒花)!

/images/emoticon/emoticon01.gif

工程师会常常遇到错误也不要气馁
每次成功後的喜悦跟成就感会帮助自己成长喔!!

3.产生jwt token

最後我们一口气做完吧

最後把login function修改成这样

    public function login(Request $request)
   {
       $validateData = $request->validate([
           'email' => 'required|string|email',
           'password' => 'required|string'
       ]);
       if(!Auth::attempt($validateData)){
           return response('登入失败',401);
       }
       $user = $request->user();
       $token = $user->createToken('Token');
       // dd($token);
       $token->token->save();
       return response(['token'=>$token->accessToken]);
   }

createToken函式是在我们user Model里面引入得Passpoer HasAPI也就是我前面勘误的Class
所以前面才说如果这边错了要跟者我修正喔XD

接者我们可以使用postman来测试api

总结

今天使用做完登入
并且产生jwt token来做登入使用
有兴趣的人可以把token
丢到
jwt官网去解析喔
https://jwt.io/

他主要的目的会帮助你做好签章(验证token安全性)
以及包装一些常用资料


<<:  [Day20] Emmet 学习笔记 - 层级篇

>>:  Day 13 Section Summary

Day1 - 前言

杂谈 今年是个很特别的一年,对威尔猪来说也是,从没写过任何形式的笔记或文章,也没什麽特别规划,居然就...

Day 14 Compose GridLayout

今年的疫情蛮严重的,希望大家都过得安好,希望疫情快点过去,能回到一些线下技术聚会的时光~ 今天目标:...

[常见的自然语言处理技术] 文本相似度(I): Word Embeddings

前言 在我们每日使用的语言当中,我们经常能根据单词所表的意义区分出同义词与反义词,例如英文中形容词 ...

[Day 12]我也好想成为时间管理大师(後端篇)

挑战目标: MockNative Camp 昨天我们将SignupReq.java给建立完,现在要开...

My experience with Customer Obsession

Clients’ satisfaction is the priority while achiev...