国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解決辦法

anonymoussf / 4092人閱讀

摘要:我們需要在的里面定義一個(gè)客戶端的中間件然后在路由里面或者作用域名稱這樣就可以實(shí)現(xiàn)不登錄直接調(diào)用了參考文檔

利用Laravel 搭建oauth2 API接口 要求

laravel 5.4以上

安裝

$ composer require laravel/passport

在配置文件 config/app.php 的providers 數(shù)組中注冊 Passport 服務(wù)提供者:

LaravelPassportPassportServiceProvider::class,

遷移數(shù)據(jù)庫 執(zhí)行完后會(huì)生成oauth需要的表

$ php artisan migrate

這一步注意,執(zhí)行的時(shí)候可能會(huì)報(bào)錯(cuò)

Syntax error or access violation: 1071 Specified key was too long; max key length is 767 byte

這是由于 Laravel5.4默認(rèn)使用utf8mb4 編碼
utf8 最大長度字符是3字節(jié) utf8mb4是4字節(jié)

解決方法就是

數(shù)據(jù)庫改用utf8mb4

AppServiceProvider.php里面加上Schema::defaultStringLength(191);


另外Mysql 5.5.3之后才支持utf8mb4也需要注意下

接下來執(zhí)行

$ php artisan passport:install

會(huì)生成兩個(gè)客戶端密鑰

Client ID: 1
Client Secret: AwDMcCs65rXkzF80wPaINx5fkoXEfa8lcuuPEvQK
Password grant client created successfully.
Client ID: 2
Client Secret: KLlLijWk3hX2Ntfzo2iFPgwT4GyITpBjEuDozp5H
配置

這里可以配置的只有access token的生命周期默認(rèn)是永久的
在AuthServiceProvider中配置

use CarbonCarbon;
use LaravelPassportPassport;

/**
 * 注冊所有認(rèn)證/授權(quán)服務(wù).
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Passport::routes();
    Passport::tokensExpireIn(Carbon::now()->addDays(15));
    Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
}

修改auth.php
"guards"["driver"] => "passport"

發(fā)放access_token

頒發(fā)

應(yīng)用場景 我的用戶,在別的網(wǎng)站想用我的賬號直接登錄,參考微信登錄。那么第三方網(wǎng)站就要對接過來,用戶選擇第三方登錄,跳轉(zhuǎn)到我的頁面,詢問用戶是否允許,用戶允許以后我會(huì)帶一個(gè)code回去,第三方網(wǎng)站用這個(gè)code請求access_token

流程是

請求令牌

    
    "client_id" => "client-id",
    "redirect_uri" => "http://example.com/callback",
    "response_type" => "code",
    "scope" => "",

用戶允許以后拿到code換token

 $response = $http->post("http://your-app.com/oauth/token", [
        "form_params" => [
            "grant_type" => "authorization_code",
            "client_id" => "client-id",
            "client_secret" => "client-secret",
            "redirect_uri" => "http://example.com/callback",
            "code" => $request->code,
        ],
    ]);

token如果過期了,可以刷新

$response = $http->post("http://your-app.com/oauth/token", [
    "form_params" => [
        "grant_type" => "refresh_token",
        "refresh_token" => "the-refresh-token",
        "client_id" => "client-id",
        "client_secret" => "client-secret",
        "scope" => "",
    ],
]);

賬號密碼

這個(gè)主要是用于APP(我自己的),用戶通過app輸入賬號和密碼,我用賬號密碼校驗(yàn)正確了就發(fā)送access_token

$response = $http->post("http://your-app.com/oauth/token", [
    "form_params" => [
        "grant_type" => "password",
        "client_id" => "client-id",
        "client_secret" => "client-secret",
        "username" => "taylor@laravel.com",
        "password" => "my-password",
        "scope" => "",
    ],
]);

隱式

這種跟第一種差不多,就是省去了code 直接發(fā)放,主要用于

JavaScript 或移動(dòng)應(yīng)用中客戶端登錄認(rèn)證信息不能保存時(shí)

客戶端證書

這種主要用于機(jī)器之間的通信
直接用appid 和 appsecret 換令牌

$response = $guzzle->post("http://your-app.com/oauth/token", [
    "form_params" => [
        "grant_type" => "client_credentials",
        "client_id" => "client-id",
        "client_secret" => "client-secret",
        "scope" => "your-scope",
    ],
]);

私人訪問令牌

這個(gè)用于在程序里面調(diào)用API的時(shí)候
比如

$user = AppUser::find(1);

// 創(chuàng)建一個(gè)不帶域的令牌...
$token = $user->createToken("Token Name")->accessToken;

// 創(chuàng)建一個(gè)帶域的令牌...
$token = $user->createToken("My Token", ["place-orders"])->accessToken;

在調(diào)用api之前需要?jiǎng)?chuàng)建client
創(chuàng)建命令是
$ php artisan passport:client

密碼和私人的不同其他都一樣

$ php artisan passport:client --password
$ php artisan passport:client --personal

創(chuàng)建好后獲得client-id和client-secret

創(chuàng)建路由

5.4以后目錄結(jié)構(gòu)發(fā)生變化,路由統(tǒng)一寫在routes文件夾下。
API的路由都寫在api.php

確定好路由就可以請求接口了

GET 方式
    /api/user
    "headers" => [
        "Accept" => "application/json",
        "Authorization" => "Bearer ".$accessToken,
    ],

寫到這里遇到一個(gè)問題

就是無論怎樣請求 獲取到的token 用來訪問接口的時(shí)候 總是返回
Unauthenticated

GOOGLE了下發(fā)現(xiàn)好多人也遇到這個(gè)問題,據(jù)說是token過期時(shí)間的問題

在AuthServiceProvider boot里面加上

Passport::tokensExpireIn(Carbon::now()->addDays(15));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));

這樣應(yīng)該會(huì)解決,然而并沒有,這里等以后一時(shí)間再研究下(已解決 見下文)

這個(gè)問題有了一定進(jìn)展

目前通過用戶授權(quán)頒發(fā)令牌的方式通過了

前提是用戶必須登錄,之前返回Unauthenticated 應(yīng)該是因?yàn)橛脩粑吹卿?/p>

在應(yīng)用站跳轉(zhuǎn)到授權(quán)站的時(shí)候,此時(shí)用戶需登錄狀態(tài),授權(quán)以后拿到code再來換access_token 這個(gè)方式OK的,可以正常獲取登錄用戶的信息

賬號密碼獲取令牌的方式也一樣可以通過

站點(diǎn)之前通過 id 和 secret的方式換token,然后拿token請求接口這種方式目前還不行

坑爹啊,官方文檔沒寫全

通過 client_credentials 方式獲取token,請求接口的時(shí)候,路由不能用auth或者scope等中間件去驗(yàn)證,因?yàn)樗麄儠?huì)首先驗(yàn)證有沒有登錄。

我們需要在appHttpKernel.php 的 $routeMiddleware 里面定義一個(gè)客戶端API的中間件

"client_credentials" => LaravelPassportHttpMiddlewareCheckClientCredentials::class,

然后在路由里面
Route::middleware("client_credentials")

或者

Route::middleware("client_credentials:作用域名稱")

這樣就可以實(shí)現(xiàn)不登錄直接調(diào)用api了

參考文檔

https://laravel.com/docs/5.4/...

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22544.html

相關(guān)文章

  • 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里的授權(quán)類型介紹

    摘要:模糊授權(quán),跟上面的認(rèn)證碼授權(quán)類似,不同的是,我們的資源服務(wù)器,返回的直接就是準(zhǔn)入令牌,而不是認(rèn)證碼。 本文來自pilishen.com----原文鏈接; 歡迎來和pilishen一起學(xué)習(xí)php&Laravel;學(xué)習(xí)群:109256050 OAuth2是一個(gè)安全框架,控制著程序受保護(hù)部分的準(zhǔn)入,主要是控制不同的客戶端如何來調(diào)取API,保證它們在請求相應(yīng)資源的時(shí)候有相應(yīng)的權(quán)限。 Larav...

    RobinTang 評論0 收藏0
  • 學(xué)習(xí) Lumen 用戶認(rèn)證 (一)

    摘要:在開發(fā)中,用戶認(rèn)證是核心,是數(shù)據(jù)是否有保障的前提,目前主要有兩種常用方式進(jìn)行用戶認(rèn)證和。附是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于的開放標(biāo)準(zhǔn)。 好久沒寫 PHP 代碼了,尤其是 Lumen,我是 Lumen 的忠實(shí)用戶,自從面世開始,我就將 Lumen 作為我 API 的主要框架使用。 但說到 API,不得不說的一個(gè)概念:「前后端分離」,現(xiàn)在越來越多的團(tuán)隊(duì)都采用前后端分離,徹底解...

    wangzy2019 評論0 收藏0
  • 小白的邊學(xué)邊寫,一個(gè)基于laravel的APP接口API】(一)

    摘要:前期準(zhǔn)備原文地址前言,為什么做以及要做個(gè)啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會(huì)兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。框架,是我最喜歡的框架了,沒有之一。 前期準(zhǔn)備 原文地址前言,為什么做以及要做個(gè)啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會(huì)兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。這不,最近又開始折騰APP了,話說現(xiàn)在開...

    Nosee 評論0 收藏0

發(fā)表評論

0條評論

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