目錄
您可能感兴趣的文章:
首頁 後端開發 php教程 Laravel5.5中利用Passport實現Auth認證的方法講解

Laravel5.5中利用Passport實現Auth認證的方法講解

Jul 06, 2018 pm 05:52 PM
auth認證 laravel passport

Laravel5.3 開始使用Passport作為API授權,Passport 是基於OAuth2 的,以下這篇文章主要給大家介紹了關於Laravel5.5中利用Passport實現Auth認證的方法,文中透過範例程式碼介紹介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

最近在寫一個前後端分離項目,本來想用Jwt-auth Dingo 開發的,但是略感笨重,於是想到了Laravel 的Passport 和5.5 新出的Api Resource。 Laravel Passport 是一套已經封裝好的 OAuth2 服務端實作

OAuth是一個關於授權(authorization)的開放網路標準,在全世界廣泛應用,目前的版本是2.0版。

OAuth 2.0 是目前比較流行的做法,它率先被Google, Yahoo, Microsoft, Facebook等使用。之所以標註為 2.0,是因為最初有1.0協議,但這個1.0協議被弄得太複雜,易用性差,所以沒有普及。 2.0是一個新的設計,協議簡單清晰,但它並不相容1.0,可以說與1.0沒什麼關係。

所以這裡就不細說了,先來看看怎麼安裝它。

安裝

安裝Passport

1.在你的Shell 中執行以下指令

composer require laravel/passport
登入後複製

如果你使用的Laravel 版本是5.5 以下,你需要手動在config/app.php 檔案providers 陣列中加入如下程式碼

Laravel\Passport\PassportServiceProvider::class,
登入後複製

2.執行遷移檔案

在你的Shell 中執行如下指令

php artisan migrate
登入後複製

Passport 服務提供者使用框架註冊自己的遷移目錄,因此註冊服務後,你可以直接執行php artisan migrate 來為Passport 產生所需的資料表

3.產生加密金鑰

##在你的Shell 中執行以下指令

php artisan passport:install
登入後複製

此指令會建立產生安全存取權杖時所需的加密金鑰,同時,這條指令也會建立用於產生存取權杖的「個人存取」用戶端和「密碼授權」。

4.新增Trait

將LaravelPassportHasApiTokens Trait 加入到AppUser 模型中

#

<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
 use HasApiTokens, Notifiable;
}
登入後複製

#5.註冊路由

在AuthServiceProvider 的boot 方法中呼叫

Passport::routes 函數。

class AuthServiceProvider extends ServiceProvider
{
 public function boot()
 {
  $this->registerPolicies();
  Passport::routes();
 }
}
登入後複製

如果你的程式是需要前後端分離形式的OAuth認證而不是多平台認證那麼你可以在routers()方法中傳遞一個匿名函數來自定定義自己需要註冊的路由,我這裡是前後端分離的認證形式,因此我只需要對我的前端一個Client提供Auth的認證,所以我只註冊了獲取Token的路由,同時我還為它自訂了前綴名。

Passport::routes(function(RouteRegistrar $router) {
 $router->forAccessTokens();
},[&#39;prefix&#39; => &#39;api/oauth&#39;]);
登入後複製

6.更改看守器驅動程式

將設定檔config/auth.php 中授權看守器guards 的api 的driver 選項改為passport。此調整會讓你的應用程式在驗證傳入的API 的請求時使用Passport 的TokenGuard 來處理

&#39;guards&#39; => [
 &#39;web&#39; => [
  &#39;driver&#39; => &#39;session&#39;,
  &#39;provider&#39; => &#39;users&#39;,
 ],
 &#39;api&#39; => [
  &#39;driver&#39; => &#39;passport&#39;,
  &#39;provider&#39; => &#39;users&#39;,
 ],
],
登入後複製

至此Passport 已經安裝完成,剩下下的文檔裡所講到的前端部分的話,由於我是只需要使用它做Auth 的認證,並不需要實現完整的OAuth 功能,所以我們完全可以不使用前端頁面。

使用

為了Api 回傳資料方便,我封裝了幾個函數

function respond($status, $respond)
{
 return response()->json([&#39;status&#39; => $status, is_string($respond) ? &#39;message&#39; : &#39;data&#39; => $respond]);
}
function succeed($respond = &#39;Request success!&#39;)
{
 return respond(true, $respond);
}
function failed($respond = &#39;Request failed!&#39;)
{
 return respond(false, $respond);
}
登入後複製

respond 函數可以做基本返回,succeed 和failed 是在respond 函數上做的再次封裝,用以返回請求成功和請求失敗資料。

然後我們需要使用一層代理程式。

先說一下使用代理程式的原因,Passport 認證的流程是從屬應用程式帶著主應用程式


產生的Client Token 和使用者輸入的帳號密碼去請求主應用程式的Passport Token 路由,以獲得access token (訪問令牌) 和refresh token (刷新令牌),然後帶著得到的access token 就可以存取auth:api 下的路由了。但是我們並沒有從屬應用,是由前後端分離的前端來請求這個token,如果從前端想來拉取這個access token 就需要把Client token 寫死在前端裡,這樣是很不合理的,所以我們可以在內部寫一個代理,由應用程式自身帶著Client token 去請求自身以獲取access token,這樣說可能有一點繞,大概請求過程是下面這個樣子

1.前端帶著用戶輸入的帳號密碼請求服務端


2.服務端帶著從前端接收到帳號與密碼,並在其中添加Client_id 與Client_token,然後帶著這些參數請求自身的Passport 認證路由,然後返回認證後的Access token 與refresh token


#

下面是代码实现,我在 AppHttpControllersTraits 下新建了一个 ProxyHelpers 的 Trait,当然,这个函数是我根据我的业务逻辑自己封装的,如果不适合你的业务逻辑你可以自行调整。

<?php

namespace App\Http\Controllers\Traits;

use GuzzleHttp\Client;
use App\Exceptions\UnauthorizedException;
use GuzzleHttp\Exception\RequestException;

trait ProxyHelpers
{
 public function authenticate()
 {
  $client = new Client();
  try {
   $url = request()->root() . &#39;/api/oauth/token&#39;;
   $params = array_merge(config(&#39;passport.proxy&#39;), [
    &#39;username&#39; => request(&#39;email&#39;),
    &#39;password&#39; => request(&#39;password&#39;),
   ]);
   $respond = $client->request(&#39;POST&#39;, $url, [&#39;form_params&#39; => $params]);
  } catch (RequestException $exception) {
   throw new UnauthorizedException(&#39;请求失败,服务器错误&#39;);
  }
  if ($respond->getStatusCode() !== 401) {
   return json_decode($respond->getBody()->getContents(), true);
  }
  throw new UnauthorizedException(&#39;账号或密码错误&#39;);
 }
}
登入後複製

config/passport.php 内容如下

<?php
return [
 &#39;proxy&#39; => [
  &#39;grant_type&#39; => env(&#39;OAUTH_GRANT_TYPE&#39;),
  &#39;client_id&#39;  => env(&#39;OAUTH_CLIENT_ID&#39;),
  &#39;client_secret&#39; => env(&#39;OAUTH_CLIENT_SECRET&#39;),
  &#39;scope&#39;   => env(&#39;OAUTH_SCOPE&#39;, &#39;*&#39;),
 ],
];
登入後複製

env 文件内容如下

OAUTH_GRANT_TYPE=password
OAUTH_CLIENT_ID=2
OAUTH_CLIENT_SECRET=2HaTQJF33Sx98HjcKDiSVWZjrhVYGgkHGP8XLG1O
OAUTH_SCOPE=*
登入後複製

我们需要用到的 client token 是 id 为 2 的 client token,不要搞错了哟~

然后我们只需要在控制器中 use 这个 Trait,然后调用 $this->authenticate() 就可以得到认证成功的 token,如果请求失败的话,你可以使用 catch 来捕捉错误抛出异常。

 public function login(Request $request)
{
  $needs = $this->validate($request, rules(&#39;login&#39;));
  $user = User::where(&#39;email&#39;, $needs[&#39;email&#39;])->first();

  if (!$user) {
   throw new UnauthorizedException(&#39;此用户不存在&#39;);
  }
  $tokens = $this->authenticate();
  return succeed([&#39;token&#39; => $tokens, &#39;user&#39; => new UserResource($user)]);
}
登入後複製

得到的 tokens 返回如以下格式

{
 "token_type": "Bearer",
 "expires_in": 31536000,
 "access_token": "token_str",
 "refresh_token": "token_str"
}
登入後複製

做完这一切后你就可以在前端向这样子请求服务端了

axios.post(&#39;yourdomain/login&#39;,login_form).then(resource => { 
})
登入後複製

如果请求成功,那么你将会得到 用户的信息和 access token,refresh token。

然后在你的前端 http 请求 header 里需要加入一个参数 Authorization

axios.defaults.headers.common[&#39;Authorization&#39;] = token.token_type + &#39; &#39; + token.access_token
登入後複製

然后在你需要使用到 auth 认证的路由里使用中间件 auth:api,一切就大功告成啦~

总结

您可能感兴趣的文章:

PHP中你可能忽略的性能优化利器:生成器的相关内容

Laravel框架中composer自动加载的实现详解

PHP服务端环境搭建的图文教程

以上是Laravel5.5中利用Passport實現Auth認證的方法講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在Laravel中如何獲取郵件發送失敗時的退信代碼? 在Laravel中如何獲取郵件發送失敗時的退信代碼? Apr 01, 2025 pm 02:45 PM

Laravel郵件發送失敗時的退信代碼獲取方法在使用Laravel開發應用時,經常會遇到需要發送驗證碼的情況。而在實�...

在 Laravel 中,如何處理郵件發送驗證碼失敗的情況? 在 Laravel 中,如何處理郵件發送驗證碼失敗的情況? Mar 31, 2025 pm 11:48 PM

Laravel郵件發送驗證碼失敗時的處理方法在使用Laravel...

Laravel計劃任務不執行:schedule:run命令後任務未運行怎麼辦? Laravel計劃任務不執行:schedule:run命令後任務未運行怎麼辦? Mar 31, 2025 pm 11:24 PM

Laravel計劃任務運行無響應排查在使用Laravel的計劃任務調度時,不少開發者會遇到這樣的問題:schedule:run...

在dcat admin中如何實現點擊添加數據的自定義表格功能? 在dcat admin中如何實現點擊添加數據的自定義表格功能? Apr 01, 2025 am 07:09 AM

在dcatadmin(laravel-admin)中如何實現自定義點擊添加數據的表格功能在使用dcat...

Laravel Redis連接共享:為何select方法會影響其他連接? Laravel Redis連接共享:為何select方法會影響其他連接? Apr 01, 2025 am 07:45 AM

Laravel框架中Redis連接的共享與select方法的影響在使用Laravel框架和Redis時,開發者可能會遇到一個問題:通過配置...

Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Apr 01, 2025 am 09:09 AM

在Laravel多租戶擴展包stancl/tenancy中自定義租戶數據庫連接使用Laravel多租戶擴展包stancl/tenancy構建多租戶應用時,...

Bangla 部分模型檢索中的 Laravel Eloquent ORM) Bangla 部分模型檢索中的 Laravel Eloquent ORM) Apr 08, 2025 pm 02:06 PM

LaravelEloquent模型檢索:輕鬆獲取數據庫數據EloquentORM提供了簡潔易懂的方式來操作數據庫。本文將詳細介紹各種Eloquent模型檢索技巧,助您高效地從數據庫中獲取數據。 1.獲取所有記錄使用all()方法可以獲取數據庫表中的所有記錄:useApp\Models\Post;$posts=Post::all();這將返回一個集合(Collection)。您可以使用foreach循環或其他集合方法訪問數據:foreach($postsas$post){echo$post->

在Laravel6項目中如何有效檢查Redis連接的有效性? 在Laravel6項目中如何有效檢查Redis連接的有效性? Apr 01, 2025 pm 02:00 PM

在Laravel6項目中如何檢查Redis連接的有效性是一個常見的問題,特別是在項目依賴於Redis進行業務處理時。以下是...

See all articles