日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle access manager token,Laravel 自带的 API 守卫驱动 token 使用详解

發布時間:2024/9/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle access manager token,Laravel 自带的 API 守卫驱动 token 使用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Laravel框架中,默認的用戶認證守衛有兩個,web和api,web守衛默認的驅動是session,而api守衛默認的驅動是token。那么,該如何使用這個token驅動?

尋找 TokenGuard

通過 Auth::guard() 這個方法,可以追溯到 token 驅動對應的類。來看Illuminate\Auth\AuthManager中的代碼:

/**

* Attempt to get the guard from the local cache.

*

* @param string $name

* @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard

*/

public function guard($name = null)

{

$name = $name ?: $this->getDefaultDriver();

return $this->guards[$name] ?? $this->guards[$name] = $this->resolve($name);

}

/**

* Resolve the given guard.

*

* @param string $name

* @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard

*

* @throws \InvalidArgumentException

*/

protected function resolve($name)

{

$config = $this->getConfig($name);

if (is_null($config)) {

throw new InvalidArgumentException("Auth guard [{$name}] is not defined.");

}

if (isset($this->customCreators[$config['driver']])) {

return $this->callCustomCreator($name, $config);

}

$driverMethod = 'create'.ucfirst($config['driver']).'Driver';

if (method_exists($this, $driverMethod)) {

return $this->{$driverMethod}($name, $config);

}

throw new InvalidArgumentException("Auth driver [{$config['driver']}] for guard [{$name}] is not defined.");

}

可以看到,默認情況下就會調用到 createTokenDriver 。來看看這個方法:

public function createTokenDriver($name, $config)

{

// The token guard implements a basic API token based guard implementation

// that takes an API token field from the request and matches it to the

// user in the database or another persistence layer where users are.

$guard = new TokenGuard(

$this->createUserProvider($config['provider'] ?? null),

$this->app['request']

);

$this->app->refresh('request', $guard, 'setRequest');

return $guard;

}

顯然,api守衛默認的驅動就是TokenGuard。

解讀 TokenGuard

/**

* Create a new authentication guard.

*

* @param \Illuminate\Contracts\Auth\UserProvider $provider

* @param \Illuminate\Http\Request $request

* @param string $inputKey

* @param string $storageKey

* @return void

*/

public function __construct(UserProvider $provider, Request $request, $inputKey = 'api_token', $storageKey = 'api_token')

{

$this->request = $request;

$this->provider = $provider;

$this->inputKey = $inputKey;

$this->storageKey = $storageKey;

}

/**

* Get the currently authenticated user.

*

* @return \Illuminate\Contracts\Auth\Authenticatable|null

*/

public function user()

{

// If we've already retrieved the user for the current request we can just

// return it back immediately. We do not want to fetch the user data on

// every call to this method because that would be tremendously slow.

if (! is_null($this->user)) {

return $this->user;

}

$user = null;

$token = $this->getTokenForRequest();

if (! empty($token)) {

$user = $this->provider->retrieveByCredentials(

[$this->storageKey => $token]

);

}

return $this->user = $user;

}

從構造函數和 user() 方法中可以看出,默認使用

['api_token' => $token]

這個數組去獲取用戶,也就是說,在用戶表中我們需要一個字段(默認api_token)去存儲標識用戶的 token。

開始使用 token 進行api認證

添加數據表字段

use Illuminate\Support\Facades\Schema;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Database\Migrations\Migration;

class AddUsersApiTokenField extends Migration

{

/**

* Run the migrations.

*

* @return void

*/

public function up()

{

Schema::table('users', function (Blueprint $table) {

$table->string('api_token', 60)->unique()->nullable()->after('password');

});

}

/**

* Reverse the migrations.

*

* @return void

*/

public function down()

{

Schema::table('users', function (Blueprint $table) {

$table->dropColumn('api_token');

});

}

}

創建登錄控制器

這里不演示注冊之類的,假設我們的 users 表中已經存在用戶,先創建一個用于 api 登錄的控制器。在每次登錄的時候,更新一次用戶的 api_token 。這里使用了 ThrottlesLogins ,用來控制登錄的嘗試次數。

namespace App\Http\Controllers\Api;

use Hash;

use App\User;

use Illuminate\Http\Request;

use App\Http\Controllers\Controller;

use Illuminate\Foundation\Auth\ThrottlesLogins;

use Illuminate\Validation\ValidationException;

class LoginController extends Controller

{

use ThrottlesLogins;

/**

* @param Request $request

* @return \Illuminate\Http\Response|void

* @throws ValidationException

*/

public function login(Request $request)

{

$this->validateLogin($request);

if ($this->hasTooManyLoginAttempts($request)) {

return $this->sendLockoutResponse($request);

}

return $this->attempLogin($request);

}

/**

* @param Request $request

*/

public function validateLogin(Request $request)

{

$this->validate($request, [

$this->username() => 'required|string',

'password' => 'required|string'

]);

}

/**

* @param Request $request

* @return \Illuminate\Http\Response|void

*/

protected function attempLogin(Request $request)

{

$this->incrementLoginAttempts($request);

$user = User::where('email', $request->email)->first();

if (!$user || !Hash::check($request->password, $user->password)) {

return $this->sendFailedLoginResponse($request);

}

// 更新 api_key

$api_token = uniqid($user->id);

$user->api_token = $api_token;

$user->save();

return $this->sendLoginResponse($request, $user);

}

/**

* @param Request $request

*/

protected function sendFailedLoginResponse(Request $request)

{

throw ValidationException::withMessages([

$this->username() => [trans('auth.failed')],

]);

}

/**

* @param Request $request

* @param User $user

* @return \Illuminate\Http\Response

*/

protected function sendLoginResponse(Request $request, User $user)

{

$this->clearLoginAttempts($request);

return \Response::make([

'user' => $user,

'token' => $user->api_token

]);

}

public function username()

{

return 'email';

}

}

添加登錄路由

將 routes\api.php 修改如下:

Route::namespace('Api')->group(function () {

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

}); # 登錄路由

Route::middleware('auth:api')->get('/user', function (Request $request) {

return $request->user();

});

調試

測試之前先往 users 表中添加幾個用戶,以下是我的測試數據。

可以看到登錄成功并且返回了 token 。

接下去我們使用獲取到的 token 請求需要登錄的接口,默認有一個,就是/user.

ok~ 已經成功返回了數據,說明登錄成功了!

例子中,api_token 是通過 OAuth 2.0 Access Token 的形式傳進去的,但這不是唯一的方法,可以查看 TokenGuard 中的 getTokenForRequest 這個方法,它告訴我們可以用四種不同的形式傳入 api_token

總結

默認的 api token 認證雖然在文檔中沒有提及如何使用,但是通過查看代碼,也很容易使用。但是,在我們不重寫或者擴展 tokenGUard的情況下,api_token 簡直就是裸奔,顯然不可能就這樣應用到項目中去。個人猜測,框架中提供這個功能是為了讓我們更好的理解 api 認證的工作原理,方便我們開發自己需要的 guard ,而且官方文檔也推薦我們使用 passport 或者 jwt 進行 api 認證。

本文出于個人對默認配置的好奇進而探究之后寫下的一片文章,也借鑒了網上的部分文章(忘記查看的文章地址了,也懶得找了),如有理解不到位或者錯誤的,請!斧!正!

歡迎任何形式轉載,記得注明出處哦!

本作品采用《CC 協議》,轉載必須注明作者和本文鏈接

總結

以上是生活随笔為你收集整理的oracle access manager token,Laravel 自带的 API 守卫驱动 token 使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人久久影院 | 欧美xxxx黑人xyx性爽 | 久久九九视频 | 高跟鞋肉丝交足91 | 成人精品亚洲人成在线 | 特级西西人体444www | 色香蕉影院 | 黄瓜视频在线免费观看 | 欧美啪啪一区 | 国产精品久久久久久中文字 | 黄色网页免费在线观看 | 国产精品亚洲天堂 | 五月天久久婷婷 | 欧美三区视频 | 亚洲精品1区 | 久久男人的天堂 | 少妇按摩一区二区三区 | 欧美9999 | 亚洲精品国产成人无码 | 亚洲精品人人 | 99热99re6国产在线播放 | 天堂精品久久 | 亚洲v欧美 | 肉性天堂| 亚洲人精品| 性囗交免费视频观看 | 国产精品国语 | 欧美人体视频一区二区三区 | 95久久| 欧美性生交xxxxxdddd | 日韩精品在线观看一区 | 暖暖成人免费视频 | 久久禁 | 日韩av高清在线观看 | 天天曰夜夜操 | 色老头影视| 色婷婷激情av | 欧美在线不卡视频 | 亚洲国产精品久久久久爰色欲 | 国产精品99久久免费黑人人妻 | 精品一区二三区 | 国产精品亚洲欧美在线播放 | 日韩性欧美 | 日韩精品视频网 | 操操操日日日 | 精品在线免费观看视频 | 日韩成人精品在线观看 | 超碰在线天天 | 六月色丁香 | 婷婷丁香九月 | 午夜视频91 | 亚洲网站免费看 | 一本一道人人妻人人妻αv 九一在线视频 | 亚洲av久久久噜噜噜熟女软件 | 亚洲午夜精品久久久久久浪潮 | 中文字幕免费av | 亚洲视频精品在线观看 | 美腿丝袜av | a级免费视频 | 国产精品zjzjzj在线观看 | 久久精品一区 | 无码一区二区波多野结衣播放搜索 | 天天射天天干天天舔 | 欧美影视 | 色射色 | 久久久欧美精品 | 69视频一区二区三区 | 中文字幕少妇 | 麻豆免费在线 | 国产精品一区二区三区四 | 岛国免费视频 | 国产色在线 | 可以免费看的黄色网址 | 国产精品欧美久久久久久 | 亚洲综合久久网 | sese亚洲 | 国产乱码一区二区三区在线观看 | 美女超碰在线 | 亚洲国产免费看 | 国产伦理一区二区 | av免费观看网址 | av中文网站| 亚洲手机av | 国产三级伦理片 | 99在线精品视频 | 日本中文字幕有码 | 亚色影库 | 木下凛凛子av一区二区三区 | 欧美久久久久久久久中文字幕 | 日韩在线视频你懂的 | 天天色官网 | 黄网站在线免费 | 国产又爽又黄的激情精品视频 | 欧美91精品 | 欧美在线免费看 | 91精品视频网| 男人天堂国产 | 肉丝超薄少妇一区二区三区 | 亚洲成人精 |