Vapor 2.0 - 認證入門(Getting Started)

前往 Vapor 2.0 - 文檔目錄

Vapor的Auth Provider軟件使得實現(xiàn)認證和授權(quán)變得簡單而安全。它支持常見的驗證模式牢贸,如:

  • Token (bearer) authentication 令牌(承載)認證
  • Username + password (basic) authentication 用戶名+密碼(基本)認證
  • Permission-based authorization 基于權(quán)限的授權(quán)
  • Session-based persistance 基于會話的持久性
    Auth的模塊化,基于協(xié)議的性質(zhì)也使其成為定制認證需求的良好基礎(chǔ)审胸。

提示
使用vapor new <name> --template=vapor/auth-template
創(chuàng)建一個新的帶示例代碼的AuthProvider項目模板梭纹。

包(Package)

要使用Auth捺僻,您需要將Auth Provider添加到您的項目中恋技。這就像在` Package.swift文件中添加以下行一樣簡單拇舀。

.Package(url: "https://github.com/vapor/auth-provider.git", ...)

查看使用認證(Package) 部分了解更多信息。

示例(Example)

我們來看看我們?nèi)绾问褂肰apor和Auth實現(xiàn)一個簡單的蜻底,基于令牌(token-based)的驗證系統(tǒng)骄崩。

用戶(User)

我們將首先創(chuàng)建一個模型來表示我們的用戶。如果你已經(jīng)有一個用戶類薄辅,你可以跳過這個步驟要拂。

import Vapor
import FluentProvider

final class ExampleUser: Model {
    let name: String

    ...
}

extension ExampleUser: Preparation { ... }

這里我們創(chuàng)建一個非常簡單的用戶,只有一個屬性:一個名稱(name)长搀。

瞧一瞧
我們省略大部分ModelPreparation協(xié)議要求宇弛。有關(guān)這些協(xié)議的更多信息石窑,請查看Fluent入門指南(Getting Started) 杠园。

令牌(Token)

接下來馏臭,我們創(chuàng)建一個模型來表示我們的身份驗證令牌。這些將存儲在單獨的數(shù)據(jù)庫表或集合中谁尸,稱為“令牌(tokens)”。

當(dāng)用戶登錄時纽甘,我們將為它們創(chuàng)建一個新的令牌良蛮。然后,他們將在后續(xù)請求中使用此令牌悍赢,而不是其用戶名和密碼决瞳。

現(xiàn)在货徙,這就是我們的簡單的令牌模型。

import Vapor
import FluentProvider

final class ExampleToken: Model {
    let token: String
    let userId: Identifier

    var user: Parent<ExampleToken, ExampleUser> {
        return parent(id: userId)
    }

    ...
}

extension ExampleToken: Preparation { ... }

該令牌有兩個屬性:

  • 令牌(token):我們將在請求中發(fā)送的唯一的隨機字符串
  • userId:此令牌所屬的用戶的標識符

瞧一瞧
我們在這里使用Fluent relations皮胡。查看關(guān)系(Relations) 部分了解更多信息痴颊。

令牌認證(Token Authenticatable)

現(xiàn)在我們有我們的示例用戶和令牌,我們可以讓我們的用戶使用令牌進行認證屡贺。

這可能聽起來很復(fù)雜蠢棱,但實際上很簡單:

import AuthProvider

extension ExampleUser: TokenAuthenticatable {
    // the token model that should be queried
    // to authenticate this user
    public typealias TokenType = ExampleToken
}

現(xiàn)在我們的示例用戶是TokenAuthenticatable,我們可以繼續(xù)下一步甩栈!

用戶助手(User Helper)

讓我們添加一個簡單的便利方法來請求訪問經(jīng)過身份驗證的用戶泻仙。

extension Request {
    func user() throws -> ExampleUser {
        return try auth.assertAuthenticated()
    }
}

這是一個很好的捷徑,將在幾個步驟中派上用場量没。

中間件(Middleware)

要求認證玉转,我們需要添加 TokenAuthenticationMiddleware。您可以將此中間件應(yīng)用于單個路由或整個Droplet殴蹄。為了簡單起見冤吨,我們將其應(yīng)用于Droplet。

import Vapor
import AuthProvider
import FluentProvider

let config = try Config()

config.preparations.append(ExampleUser.self)
config.preparations.append(ExampleToken.self)

let drop = try Droplet(config)


let tokenMiddleware = TokenAuthenticationMiddleware(ExampleUser.self)

/// use this route group for protected routes將此路由組用于受保護的路由
let authed = drop.grouped(tokenMiddleware)

由于我們的ExampleUser類是TokenAuthenticatable饶套,我們可以將其傳遞給中間件的init方法漩蟆。

** 瞧一瞧**
如果您只想要對某些路由進行身份驗證,請查看
路由文檔中的Route Group部分妓蛮。

路由(Route)

現(xiàn)在我們有一個由我們的TokenMiddleware保護的路由組怠李,我們添加一個路由來返回經(jīng)過身份驗證的用戶名。

authed.get("me") { req in
    // return the authenticated user's name
    return try req.user().name
}

提示
我們正在使用.user()我們在Request這里添加的方便蛤克。這是一個捷徑let user = try req.auth.assertAuthenticated(ExampleUser.self)

數(shù)據(jù)庫(Database)

就是這樣!我們現(xiàn)在有一個功能認證系統(tǒng)捺癞。讓我們幾個條目添加到數(shù)據(jù)庫,并對其進行測試。

用戶(Users)
id name
1 Bob
令牌(Tokens)
id token user_id
1 foo 1

請求(Request)

現(xiàn)在我們可以向我們的Vapor應(yīng)用程序發(fā)出請求构挤。

GET /me HTTP/1.1
Authorization: Bearer foo

我們應(yīng)該得到一個回應(yīng)髓介。

HTTP/1.1 200 OK
Content-Type: text/plain

Bob
壞令牌(Bad Token)

為了確保它的安全性,讓我們使用不在我們的數(shù)據(jù)庫中的令牌進行測試筋现。

GET /me HTTP/1.1
Authorization: Bearer not-a-token

我們應(yīng)該得到一個回應(yīng)唐础。

HTTP/1.1 403 Forbidden

下一步(Next Steps)

要將其構(gòu)建到生產(chǎn)就緒認證系統(tǒng)中,您將需要構(gòu)建一些額外的路由來創(chuàng)建用戶和創(chuàng)建令牌矾飞。

繼續(xù)閱讀Auth部分一膨,了解有關(guān)不同類型身份驗證的更多信息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洒沦,一起剝皮案震驚了整個濱河市豹绪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌申眼,老刑警劉巖瞒津,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝉衣,死亡現(xiàn)場離奇詭異,居然都是意外死亡巷蚪,警方通過查閱死者的電腦和手機买乃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钓辆,“玉大人剪验,你說我怎么就攤上這事∏傲” “怎么了功戚?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長似嗤。 經(jīng)常有香客問我啸臀,道長,這世上最難降的妖魔是什么烁落? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任乘粒,我火速辦了婚禮,結(jié)果婚禮上伤塌,老公的妹妹穿的比我還像新娘灯萍。我一直安慰自己,他們只是感情好每聪,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布旦棉。 她就那樣靜靜地躺著,像睡著了一般药薯。 火紅的嫁衣襯著肌膚如雪绑洛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天童本,我揣著相機與錄音真屯,去河邊找鬼。 笑死穷娱,一個胖子當(dāng)著我的面吹牛绑蔫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鄙煤,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼晾匠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梯刚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤薪寓,失蹤者是張志新(化名)和其女友劉穎亡资,沒想到半個月后澜共,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡锥腻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年嗦董,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘦黑。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡京革,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幸斥,到底是詐尸還是另有隱情匹摇,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布甲葬,位于F島的核電站廊勃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏经窖。R本人自食惡果不足惜坡垫,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望画侣。 院中可真熱鬧冰悠,春花似錦、人聲如沸配乱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宪卿。三九已至的诵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佑钾,已是汗流浹背西疤。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留休溶,地道東北人代赁。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像兽掰,于是被迫代替她去往敵國和親芭碍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容