php – Laravel – 解決 env() 取出的值為 null

因為 Laravel 會製作快取,所以我們要清空

測試看看

這樣就可以正常顯示了

 

Laravel – API – Oauth2 架設

安裝認證

接著透過 Laravel 生出來的使用者功能,前往 http://domain/register 註冊兩組帳號作為交互運用練習:

  • 一組是開發者帳號,用這個帳號來建立一個應用程式,也就是 client 端,例如這個應用程式是 Mobile APP 會需要連接的 Oauth。
  • 一組帳號是使用者帳號,會使用開發者所建立的 Mobile APP。開發者的 Client 端,會向使用者索取授權與 token。

 

安裝 Passport

下 artisan 指令,建立資料表。

接著下 artisan 指令,預設會建立「個人權限 personal access」與「密碼許可 password grant」

在 App\User 添加 Laravel\Passport\HasApiTokens 特徵,如果你的 model 有需要使用 api token 的輔助方法,都可以加入這項特徵

接著將路由 Passport::routes() 添加到 AuthServiceProvider 的 boot() 方法

最後修改 config/auth.php 的 api driver 為 passport

 

部屬 Passport

建立鑰匙

 

設定

令牌壽命

在 AuthServiceProvider 指定令牌過期時間 tokensExpireIn() 與重取令牌過期時間 refreshTokensExpireIn()

 

發行訪問令牌

管理客戶端

首先,當開發者建立應用程式時,會需要與你的應用程式API交互溝通;而你的應用程式 API ,會需要透過建立一個稱作 “client” 的方式,來註冊開發者的應用程式。

通常,這包括由應用程式提供的「名稱 name」以及使用者批准請求授權後,應用程式所需「返回的 網址 url」。

JSON API

這四種 axios 方法請記得先登入開發者帳號,可以讓開發者對自己開發的 client 做管理。但目前我們僅要用剛剛建立的開發者登入,透過 POST 新增客戶端,記得 GET 之外的方法要加入 CSRF token

若是 jQuery 加入方式。axios 請改成特定方式

 

  • GET /oauth/clients 查詢自己擁有的客戶端
  • POST /oauth/clients 新增客戶端
  • PUT /oauth/clients 修改自己的某個客戶端
  • DELETE /oauth/clients 刪除自己的某個客戶端

 

請求令牌

當開發者建立一個用戶端以後,這個用戶端 Client 要向使用者請求令牌。下方的用戶端會帶領使用者,導向到授權頁面,使用者允許授權給用戶端,那會返回指定的 redirect_uri:http://example.com/callback 以取得授權碼。

另外,我們可以下 artisan 建立 view 來讓我們自行修改版面

 

授權碼轉換為訪問令牌

開發者的客戶端 client 取得了授權碼 code,我們要 POST /oauth/token 來轉換為訪問令牌。client_id 與 client_secret 我們可以從資料表中看到,或是發 GET 到 oauth/clients 找到屬於開發者剛建立的 client。

返回參數包含訪問令牌 access_token, 重取令牌 refresh_token, 令牌過期時間 expires_in。如果要重取令牌可以這樣

 

密碼許可令牌 Password Grant Tokens

若之前已經使用 php artisan passport:client 那就不需要下以下指令

 

請求令牌

另外透過這個方法,可以用 password_client = 1 的系統身分,來取得會員自己的 access token 與 refresh token。與上述 授權碼轉換為訪問令牌 的差異在於參數 grant_type 使用 password,改用會員的密碼拋送,取得的結果是一樣的。

  • client_id 與 client_secret:注意填入的是資料表 oauth_clients 中 password_client = 1 的編號
  • username 與 password:注意填入的是使用者的 email 與 password(未加密的值不是資料表欄位的值)

 

請求所有範圍

在 scope 添加萬用字元「*」。注意,這樣的指定只能在 /oauth/token 方法,且指定 grant_type 為 password 或 client_credentials。

 

隱藏式許可令牌

(待寫)

 

客戶端許可證授權令牌

(待寫)

 

個人權限令牌

(待寫)

保護路由

通過中介層

Passport 只要在路由配合使用 auth:api 就可以包含驗證權限令牌 access token 了

傳遞訪問令牌

這個很常用,當我們透過如 JavaScript 發送請求到 Server 必須要夾帶 Access Token,注意 Authorization 參數值 Bearer 後方要保留一個空白,範例如下

若用 php 的話

而 Laravel 的路由 /api/user 也務必使用上述的中介層 middleware(‘auth:api’)。

 

令牌範圍

定義範圍

在 AuthServiceProvider 的方法 boot() 添加 Passport::tokensCan(),value 的部分請填上給使用者看得好懂語言

 

預設範圍

這種方式會在當我們在 redirect 需要 scope 參數,設定空白的時候的預設值。

 

分配範圍到令牌

參數 scope 值使用上述定義的名稱,要用空白分開,例如

 

檢查範圍

在 app/Http/Kernel.php 的屬性 $routeMiddleware 添加兩個中介層

若要檢查符合權限範圍,中介層的 scope 或 scopes 之間的逗號不可以有空白

或是手動判斷

 

php – Laravel – 操作 Request 的 header 與 body

當使用者發送請求到 Laravel 後,我們可能會在 middleware 中介層要擴增 header 參數或 body 參數,可以這麼用

Header

取得參數

擴增參數

移除參數

 

Body

取得參數

擴增參數

移除參數

 

 

ubuntu 18 – 使用 Docker 建立 php+Laravel+Nginx+MySQL+phpMyAdmin

Ubuntu 18

這篇記錄主要在 ubuntu 底下,使用 Laradock 快速建立 Laravel + Nginx + MySQL 。

安裝基本工具

安裝 Docker

將自己的帳號加到 docker 這個群組,可避免之後運行 “docker-compose” 要打上 “sudo docker-compose…”

若要生效似乎要重啟系統。

建立專案路徑

例如取名 laravel-test

取得 Laradock

將 APP_CODE_PATH_HOST 指定我們的專案路徑,不可使用 ~/projects/laravel-test

啟用需要的服務

進入 Workspace 容器

這時候容器內的 /var/www/ 就會對應到容器外的 ~/projects/laravel-test/,我們安裝 laravel

更新 laravel 的 storage 寫入權限

改資料庫設定

打開瀏覽器輸入 http://localhost 就能看到 Laravel 啟用視窗了。若要修改 Laradock 當前的預設設定是

(選用)建立站台

若要建立多個站台,可複製使用 laradock 已經提供的模板,例如我要建立一個 laravel.test

修改如

讓網址輸入 http://laravel.test 會指向 127.0.0.1

重新啟動 Laradock

注意要使用 stop 和 start。因為 docker-compose down 會卸載容器;docker-compose up 會重新建立容器,設定會一切重投

MySQL

參考,預設使用最後一版,目前是 MySQL 8.0,因為是採用 Docker 映像檔,若進入 mysql 要使用 docker-compose 指令。預設帳密都是 root,這可以在 Laradock 中的 .env 搜尋 “MYSQL_ROOT_PASSWORD” 可以看到。

修改密碼模式。參考,這非常重要,因為 MySQL 8 預設的加密模式 caching_sha2_password 目前在 phpmyadmin 還沒辦法支援,這篇文章有提到。

進入 phpmyadmin ,Server 輸入 mysql,Username 與 Password 輸入:default/secret。當然用 root/root 也可以登入。

phpMyAdmin

參考,我偏好 MySQL 8 所以啟用

打開 http://localhost:8080 就可進入。若要改 port ,可以到 Laradock 的 .env 修改 PMA_PORT=8080

 

參考

Laravel – 將錯誤寫入 Log 的時候,連帶網址與輸入參數的方法

假如我們想把錯誤寫入 log 的話,要觀察網址或傳遞的參數,我們可以添加方法 context() 來取代繼承 vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php。

app\Exceptions\Handler.php

url, input 是我們自訂的,這樣在查看 log 的時候就能看到參數囉。參考