# 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

## 原生的驗證信
實現介面

然後他幫你註冊好了

他這邊會幫你判斷有沒有實現跟job一樣

剩下就跟文黨做 database之類的
## 兩種用法抓id
Auth::
auth()
這兩種都能直接
auth()->id()
## 保密 敏感地帶再次輸入密碼
叫做configurtion

他是一個middlware

## 密碼增強

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://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://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 資料夾中

除此之外,它也會直接幫我們建置客戶端用來產生 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` 中

**小知識
use 這個是功能 php的 trait**
接著 AuthServiceProvider 中的 boot 方法中調用 Passport::routes 方法。
就是授權註冊那裏

這個方法會註冊必要的路由去核發、換發、撤銷 Token以及請求客戶端的 id、secret 之類的路由,如下圖路由表顯示。
**默認情況下,Passport發放的 Token 是有一年有效期的。**
要改可以去守衛那裏改

## OAuth2 認證機制 Token 原理
https://ithelp.ithome.com.tw/articles/10222358
簡單說要做任何需要認證的請求時。例如(我「想」要新增動物)那麼就要先跟伺服器請求核發一組 Access Token(就是一段亂碼),把這個 Token 附帶在請求中,就可以操作需要驗證的API (我要新增動物-附帶有效的Token)
**有四種不同的授權類型**
* 密碼授權
* 授權碼授權
* 個人授權
* 同步授權
**密碼授權**
如果公司自己有手機app或其他產品,會用到 API 那就可以用密碼授權!這是最簡單的一種,但這種方法比較少見,可能過程中要輸入帳號密碼,相對來說比較有風險。
### 使用 Postman 取的 access_token 方法

## 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`