什麼是restful風格的api呢?我們之前有寫過大篇的文章來介紹其概念以及基本操作。
既然寫過了,那今天是要說點什麼嗎?
這篇文章主要針對實際場景中api的部署來寫。
我們今天就來大大的侃侃那些年api遇到的授權驗證問題!獨家工作,如果看完有所受益,記得不要忘記給我點讚哦。
業務分析
我們先來了解整個邏輯
1.用戶在客戶端填寫登入表單
2.用戶提交表單,客戶端請求登入接口login
3.服務端校驗使用者的帳號密碼,並回傳一個有效的token給客戶端
4.客戶端拿到使用者的token,將之儲存在客戶端例如cookie中
5 .客戶端攜帶token存取需要校驗的介面例如取得使用者個人資訊介面
6.服務端校驗token的有效性,校驗通過,反正傳回客戶端所需的資訊,校驗失敗,需要使用者重新登入
本文我們以使用者登錄,取得使用者的個人資訊為例進行詳細的完整版說明。
以上,便是我們這篇文章要實現的重點。先別激動,也別緊張,分析好了之後,細節部分我們再一步一腳印走下去。
準備工作
1.你應該有一個api應用.
2.對於客戶端,我們準備採用postman進行模擬,如果你的google瀏覽器還沒有安裝postman,請先自行下載
3.要測試的用戶表需要有一個api_token的字段,沒有的請先自行添加,並保證該字段足夠長度
4.api應用開啟了路由美化,並先配置post類型的login操作和get類型的signup-test操作
5.關閉了user元件的session會話
關於上面準備工作的第4點和第5點,我們貼一下程式碼方便理解
'components'=> [ 'user'=> [ 'identityClass'=>'common\models\User', 'enableAutoLogin'=> true, 'enableSession'=> false, ], 'urlManager'=> [ 'enablePrettyUrl'=> true, 'showScriptName'=> false, 'enableStrictParsing'=> true, 'rules'=> [ [ 'class'=>'yii\rest\UrlRule', 'controller'=> ['v1/user'], 'extraPatterns'=> [ 'POST login'=>'login', 'GET signup-test'=>'signup-test', ] ], ] ], // ...... ],
signup-test操作我們後面新增測試用戶,為登入操作提供便利。其他類型的操作後面看需要再做添加。
認證類的選擇
我們在api\modules\v1\controllers\UserController中設定的model類指向common\models\User類,為了說明重點這裡我們就不單獨拿出來重寫了,看各位需要,有必要的話再單獨copy一個User類別到api\models下。
校驗使用者權限我們以 yii\filters\auth\QueryParamAuth 為例
useyii\filters\auth\QueryParamAuth; publicfunctionbehaviors() { returnArrayHelper::merge (parent::behaviors(), [ 'authenticator'=> [ 'class'=> QueryParamAuth::className() ] ] ); }
如此一來,那豈不是所有存取user的操作都需要認證了?那不行,客戶端第一個存取login操作的時候哪來的token,yii\filters\auth\QueryParamAuth對外提供一個屬性,用於過濾不需要驗證的action。我們將UserController的behaviors方法稍作修改
publicfunctionbehaviors() { returnArrayHelper::merge (parent::behaviors(), [ 'authenticator'=> [ 'class'=> QueryParamAuth::className(), 'optional'=> [ 'login', 'signup-test' ], ] ] ); }
这样login操作就无需权限验证即可访问了。
添加测试用户
为了避免让客户端登录失败,我们先写一个简单的方法,往user表里面插入两条数据,便于接下来的校验。
UserController增加signupTest操作,注意此方法不属于讲解范围之内,我们仅用于方便测试。
usecommon\models\User; /** * 添加测试用户 */ publicfunctionactionSignupTest () { $user=newUser(); $user->generateAuthKey(); $user->setPassword('123456'); $user->username ='111'; $user->email ='111@111.com'; $user->save(false); return[ 'code'=> 0 ]; }
如上,我们添加了一个username是111,密码是123456的用户
登录操作
假设用户在客户端输入用户名和密码进行登录,服务端login操作其实很简单,大部分的业务逻辑处理都在api\models\loginForm上,来先看看login的实现
useapi\models\LoginForm; /** * 登录 */ publicfunctionactionLogin () { $model=newLoginForm; $model->setAttributes(Yii::$app->request->post()); if($user=$model->login()) { if($userinstanceofIdentityInterface) { return$user->api_token; }else{ return$user->errors; } }else{ return$model->errors; } }
登录成功后这里给客户端返回了用户的token,再来看看登录的具体逻辑的实现
新建api\models\LoginForm.PHP
<?php namespaceapi\models; useYii; useyii\base\Model; usecommon\models\User; /** * Login form */ classLoginFormextendsModel { public$username; public$password; private$_user; constGET_API_TOKEN ='generate_api_token'; publicfunctioninit () { parent::init(); $this->on(self::GET_API_TOKEN, [$this,'onGenerateApiToken']); } /** * @inheritdoc * 对客户端表单数据进行验证的rule */ publicfunctionrules() { return[ [['username','password'],'required'], ['password','validatePassword'], ];
相关推荐:
以上是yii2 resetful 的授權驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

本文比較了PHP和ASP.NET,重點是它們對大規模Web應用程序,性能差異和安全功能的適用性。兩者對於大型項目都是可行的,但是PHP是開源和無關的,而ASP.NET,


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3漢化版
中文版,非常好用

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。