Creating an Authorization Plugin(創(chuàng)建一個(gè)授權(quán)插件)
API請(qǐng)求通過JWT或者另外類型的訪問令牌來授權(quán)是相當(dāng)常見的。在這個(gè)例子中我們將創(chuàng)建一個(gè)插件用來把jwt添加到請(qǐng)求中。首先,讓我們來看下這個(gè)例子,如何通過插件把jwt添加到一個(gè)請(qǐng)求中.
struct AuthPlugin: PluginType {
let token: String
func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {
var request = request
request.addValue("Bearer " + token, forHTTPHeaderField: "Authorization")
return request
}
}
let provider = MoyaProvider<Target>(plugins: [AuthPlugin(token: "eyeAm.AJsoN.weBTOKen")])
現(xiàn)在我們來看下更加復(fù)雜的例子,當(dāng)我們創(chuàng)建插件時(shí)我們可能還沒有訪問到j(luò)wt,或者不是所有的請(qǐng)求都需要簽名(ps:即攜帶認(rèn)證). 我們可以通過擴(kuò)展TargetType協(xié)議來提供是否需要授權(quán)的信息并且使用閉包來提供一個(gè)令牌。這樣完成這個(gè)功能。
class TokenSource {
var token: String?
init() { }
}
protocol AuthorizedTargetType: TargetType {
var needsAuth: Bool { get }
}
struct AuthPlugin: PluginType {
let tokenClosure: () -> String?
func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {
guard
let token = tokenClosure(),
let target = target as? AuthorizedTargetType,
target.needsAuth
else {
return request
}
var request = request
request.addValue("Bearer " + token, forHTTPHeaderField: "Authorization")
return request
}
}
let source = TokenSource()
let provider = MoyaProvider<Target>(
plugins: [
AuthPlugin(tokenClosure: { return source.token })
]
)
source.token = "eyeAm.AJsoN.weBTOKen"
總結(jié) 這小節(jié)的核心:
- 如何自定義授權(quán)插件,及復(fù)雜的授權(quán)插件