# laravel Auth 包含 OAuth(Passport) JWT https://www.youtube.com/watch?v=7Q17ubqLfaM&list=RDCMUCFbNIlppjAuEX4znoulh0Cw&index=14 紀錄上次登陸ip https://laraveldaily.com/save-users-last-login-time-ip-address/ 多重身分驗證 不是角色 角色是policy gate https://www.youtube.com/watch?v=NiQSNjWKLfU 九不支援UI了 所以兩條路徑都學一下 這是Fortify 包 這配合UI的 https://www.youtube.com/watch?v=NuGBzmHlINQ 100秒內有大概了解 https://www.youtube.com/watch?v=UBUNrFtufWo 有一定基礎後推薦看 https://medium.com/learn-or-die/laravel-security-authentication-%E5%AE%98%E6%96%B9%E6%96%87%E4%BB%B6%E5%8E%9F%E5%AD%90%E5%8C%96%E7%BF%BB%E8%AD%AF%E7%AD%86%E8%A8%98-ad6314d2bf05 Oauth世界觀 https://blog.yorkxin.org/posts/oauth2-1-introduction.html 我們使用的token都是使用 Token-Based Authentication https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html https://ernieyang09.github.io/posts/session_n_token/ 詳細(詳細模改 跟 eamil更改) https://hackmd.io/@javck/ByJgF8HRP/%2F%40javck%2FHyXnYxCo8 ## Laravel/ui . Laravel Breeze 以及 Jetstream https://pandalab.org/articles/112 ![](https://i.imgur.com/OnhbegE.png) ## 原生的驗證信 實現介面 ![](https://i.imgur.com/sID63as.png) 然後他幫你註冊好了 ![](https://i.imgur.com/gTHFCkR.png) 他這邊會幫你判斷有沒有實現跟job一樣 ![](https://i.imgur.com/blPEtmI.png) 剩下就跟文黨做 database之類的 ## 兩種用法抓id Auth:: auth() 這兩種都能直接 auth()->id() ## 保密 敏感地帶再次輸入密碼 叫做configurtion ![](https://i.imgur.com/UsFkFDv.png) 他是一個middlware ![](https://i.imgur.com/Pp9jUV4.png) ## 密碼增強 ![](https://i.imgur.com/6jjUJKM.png) https://www.youtube.com/watch?v=-dpp4CJS6Vk ## 新用戶註冊後執行一些操作 前往app/Providers/EventServiceProvider.php並添加更多 Listeners 類,然後在這些類中handle()使用$event->user對象實現方法 ``` class EventServiceProvider extends ServiceProvider { protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, // You can add any Listener class here // With handle() method inside of that class ], ]; ``` ## Auth::once() 您只能使用用戶登錄一個請求,使用方法Auth::once()。 不會使用會話或 cookie,這意味著此方法在構建無狀態 API 時可能會有所幫助 ``` if (Auth::once($credentials)) { // } ``` ## 在用戶密碼更新時更改 API 令牌 訪問變異器 **setPasswordAttribute** 當您從 Eloquent 模型設置(mutator)或獲取(accessor)變量時,它們允許您定義行為 用戶密碼更改時,可以方便地更改用戶的 API Token。 model ``` public function setPasswordAttribute($value) { $this->attributes['password'] = $value; $this->attributes['api_token'] = Str::random(100); } ``` ## session、cookie and token 差異 **令牌存儲在客戶端,而會話使用服務器內存,因此當有大量用戶使用系統時,這可能會成為問題** token的令牌是依照JWT做出來的 https://ithelp.ithome.com.tw/articles/10224935 ### session session目前都使用cookie來傳送session值 **client端訪問server端的流程:** 1. client端發送一個http request到server端 2. server接到request後,建立一個session(可視作為一種狀態列表,每個Session都有屬於它自己的id識別碼),並傳送一個http response回client端,而這個response包括Set-cookie的header,裡面存有sessionID。 3. client端發出第二次request後,若server給了Set-cookie,瀏覽器會自動在request中加入cookie。 4. server接受request,解析並驗證cookie,若驗證成功就回傳response給client端;失敗則回除錯誤碼。 **儲存位置** session是可能將使用者資訊儲存在server端的資料庫、Memory暫存檔中,端看實作方式。 而cookie則將資訊儲存在client端,通常存在瀏覽器,或local storage,也就是使用者自己的電腦 **cookie 的限制** 大多session的實作,會將session id存在會話cookie中,當使用者關閉瀏覽器,session id也會不見;但若cookie是存在硬碟中,則再次開啟瀏覽器時,之前存的資料還是會存在, 相反的,如果資訊大多存放在cookies(例JWT),一來資訊量大的時候client端可能沒有足夠的空間來儲存,二來因為所有資訊都存在client端,一旦你的電腦被挾持,所有資訊都有可能曝光。而且隨著client端的資訊量變大,網路傳輸的數據量也會變大。 **因為 cookie 常常用來存取使用者的資訊,為了怕被拿來濫用,或是佔用太多硬碟空間, 所以對 cookie 做出了以下的限制:** 每個使用者的瀏覽器只能支援(存取)300 個 cookie 每個瀏覽器只能針對同一個伺服器存取 20 個 cookie 每個 cookie 的大小最多僅 4k Bytes 的容量 有些瀏覽器可以把 cookie 的功能關掉,若關掉後 cookie 就不能使用 ### token **token是當使用者登入成功後,server端產生並回傳的一組能象徵該使用者的『權杖』** **儲存位置** 傳統的身份驗證方式,是將token在client端存放於cookie(localStorage, 瀏覽器)中。在server端則存放於資料庫中。 **流程** 1. 使用者登入後,將token回傳給client端 2. client端收到資訊後存在client端 3. 當client端再次訪問server時,將token存放在header中 4. server透過filter驗證token,驗證成功就回傳request資訊;失敗則回傳錯誤碼。 ## auth套件取得會員 Laravel 中, 以下三種取得 authenticated user 的效果一樣嗎? Example: ``` <?php auth()->user() Auth::user() $request->user() ``` ## 關於 auth_id create 上面是原本 下面是改良 因為你從父來有id的 如果不習慣可用request->user()(上面三個寫法那邊) ![](https://i.imgur.com/3hmT494.png) ![](https://i.imgur.com/4u8GR6x.png) ## 登入導向 https://laravel-news.com/laravel-auth-redirection 當您使用Laravel的內置Auth系統時,它將redirectTo在LoginController,RegisterController和ResetPasswordController上提供一個屬性。使用此屬性,您可以定義用戶在完成操作後希望發送到的位置。 在Laravel內部,這是通過RedirectsUsers特徵進行設置和實現的,並且對此進行了細微的改進,現在您可以redirectTo使用該屬性定義一個後備方法。 ``` public function redirectPath() { if (method_exists($this, 'redirectTo')) { return $this->redirectTo(); } return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home'; } ``` 使用這種新方法,您現在可以更輕鬆地執行其他操作或動態設置位置。例如,假設用戶登錄時您想將其重定向到其公共帳戶頁面。現在,您可以在LoginController內執行以下操作: ``` public function redirectTo() { return '/@'.auth()->user()->username; } ``` ## Laravel中涉及认证跳转地址的修改的地方 https://www.kancloud.cn/curder/laravel/408496 ## 登入導向 redirectTo 跟 redirectTo() 差別 https://laravel.tw/docs/5.3/authentication redirectTo 方法比 redirectTo 屬性有更高的優先權 單個修改 loginController裡面找 ``` protected $redirectTo = RouteServiceProvider::HOME; ``` 全部改 自己寫redirectTo () 原因在下面 ## 登入跟 登入的預設 https://www.bigboycancode.com/posts/laravel-authenticated-redirect/ ## 自己的看法 在redirectPath() 功能是 獲取帖子註冊/登錄重定向路徑 所以上面是判斷因該是看他有沒有註冊 下面是登入重新導向路徑 然後官網說方法比屬性權限高 所以才能在下面寫函式複寫 當然如果保險可以槓掉上面那行 第二種想法 老師說的 上面if是判斷有沒有變數 `protected $redirectTo = RouteServiceProvider::HOME;` 有就跑function 沒有的話就用 $this-> redirectTon `protected $redirectTo = RouteServiceProvider::HOME;` ## redirectTo 不要用這個爛東西 ## 7版變成authenticated 如果您需要對用戶通過身份驗證時返回的響應進行更健壯的自定義,Laravelauthenticated(Request $request, $user)在AuthenticatesUserstrait 中提供了一個空方法。LoginController使用laravel/ui包時安裝到應用程序中的類使用此特徵。因此,您可以authenticated在LoginController類中定義自己的方法: ``` /** * The user has been authenticated. * * @param \Illuminate\Http\Request $request * @param mixed $user * @return mixed */ protected function authenticated(Request $request, $user) { return response([ // ]); } ``` ## 禁用 ![](https://i.imgur.com/ywnCVzs.png) https://www.youtube.com/watch?v=38zvoDYiDNo&list=PL4cUxeGkcC9hL6aCFKyagrT1RCfVN4w2Q&index=28 ## JWT https://hackmd.io/@8irD0FCGSQqckvMnLpAmzw/SkqRnxqIM?type=view https://ithelp.ithome.com.tw/articles/10248420 https://stackoverflow.com/questions/45532514/laravel-passport-vs-jwt ## Passport (API認證)(5.3版本以上才有) https://ithelp.ithome.com.tw/articles/10222121 1. 安裝套件 composer require laravel/passport 2. 然後 跑migrate 3. 然後運行命令會創建加密需要公鑰以及私鑰,讓我們可以安全的產生 Access Token。 `php artisan passport:install` 4. Passport 會幫助我們加入相關的資料表,儲存客戶端和Access Token 相關資料表。 客戶端的意思是指,開發者的網站或其他介面要先來我們的API系統,取的一組客戶端的ID 以及 secret,才能在他們自己的網站向我們請求Token,獲取會員的權限。 有點像是白名單的意思,要在這個API系統內有紀錄的才可以對我們申請代表會員的Token。 **第三步** 產生出來的公鑰、私鑰存放在 /storage 資料夾中 ![](https://i.imgur.com/9Nko7bw.png) 除此之外,它也會直接幫我們建置客戶端用來產生 Access Token 的資料,新建了兩種客戶端資料 personal access(個人訪問令牌)和password grant(密碼授予令牌)。 **關於為什麼要兩個加密方法 key跟 secret** https://stackoverflow.com/questions/11557985/why-use-an-api-key-and-secret ### 設定 Passport 引用 `Laravel\Passport\HasApiTokenstrait`到`App\User Model` 中 ![](https://i.imgur.com/OCSOjbL.png) **小知識 use 這個是功能 php的 trait** 接著 AuthServiceProvider 中的 boot 方法中調用 Passport::routes 方法。 就是授權註冊那裏 ![](https://i.imgur.com/hmvs3XJ.png) 這個方法會註冊必要的路由去核發、換發、撤銷 Token以及請求客戶端的 id、secret 之類的路由,如下圖路由表顯示。 **默認情況下,Passport發放的 Token 是有一年有效期的。** 要改可以去守衛那裏改 ![](https://i.imgur.com/PZxzWFb.png) ## OAuth2 認證機制 Token 原理 https://ithelp.ithome.com.tw/articles/10222358 簡單說要做任何需要認證的請求時。例如(我「想」要新增動物)那麼就要先跟伺服器請求核發一組 Access Token(就是一段亂碼),把這個 Token 附帶在請求中,就可以操作需要驗證的API (我要新增動物-附帶有效的Token) **有四種不同的授權類型** * 密碼授權 * 授權碼授權 * 個人授權 * 同步授權 **密碼授權** 如果公司自己有手機app或其他產品,會用到 API 那就可以用密碼授權!這是最簡單的一種,但這種方法比較少見,可能過程中要輸入帳號密碼,相對來說比較有風險。 ### 使用 Postman 取的 access_token 方法 ![](https://i.imgur.com/Z1MjeIq.png) ## Laravel Passport VS JWT https://stackoverflow.com/questions/45532514/laravel-passport-vs-jwt 其實這樣比不對,passport是用 JWT做出來的,再加上Oauth 應該是JWT vs OAuth ## JWT vs Oauth https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/546417/ 必看 https://www.youtube.com/watch?v=7Q17ubqLfaM&list=RDCMUCFbNIlppjAuEX4znoulh0Cw&index=14 JWF就是自己發送請求加上自己加密的方法 資料放在我自己這邊 不是serve端 這樣只要我發送請求,因為加密方法我放在第一次請求裡面 這樣可以多個serve共用 而不是每個serve產生一個session JWT和OAuth2比較? 要比較JWT和OAuth2?首先要明白一點就是,這兩個根本沒有可比性,是兩個完全不同的東西。 JWT 只是一種令牌格式,OAuth 2.0 是一種協議(可以使用 JWT 作為令牌格式)。 JWT是一種認證協議 JWT提供了一種用於釋出接入令牌(Access Token),並對釋出的簽名接入令牌進行驗證的方法。 令牌(Token)本身包含了一系列宣告,應用程式可以根據這些宣告限制使用者對資源的訪問。 OAuth2是一種授權框架 另一方面,OAuth2是一種授權框架,提供了一套詳細的授權機制(指導)。使用者或應用可以通過公開的或私有的設定,授權第三方應用訪問特定資源。 既然JWT和OAuth2沒有可比性,為什麼還要把這兩個放在一起說呢?實際中確實會有很多人拿JWT和OAuth2作比較。標題裡把這兩個放在一起,確實有誤導的意思。很多情況下,在討論OAuth2的實現時,會把JSON Web Token作為一種認證機制使用。這也是為什麼他們會經常一起出現。 ###### tags: `Laravel`