laravel 搭建oauth2認證服務,可用于app登錄等驗證

oauth2

oauth2是一種驗證方式, 這里不加以解釋,不明白的小伙伴可以看一看阮一峰的文章-理解oauth2.0

使用的庫

https://github.com/lucadegasperi/oauth2-server-laravel

  • 按github上的教程搭建oauth2認證
    先進行composer安裝然后配置,數據遷移。
  • 選擇一種驗證方式
    oauth2-server-laravel 支持Client Credentials Grant,password等四種驗證方式,可按照教程在config/oauth2.php下配置,例如選擇password granttype,就可按照https://github.com/lucadegasperi/oauth2-server-laravel/blob/master/docs/authorization-server/choosing-grant.md操作。
  • 登錄驗證(這里使用密碼方式)
    現在oauth_clients表中新建一條數據,然后每次登錄驗證時就發送參數client_id和client_secret; 在User.php修改驗證的用戶表
protected $table="ims_mc_members"; 

在routes.php新建以下路由

Route::post('oauth/access_token', function() {
return Response::json(Authorizer::issueAccessToken());
});

表單請求上面的路由,發送表單數據

grant_typ = "password" 
client_id = "your_client_id"
client_secret = "your_client_secret" 
username = "you_email@xxx.com" 
password = "your_password",

注意2點,
1.按照自己寫的restapi格式發送表單,post或者get的話指定action就好,其他如delete,patch,put等就需要對應的在表單中加上一個隱藏的input如:

_method = 'delete'

2.默認用郵箱登錄
以上就搭建完了,等等,如果我登錄不用郵箱怎么辦,如果我用了salt加密怎么辦, 那往下看吧。

自定義驗證規則

有時候可能不是用郵箱登錄,或者驗證方式與上面的不同,比如我的系統使用md5+salt驗證,mobile和email都可登錄,這時候就要修改默認驗證方式了

  1. 修改app下PasswordGrantVerifier.php的verify.php方法
public function verify($username, $password)
{
//harry 修改驗證 anasit
      $credentials = [
        'uniacid' => $_REQUEST['uniacid'],
        'password' => $password,
    ];
    if(strpos($username, '@')){
        $credentials['email'] = $username;
    }else{
        $credentials['mobile'] = $username;
    }

    if (Auth::once($credentials)) {
        return Auth::user()->id;
    }

    return false;
}

因為之前會正則驗證郵箱和手機號,所以就偷了個懶,用是否含有@來區分郵箱和手機號了。

  1. 這樣就修改成mobile和email都可登錄了
    哎,上面的uniacid是什么鬼?
    uniacid是因為在做微信開發,識別不同公眾號,比如權限管理,管理員和用戶都在一個user表中,一個人可以是管理員也可以是用戶,他的賬號密碼可能相同,只是一個的role(角色)是user,一個是admin,這樣你就可以在$credentials,加入一個鍵值對'role'=>'admin'或'role'=>'user'來做驗證。
    但是接下來還要修改驗證方式,
    驗證方法在/vendor/laravel/frameword/src/Illuminate/Auth/EloquentUserProvider.php里面的validateCredentials方法可以自定義自己的驗證邏輯md5,hash或者其他,我的修改為
  public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
$salt =$user->getAuthSalt();
$upwd = md5($plain.$salt.config('app.authkey'));
return $user->getAuthPassword() == $upwd;
}

getAuthPassword是獲取用戶表中的password,但是我還要salt驗證,就需要新建一個getAuthSalt()方法取得用戶表中的salt,需要在\vendor\laravel\framework\src\Illuminate\Auth\Authenticatable.php,\vendor\laravel\framework\src\Illuminate\Auth\GenericUser.php,\vendor\laravel\framework\src\Illuminate\Contracts\Auth\Authenticatable.php,是不是好多文件不好找,其實在vendor文件下搜索一下getAuthPassword就基本知道要修改哪些文件了,
修改好的是這樣的
\vendor\laravel\framework\src\Illuminate\Auth\Authenticatable.php

public function getAuthSalt()
{
return $this->salt;
}

\vendor\laravel\framework\src\Illuminate\Auth\GenericUser.php

public function getAuthSalt()
{
return $this->attributes['salt'];
}

\vendor\laravel\framework\src\Illuminate\Contracts\Auth\Authenticatable.php

public function getAuthPassword();

這樣就萬事大吉了,開心的寫代碼吧。

定義url獲取access_token

在routers.php加入下面代碼

Route::post('oauth/access_token', function() {
    return Response::json(Authorizer::issueAccessToken());
});

給需要登錄才能看到的資源(控制器)加入oauth2中間件

如routers.php加入下面代碼, 訪問購物車時需要access_token

Route::put('wechat/{uniacid}/anas_shop/cart', ['middleware' => 'oauth', 'uses' => 'Anas_shop\CartController@put']);

提交表單時需要加入

<input type="hidden" name="access_token" value="xxxxxxxxxxxx" >

獲取當前access_token的用戶id

使用Authorizer::getResourceOwnerId(); 方法即可獲取,這里寫成model供控制器調用

<?php
namespace App;  //文件路徑

use DB;
use Session;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\Eloquent\Model;
use LucaDegasperi\OAuth2Server\Facades\Authorizer;

class Functions extends Model {
      protected static function memberinfo(){
        $member_id = Authorizer::getResourceOwnerId(); 獲取到的id
        $member = DB::table('ims_mc_members')->where('uid', $member_id)->first();
        return $member;
    }

}

更多oauth2的使用,去看文檔吧

希望這篇文章能幫到你!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容

  • 最近在和同學參與一個創業項目,用到了laravel,仔細研究了一下,發現laravel封裝了很多開箱即用的方法,通...
    MakingChoice閱讀 3,320評論 0 0
  • 2016-08-17 補充 Exception 部分改造方案的內容2016-08-13 補充 View 部分改造方...
    haolisand閱讀 5,303評論 0 16
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 先說幾句廢話,調和氣氛。事情的起由來自客戶需求頻繁變更,偉大的師傅決定橫刀立馬的改革使用新的框架(created ...
    wsdadan閱讀 3,072評論 0 12
  • 簡介 laravel 使實施認證的變得非常簡單,事實上,它提供了非常全面的配置項以適應應用的業務。認證的配置文件存...
    Dearmadman閱讀 6,151評論 2 13