Creating an Authorization Plugin(创建一个授权插件)
API请求通过JWT或者另外类型的访问令牌来授权是相当常见的。在这个例子中我们将创建一个插件用来把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")])
现在我们来看下更加复杂的例子,当我们创建插件时我们可能还没有访问到jwt,或者不是所有的请求都需要签名(ps:即携带认证). 我们可以通过扩展TargetType协议来提供是否需要授权的信息并且使用闭包来提供一个令牌。这样完成这个功能。
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"
总结 这小节的核心:
- 如何自定义授权插件,及复杂的授权插件