利用 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 协议》,转载必须注明作者和本文链接
推荐文章: