Files
Moya/docs_CN/Authentication.md
2019-12-09 14:54:55 +01:00

116 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 身份验证
身份验证变化多样。可以通过一些方法对网络请求进行身份验证。让我们来讨论常见的两种。
## 基本的HTTP身份验证
HTTP身份验证是一个 username/password HTTP协议内置的验证方式. 如果您需要使用 HTTP身份验证, 当初始化provider的时候可以使用一个 `CredentialsPlugin`
。
```swift
let provider = MoyaProvider<YourAPI>(plugins: [CredentialsPlugin { _ -> URLCredential? in
return URLCredential(user: "user", password: "passwd", persistence: .none)
}
])
```
这个特定的例子显示了HTTP的使用,它验证 _每个_ 请求,
通常这是不必要的。下面的方式可能更好:
```swift
let provider = MoyaProvider<YourAPI>(plugins: [CredentialsPlugin { target -> URLCredential? in
switch target {
case .targetThatNeedsAuthentication:
return URLCredential(user: "user", password: "passwd", persistence: .none)
default:
return nil
}
}
])
```
## 访问令牌认证
另一个常见的身份验证方法就是通过使用一个访问令牌。
Moya提供一个 `AccessTokenPlugin` 来完成
[JWT](https://jwt.io/introduction/)的 `Bearer` 认证 和 `Basic` 认证 。
开始使用`AccessTokenPlugin`之前需要两个步骤.
1. 您需要把 `AccessTokenPlugin` 添加到您的`MoyaProvider`中,就像下面这样:
```Swift
let token = "eyeAm.AJsoN.weBTOKen"
let authPlugin = AccessTokenPlugin { _ in token }
let provider = MoyaProvider<YourAPI>(plugins: [authPlugin])
```
`AccessTokenPlugin` 构造器接收一个`tokenClosure`闭包来负责返回一个可以被添加到request头部的令牌 。
2. 您的 `TargetType` 需要遵循`AccessTokenAuthorizable` 协议:
```Swift
extension YourAPI: TargetType, AccessTokenAuthorizable {
case targetThatNeedsBearerAuth
case targetThatNeedsBasicAuth
case targetThatNeedsCustomAuth
case targetDoesNotNeedAuth
var authorizationType: AuthorizationType? {
switch self {
case .targetThatNeedsBearerAuth:
return .bearer
case .targetThatNeedsBasicAuth:
return .basic
case .targetThatNeedsCustomAuth:
return .custom("CustomAuthorizationType")
case .targetDoesNotNeedAuth:
return nil
}
}
```
`AccessTokenAuthorizable` 协议需要您实现一个属性 , `authorizationType`, 是一个枚举值,代表用于请求的头
**Bearer HTTP 认证**
Bearer 请求通过向HTTP头部添加下面的表单来获得授权:
```
Authorization: Bearer <token>
```
**Basic API Key 认证**
Basic 请求通过向HTTP头部添加下面的表单来获得授权
```
Authorization: Basic <token>
```
## OAuth
OAuth 有些麻烦。 它涉及一个多步骤的过程,在不同的api之间通常是不同的。 您 _确实_ 不想自己来做OAuth –
这儿有其他的库为您服务. [Heimdallr.swift](https://github.com/rheinfabrik/Heimdallr.swift),
例如. The trick is just getting Moya and whatever you're using to talk
to one another.
Moya内置了OAuth思想。 使用OAuth的网络请求“签名”本身有时会要求执行网络请求,所以对Moya的请求是一个异步的过程。让我们看看一个例子。
```swift
let requestClosure = { (endpoint: Endpoint, done: MoyaProvider.RequestResultClosure) in
let request = endpoint.urlRequest // This is the request Moya generates
YourAwesomeOAuthProvider.signRequest(request, completion: { signedRequest in
// The OAuth provider can make its own network calls to sign your request.
// However, you *must* call `done()` with the signed so that Moya can
// actually send it!
done(.success(signedRequest))
})
}
let provider = MoyaProvider<YourAPI>(requestClosure: requestClosure)
```
(注意 Swift能推断出您的 `YourAPI` 类型)
## 在您的Provider子类中处理session刷新
您可以查看在每个请求前session刷新的示例[Examples/SubclassingProvider](Examples/SubclassingProvider.md).
它是基于 [Artsy's networking implementation](https://github.com/artsy/eidolon/blob/master/Kiosk/App/Networking/Networking.swift).