搜尋
首頁後端開發php教程Laravel5.5中利用Passport實現Auth認證的方法講解

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

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

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
您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

您應該多久再生一次會話ID?您應該多久再生一次會話ID?Apr 23, 2025 am 12:03 AM

會話ID應在登錄時、敏感操作前和每30分鐘定期重新生成。 1.登錄時重新生成會話ID可防會話固定攻擊。 2.敏感操作前重新生成提高安全性。 3.定期重新生成降低長期利用風險,但需權衡用戶體驗。

如何在PHP中設置會話cookie參數?如何在PHP中設置會話cookie參數?Apr 22, 2025 pm 05:33 PM

在PHP中設置會話cookie參數可以通過session_set_cookie_params()函數實現。 1)使用該函數設置參數,如過期時間、路徑、域名、安全標誌等;2)調用session_start()使參數生效;3)根據需求動態調整參數,如用戶登錄狀態;4)注意設置secure和httponly標誌以提升安全性。

在PHP中使用會議的主要目的是什麼?在PHP中使用會議的主要目的是什麼?Apr 22, 2025 pm 05:25 PM

在PHP中使用會話的主要目的是維護用戶在不同頁面之間的狀態。 1)會話通過session_start()函數啟動,創建唯一會話ID並存儲在用戶cookie中。 2)會話數據保存在服務器上,允許在不同請求間傳遞數據,如登錄狀態和購物車內容。

您如何在子域中分享會議?您如何在子域中分享會議?Apr 22, 2025 pm 05:21 PM

如何在子域名間共享會話?通過設置通用域名的會話cookie實現。 1.在服務器端設置會話cookie的域為.example.com。 2.選擇合適的會話存儲方式,如內存、數據庫或分佈式緩存。 3.通過cookie傳遞會話ID,服務器根據ID檢索和更新會話數據。

See all articles

熱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

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

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

記事本++7.3.1

記事本++7.3.1

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

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版