訪問需要HTTP認(rèn)證的API

很多時候啤贩,我們需要對訪問的URL進(jìn)行安全驗(yàn)證奴艾。我們通過這段向大家介紹如何通過Alamofire訪問需要HTTP簡單認(rèn)證的URL。


服務(wù)端的準(zhǔn)備

首先我們要在服務(wù)端添加一個需要安全驗(yàn)證的HTTP API辣恋,基于我們上一個的例子陈轿,打開routes.php贮配,添加下面的代碼:


Route::group(['middleware' => ['api']], function () {
    Route::get('/alamofire', 'AlamofireController@index');

    Route::post('/alamofire', [
            'middleware' => 'auth.basic.once', 
            'uses' => 'AlamofireController@store']);
});

這里掘托,我們定義了一個auth.basic.once middleware茅诱,用于完成一個無狀態(tài)的HTTP簡單認(rèn)證金句。我們來實(shí)現(xiàn)它檩赢。

在Terminal里,進(jìn)入apidemo的項(xiàng)目目錄违寞,執(zhí)行下面的命令創(chuàng)建一個middleware:


php artisan make:middleware AuthenticateOnceWithBasicAuth

然后贞瞒,Laravel會在app/Http/Middleware目錄為我們創(chuàng)建一個AuthenticateOnceWithBasicAuth.php偶房,里面會包含一個同名的class。在它的Handle方法里军浆,我們添加下面的代碼:


/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    return Auth::onceBasic() ?: $next($request);
}

在這里Auth::onceBasic()為我們執(zhí)行一次無狀態(tài)的HTTP簡單認(rèn)證(它不會在session里寫上)棕洋,如果它沒有返回值,則代表認(rèn)證成功乒融,我們可以把請求轉(zhuǎn)發(fā)到后續(xù)的處理邏輯掰盘。否則,我們就返回Auth::onceBasic()提供的錯誤信息赞季。

完成之后愧捕,我們打開app/Http/Kernel.php,注冊我們之間添加的中間件:


/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    // omit for simplicity

    'auth.basic.once' => \App\Http\Middleware\AuthenticateOnceWithBasicAuth::class
];

這樣當(dāng)我們發(fā)起POST請求到/alamofire的時候申钩,服務(wù)器就會要求認(rèn)證晃财。為了測試,我們添加一個用戶帳號典蜕。

首先,在config/database.php里罗洗,我們把默認(rèn)的數(shù)據(jù)庫修改成sqlite(當(dāng)然愉舔,在.env里添加環(huán)境變量也可以):


'default' => env('DB_CONNECTION', 'sqlite'),

然后,在terminal里執(zhí)行:


php artisan migrate

這樣伙菜,Laravel就會在sqlite里創(chuàng)建users表轩缤,然后,執(zhí)行下面的命令:


php artisan tinker

這樣贩绕,我們就進(jìn)入了tinker的控制臺火的,在這里執(zhí)行下面的代碼:


App\User::create([
    'email' => '11@boxue.io', 
    'password' => bcrypt('boxue'), 
    'name' => '11']);

image

這樣,我們就向數(shù)據(jù)庫中添加了一條User記錄淑倾。

最后,我們修改一下AlamofireController中處理POST /alamofire的代碼:


/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
    //
    $data = $request->all();

    return response()->json([
        'status' => 'successful',
        'data' => $data], 201);
}

接下來娇哆,我們使用POSTMAN驗(yàn)證一下湃累。


使用Postman

POSTMAN是一個Chrome app,可以很方便的幫我們測試各種HTTP API碍讨。我們可以在Chrome extension中找到它治力。它有兩個版本,一個是Chrome插件版勃黍,這個版本在Canary上有些問題宵统;還有一個是Chrome app,這里推薦大家使用app版覆获。

image

打開POSTMAN马澈,按照下圖中填寫我們的HTTP API信息:

image

當(dāng)我們選擇HTTP basic auth的時候瓢省,POSTMAN會自動為我們生成響應(yīng)HTTP header:

image

然后,我們隨便填寫一個POST BODY:

image

設(shè)置完成后箭券,點(diǎn)擊"Send"按鈕净捅,我們就可以看到返回的Status是201,內(nèi)容是我們返回的JSON辩块。

image

如果我們把密碼改成一個錯誤的值(例如下圖:)蛔六,然后重新發(fā)送請求,就可以看到服務(wù)器返回的401 - invalid credentials錯誤了废亭。

image

在服務(wù)端搞定認(rèn)證之后国章,接下來,我們來看如何用Alamofire替代POSTMAN發(fā)送請求豆村。


使用Alamofire完成請求

在搞定了前面的各種配置和代碼之后液兽,用Alamofire發(fā)送請求倒是顯得格外簡單。我們有兩種不同的方法可以通過Alamofire訪問需要HTTP簡單認(rèn)證的API掌动。

調(diào)用authenticate方法

這是最簡單的方法四啰,Alamofire有一個authenticate方法,我們直接拿來用就可以了:

回到Xcode粗恢,在ViewDidLoad方法里柑晒,添加下面的代碼:


let user = "11@boxue.io"
let pw = "boxue"

Alamofire.request(.POST, "https://apidemo.boxue.io/alamofire")
    .authenticate(user: user, password: pw)
    .responseJSON(completionHandler: { response in
        debugPrint(response)
    })

按Command + R,就可以在控制臺眷射,看到了對應(yīng)的結(jié)果了:

image

除了給authenticate傳遞用戶名和密碼外匙赞,我們還可以傳給它傳遞一個NSURLCredential對象:


let user = "11@boxue.io"
let pw = "boxue"
let credential = NSURLCredential(user: user, 
                             password: pw, 
                          persistence: .ForSession)

Alamofire.request(.POST, "https://apidemo.boxue.io/alamofire")
    .authenticate(usingCredential: credential)
    .responseJSON(completionHandler: { response in
        debugPrint(response)
    })

按Command + R,重新編譯執(zhí)行妖碉,我們就可以在控制臺里看到涌庭,結(jié)果是一樣的。


自行構(gòu)造HTTP header

除了使用authenticate方法之外欧宜,我們也可以手工構(gòu)造一個和POSTMAN一樣的HTTP header坐榆,用于HTTP basic authentication:


let credentialData = 
    "\(user):\(pw)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = 
    credentialData.base64EncodedStringWithOptions([])

let headers = ["Authorization": "Basic \(base64Credentials)"]

然后,我們把這個header添加到POST請求就可以了:


Alamofire.request(.POST, 
    "https://apidemo.boxue.io/alamofire", 
    headers: headers)
    .responseJSON(completionHandler: { response in
        debugPrint(response)
    })

按Command + R冗茸,重新編譯執(zhí)行猛拴,我們就可以在控制臺里看到,結(jié)果是一樣的蚀狰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愉昆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子麻蹋,更是在濱河造成了極大的恐慌跛溉,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芳室,居然都是意外死亡专肪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門堪侯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚎尤,“玉大人,你說我怎么就攤上這事伍宦⊙克溃” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵次洼,是天一觀的道長关贵。 經(jīng)常有香客問我,道長卖毁,這世上最難降的妖魔是什么揖曾? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮亥啦,結(jié)果婚禮上炭剪,老公的妹妹穿的比我還像新娘。我一直安慰自己翔脱,他們只是感情好念祭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碍侦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隶糕。 梳的紋絲不亂的頭發(fā)上瓷产,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音枚驻,去河邊找鬼濒旦。 笑死,一個胖子當(dāng)著我的面吹牛再登,可吹牛的內(nèi)容都是我干的尔邓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼锉矢,長吁一口氣:“原來是場噩夢啊……” “哼梯嗽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沽损,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤灯节,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炎疆,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卡骂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了形入。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片全跨。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亿遂,靈堂內(nèi)的尸體忽然破棺而出浓若,到底是詐尸還是另有隱情,我是刑警寧澤崩掘,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布七嫌,位于F島的核電站,受9級特大地震影響苞慢,放射性物質(zhì)發(fā)生泄漏诵原。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一挽放、第九天 我趴在偏房一處隱蔽的房頂上張望绍赛。 院中可真熱鬧,春花似錦辑畦、人聲如沸吗蚌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚯妇。三九已至,卻和暖如春暂筝,著一層夾襖步出監(jiān)牢的瞬間箩言,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工焕襟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陨收,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓鸵赖,卻偏偏與公主長得像务漩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子它褪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348