Creating an Authorization Plugin(創(chuàng)建一個授權(quán)插件)
API請求通過JWT或者另外類型的訪問令牌來授權(quán)是相當(dāng)常見的。在這個例子中我們將創(chuàng)建一個插件用來把jwt添加到請求中试溯。首先喻鳄,讓我們來看下這個例子,如何通過插件把jwt添加到一個請求中.
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)建插件時我們可能還沒有訪問到j(luò)wt状蜗,或者不是所有的請求都需要簽名(ps:即攜帶認(rèn)證). 我們可以通過擴(kuò)展TargetType協(xié)議來提供是否需要授權(quán)的信息并且使用閉包來提供一個令牌需五。這樣完成這個功能。
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)插件