Creating an Authorization Plugin(创建一个授权插件)--Moya文档

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(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(
  plugins: [
    AuthPlugin(tokenClosure: { return source.token })
  ]
)

source.token = "eyeAm.AJsoN.weBTOKen"

总结 这小节的核心:

  1. 如何自定义授权插件,及复杂的授权插件

你可能感兴趣的:(Creating an Authorization Plugin(创建一个授权插件)--Moya文档)