項目中使用到了laravel5的passport組件,進行前后端分離的 api認證部分:
前后端分離的api認證,我們用的是:
【密碼授權令牌】,需要用戶登錄->指定client_id/client_secret->生成token+refresh_token->返回前端->在xml的header['Auth'] 添加token。
1、官方文檔:https://learnku.com/docs/laravel/5.5/passport/1309#personal-access-tokens
2、社區推薦文章:https://learnku.com/articles/6976/laravel-55-uses-passport-to-implement-auth-authentication#reply118969 (推薦)
3、錯誤解決文章:https://cloud.tencent.com/developer/ask/199607
4、調試參考文章:https://learnku.com/laravel/t/22586 -- postman一步一步來
4、目的,實現前后端分離api的token認證。
5、其實我個人認為 api認證這塊沒有第三方沒必要用passport,jwt或者自定義token都可以,因為passport主要用於oauth2,也就是三方交互,而單純的前后端分離 只有兩方。
6、按照步驟2來基本不會又問題,下面貼幾個要點:
1)Guzzle\http的client只能訪問網絡上【真實】存在的域名或ip:port,本地創建的虛擬域名、127.0.0.1和localhost訪問是不行滴
2)username不是users表的username字段,默認是users的email字段,當然你可以修改成username字段,詳見下面步驟7
3)已知laravel5.5及以后,users表的password必須是默認的hash::make 加密,不能是bcrypt加密,前台登錄時候僅需提供123456類似密碼即可,passport內部自動進行hash_check對比。
4)將步驟2中的 /api/oauth/token,修改為 /oauth/token
7、修改passport默認的email認證字段,我們改為username或者任意其他phone都可以,如下:App\User.php模型增加
/** * 取消passport默認使用email+password作用驗證條件 * @param : $username --- request()->input('username') * @return : usermodel * date: 2019年11月27日下午3:02:13 * author: xzz */ public function findForPassport($username) { $credentials = []; filter_var($username, FILTER_VALIDATE_EMAIL)?$credentials['email'] = $username:$credentials['username'] = $username; return self::where($credentials)->first(); }
8、demo在laravel5.5的app\http\controllers\PassportController.php里面。
9、效果:
10、驗證token,直接使用系統的auth:api中間件進行認證即可。