亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Laravel 5.5 使用 Passport 實(shí)現(xiàn) Auth 認(rèn)證

miguel.jiang / 2326人閱讀

摘要:最近在寫一個(gè)前后端分離項(xiàng)目,本來想用開發(fā)的,但是略感笨重,于是想到了的和新出的。更改看守器驅(qū)動(dòng)將配置文件中授權(quán)看守器的的選項(xiàng)改為。然后在你的前端請求里需要加入一個(gè)參數(shù)然后在你需要使用到認(rèn)證的路由里使用中間件,一切就大功告成啦

最近在寫一個(gè)前后端分離項(xiàng)目,本來想用 Jwt-auth + Dingo 開發(fā)的,但是略感笨重,于是想到了 Laravel 的 Passport 和 5.5 新出的 Api Resource。Laravel Passport 是一套已經(jīng)封裝好的 OAuth2 服務(wù)端實(shí)現(xiàn),關(guān)于 OAuth2 我以后我會多帶帶寫一篇文章,所以這里就不細(xì)說了,先來看看怎么安裝它吧。

安裝 安裝 Passport

1.在你的 Shell 中執(zhí)行以下命令

composer require laravel/passport

如果你使用的 Laravel 版本是 5.5 以下,你需要手動(dòng)在 config/app.php 文件 providers 數(shù)組中加入如下代碼

LaravelPassportPassportServiceProvider::class,

2.運(yùn)行遷移文件

在你的 Shell 中執(zhí)行如下命令

php artisan migrate

Passport 服務(wù)提供器使用框架注冊自己的遷移目錄,因此在注冊服務(wù)后,你可以直接運(yùn)行 php artisan migrate 來為 Passport 生成所需的數(shù)據(jù)表

3.生成加密密鑰

在你的 Shell 中執(zhí)行如下命令

php artisan passport:install

此命令會創(chuàng)建生成安全訪問令牌時(shí)所需的加密密鑰,同時(shí),這條命令也會創(chuàng)建用于生成訪問令牌的「個(gè)人訪問」客戶端和「密碼授權(quán)」。

4.添加 Trait

將 LaravelPassportHasApiTokens Trait 添加到 AppUser 模型中


5.注冊路由

在 AuthServiceProvider 的 boot 方法中調(diào)用 Passport::routes 函數(shù)。

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
    }
}

如果你的程序是需要前后端分離形式的OAuth認(rèn)證而不是多平臺認(rèn)證那么你可以在routers()方法中傳遞一個(gè)匿名函數(shù)來自定定義自己需要注冊的路由,我這里是前后端分離的認(rèn)證形式,因此我只需要對我的前端一個(gè)Client提供Auth的認(rèn)證,所以我只注冊了獲取Token的路由,同時(shí)我還為它自定義了前綴名。

Passport::routes(function(RouteRegistrar $router) {
    $router->forAccessTokens();
},["prefix" => "api/oauth"]);

6.更改看守器驅(qū)動(dòng)

將配置文件 config/auth.php 中授權(quán)看守器 guards 的 api 的 driver 選項(xiàng)改為 passport。此調(diào)整會讓你的應(yīng)用程序在在驗(yàn)證傳入的 API 的請求時(shí)使用 Passport 的 TokenGuard 來處理

"guards" => [
    "web" => [
        "driver" => "session",
        "provider" => "users",
    ],

    "api" => [
        "driver" => "passport",
        "provider" => "users",
    ],
],

至此 Passport 已經(jīng)安裝完成,剩下的文檔里所講到的前端部分的話,由于我是只需要使用它做 Auth 的認(rèn)證,并不需要實(shí)現(xiàn)完整的 OAuth 功能,所以我們完全可以不使用前端頁面。

使用

為了 Api 返回?cái)?shù)據(jù)方便,我封裝了幾個(gè)函數(shù)

function respond($status, $respond)
{
    return response()->json(["status" => $status, is_string($respond) ? "message" : "data" => $respond]);
}

function succeed($respond = "Request success!")
{
    return respond(true, $respond);
}

function failed($respond = "Request failed!")
{
    return respond(false, $respond);
}

respond 函數(shù)可以做基本返回,succeed 和 failed 是在 respond 函數(shù)上做的再次封裝,用以返回請求成功和請求失敗數(shù)據(jù)。

然后我們需要使用一層代理。

先說一下使用代理的原因,Passport 認(rèn)證的流程是 從屬應(yīng)用帶著 主應(yīng)用
生成的 Client Token 和 用戶輸入的賬號密碼去請求主應(yīng)用的 Passport Token 路由,以獲得 access token (訪問令牌) 和 refresh token (刷新令牌),然后帶著得到的 access token 就可以訪問 auth:api 下的路由了。但是我們并沒有從屬應(yīng)用,是由前后端分離的前端來請求這個(gè)token,如果從前端想來拉取這個(gè) access token 就需要把 Client token 寫死在前端里,這樣是很不合理的,所以我們可以在內(nèi)部寫一個(gè)代理,由應(yīng)用自身帶著 Client token 去請求自身以獲取 access token,這樣說可能有一點(diǎn)繞,大概請求過程是下面這個(gè)樣子

1.前端帶著用戶輸入的賬號密碼請求服務(wù)端
2.服務(wù)端帶著從前端接收到賬號與密碼,并在其中添加 Client_id 與 Client_token,然后帶著這些參數(shù)請求自身的 Passport 認(rèn)證路由,然后返回認(rèn)證后的 Access token 與 refresh token

下面是代碼實(shí)現(xiàn),我在 AppHttpControllersTraits 下新建了一個(gè) ProxyHelpers 的 Trait,當(dāng)然,這個(gè)函數(shù)是我根據(jù)我的業(yè)務(wù)邏輯自己封裝的,如果不適合你的業(yè)務(wù)邏輯你可以自行調(diào)整。

root() . "/api/oauth/token";

            $params = array_merge(config("passport.proxy"), [
                "username" => request("email"),
                "password" => request("password"),
            ]);

            $respond = $client->request("POST", $url, ["form_params" => $params]);
        } catch (RequestException $exception) {
            throw  new UnauthorizedException("請求失敗,服務(wù)器錯(cuò)誤");
        }

        if ($respond->getStatusCode() !== 401) {
            return json_decode($respond->getBody()->getContents(), true);
        }

        throw new UnauthorizedException("賬號或密碼錯(cuò)誤");
    }
}

config/passport.php 內(nèi)容如下

 [
        "grant_type"    => env("OAUTH_GRANT_TYPE"),
        "client_id"     => env("OAUTH_CLIENT_ID"),
        "client_secret" => env("OAUTH_CLIENT_SECRET"),
        "scope"         => env("OAUTH_SCOPE", "*"),
    ],
];

env 文件內(nèi)容如下

OAUTH_GRANT_TYPE=password
OAUTH_CLIENT_ID=2
OAUTH_CLIENT_SECRET=2HaTQJF33Sx98HjcKDiSVWZjrhVYGgkHGP8XLG1O
OAUTH_SCOPE=*

我們需要用到的 client token 是 id 為 2 的 client token,不要搞錯(cuò)了喲~

然后我們只需要在控制器中 use 這個(gè) Trait,然后調(diào)用 $this->authenticate() 就可以得到認(rèn)證成功的 token,如果請求失敗的話,你可以使用 catch 來捕捉錯(cuò)誤拋出異常。

 public function login(Request $request)
{
        $needs = $this->validate($request, rules("login"));

        $user = User::where("email", $needs["email"])->first();

        if (!$user) {
            throw new UnauthorizedException("此用戶不存在");
        }

        $tokens = $this->authenticate();

        return succeed(["token" => $tokens, "user" => new UserResource($user)]);
}

得到的 tokens 返回如以下格式

{
    "token_type": "Bearer",
    "expires_in": 31536000,
    "access_token": "token_str",
    "refresh_token": "token_str"
}

做完這一切后你就可以在前端向這樣子請求服務(wù)端了

axios.post("yourdomain/login",login_form).then(resource => {
    
})

如果請求成功,那么你將會得到 用戶的信息和 access token,refresh token。

然后在你的前端 http 請求 header 里需要加入一個(gè)參數(shù) Authorization

 axios.defaults.headers.common["Authorization"] = token.token_type + " " + token.access_token

然后在你需要使用到 auth 認(rèn)證的路由里使用中間件 auth:api,一切就大功告成啦~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/26188.html

相關(guān)文章

  • Laravel 5.5 使用 Jwt-Auth 實(shí)現(xiàn) API 用戶認(rèn)證以及無痛刷新訪問令牌

    摘要:默認(rèn)的時(shí)間為周。大概意思就是如果用戶有一個(gè),那么他可以帶著他的過來領(lǐng)取新的,直到周的時(shí)間后,他便無法繼續(xù)刷新了,需要重新登錄。指定在刷新令牌時(shí)要保留的聲明密鑰。為了使令牌無效,您必須啟用黑名單。指定用于對用戶進(jìn)行身份驗(yàn)證的提供程序。 showImg(https://segmentfault.com/img/remote/1460000012606251?w=1920&h=1280); ...

    xavier 評論0 收藏0
  • PHP / Laravel API 開發(fā)推薦閱讀清單

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開發(fā) API 實(shí)戰(zhàn),讓 API 開發(fā)更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項(xiàng)目中使用 - API 文檔撰寫方案 推薦 Laravel API 項(xiàng)目必須使用的 8 個(gè)...

    shmily 評論0 收藏0
  • 使用 laravel Passport 做 API 認(rèn)證

    摘要:使用進(jìn)行測試注冊接口,注冊成功后返回與用戶名登錄接口詳情接口參考了簡書浪來了的認(rèn)證應(yīng)用實(shí)戰(zhàn) 安裝larave laravel new passport_demo cd passport_demo && composer install 將 .env 中數(shù)據(jù)庫配置修改為自己的數(shù)據(jù)庫配置 DB_DATABASE=homestead DB_USERNAME=homestead DB_P...

    whinc 評論0 收藏0
  • laravel5.4 中auth:api中間件通過passport認(rèn)證,通過傳遞參數(shù)authoriz

    摘要:的的認(rèn)證登錄,默認(rèn)是通過傳入頭的方式驗(yàn)證進(jìn)行認(rèn)證,認(rèn)證代碼如下如果不想通過頭傳遞,用傳遞參數(shù)的方式,實(shí)現(xiàn)方式在的里面將參數(shù)的,先接受再賦值到里面即可,也能到達(dá)驗(yàn)證的目的 laravel passport的auth:api的認(rèn)證登錄,默認(rèn)是通過傳入header頭的方式驗(yàn)證accessToken進(jìn)行認(rèn)證,認(rèn)證代碼如下showImg(https://segmentfault.com/img/...

    hosition 評論0 收藏0
  • Laravel Passport API 認(rèn)證使用小結(jié)

    摘要:看到社區(qū)常有人問用于密碼驗(yàn)證方式來獲取的問題,剛好我最近一個(gè)項(xiàng)目使用,也是使用的密碼授權(quán)來做驗(yàn)證,對于如何做登錄登出,以及多賬號系統(tǒng)的認(rèn)證等常用場景做一下簡單的使用小總結(jié)。 看到Laravel-China社區(qū)常有人問Laravel Passport用于密碼驗(yàn)證方式來獲取Token的問題,剛好我最近一個(gè)API項(xiàng)目使用Laravel Dingo Api+Passport,也是使用Oauth...

    Panda 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<