利用 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 , 后面接相应的值.
- 1. 如果是在
-
4. 发现的问题 (按照教程搭建后,PC web 端登录 session 没有传递)
- 1. 在
config/auth.php
中改变了默认的guard
, 如把web
改为api
, 则api
方面登录拿到token
后,可以正常地用token
拿到数据,但是在浏览器中的登录会被弹出,一直登录不上,反之改变default/guard
为web
也一样. - 2. 解决方法:
- 1. 在
config/auth.php
中修改default->guard
为web
- 2.
AuthController.php
文件的配置:
- 1. 在
- 1. 在
<?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 协议》,转载必须注明作者和本文链接
推荐文章: