MHIdentityKit
OAuth2 和 OpenID connect iOS 协议驱动的 Swift 客户端库
安装
Carthage
在您的 Cartfile
中添加 github "KoCMoHaBTa/MHIdentityKit"
,然后 直接嵌入 框架到您的项目中。
Cocoapods
将 pod 'MHIdentityKit'
添加到您的 Podfile
子模块
手动
下载,然后直接嵌入到您的项目中。
如何使用
自动
本库中的一个概念是允许开发者通过仅设置他们的需求,以更少的努力与任何OAuth2身份服务器集成。这就是为什么这个库提供了一个名为 OAuth2IdentityManager
的机制,它可以执行这个任务。
为了开始,使用流、可选的刷新器、存储和授权方法创建身份管理器的一个实例。
let flow: AuthorizationGrantFlow = <#T##...#>
let refresher: AccessTokenRefresher? = DefaultAccessTokenRefresher(tokenEndpoint: <#T##URL#>, clientID: <#T##String#>, secret: <#T##String#>)
let storage: IdentityStorage = InMemoryIdentityStorage()
let manager: IdentityManager = OAuth2IdentityManager(flow: <#T##AuthorizationGrantFlow#>, refresher: <#T##AccessTokenRefresher?#>, storage: <#T##IdentityStorage#>, authorizationMethod: .header)
构建、授权和执行您的请求
//build your request
let url = URL(string: <#T##Your protected resource URL#>)!
let request = URLRequest(url: url)
//authorize your request
manager.authorize(request: request) { (request, error) in
guard error == nil else {
//handle the error
return
}
//perform the authorized request
URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
//handle your data
})
}
当您调用 OAuth2IdentityManager
的 authorize
方法时,它会自动处理涉及认证(使用提供的流)、授权、刷新过程,并将所需的任何状态存储到提供的存储中。
手动
即使身份管理器的角色是自动处理大量事务以减少模板代码,也可能会实现自己的符合特定需求的功能,或者为了获得更多的控制而手动完成所有操作。
在这种情况下,您可以手动执行所需的所有步骤。
身份验证 - 获取访问令牌
身份验证过程表示为AuthorizationGrantFlow协议的实现。
根据OAuth2规范,定义了4种流程
- 授权代码授予流程 - 实现为
AuthorizationCodeGrantFlow
- 隐式授权流程 - 实现为
ImplicitGrantFlow
- 资源所有者密码凭据授权流程 - 实现为
ResourceOwnerPasswordCredentialsGrantFlow
- 客户端凭据授权流程 - 实现为
ClientCredentialsGrantFlow
为了获取访问令牌 - 仅创建所需流程的实例,根据代码文档进行操作,并在相应的实例上调用authenticate
。然后,在成功后,您将接收到一个包含访问令牌、刷新令牌和其他元信息的AccessTokenResponse
实例。
处理和管理工作由您来完成。
授权 - 使用访问令牌访问受保护资源
一旦您掌握了访问令牌,就必须使用它来授权一些请求。
请求授权定义为RequestAuthorizer
协议,但由于它与访问令牌的使用无关,现有利用访问令牌的实现是BearerAccessTokenAuthorizer
其使用非常简单
let authorizer = BearerAccessTokenAuthorizer(token: <#T##String#>, method: <#T##BearerAccessTokenAuthorizer.AuthorizationMethod#>)
authorizer.authorize(request: <#T##URLRequest#>) { (request, error) in
guard error == nil else {
//handle the error
return
}
//perform the authorized request
URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
//handle your data
})
}
在成功完成后,提供request
将被指定的方法授权。
刷新访问令牌
刷新访问令牌也是一个简单任务
//create a refresher
let refresher = DefaultAccessTokenRefresher(tokenEndpoint: <#T##URL#>, clientID: <#T##String#>, secret: <#T##String#>)
//create a refresh request
let refreshRequest = AccessTokenRefreshRequest(refreshToken: <#T##String#>, scope: <#T##Scope?#>)
//refresh the access token
refresher.refresh(using: refreshRequest) { (accessTokenResponse, error) in
//handle the authorization process
}
刷新访问令牌的结果与身份验证相同 - 成功后,您将收到一个 AccessTokenResponse
实例,该实例存储了访问令牌、刷新令牌和其他元信息。
处理和管理工作由您自己决定。
附加请求参数
由于许多身份验证服务实际上将在令牌和身份验证请求中放置自定义数据,这超出了官方OAuth2规范的范围 - 您可以通过以下方式之一注入自定义参数:
- 设置您使用的流程中的
additionalAuthorizationRequestParameters
或additionalAccessTokenRequestParameters
。如果您指定了一个由流程最初提供的参数 - 您的自定义参数将覆盖它。 - 继承所需的流程并重写
parameters(from:)
函数,以指定您自己的自定义参数。
文档
代码中包含由Xcode支持的嵌入式文档。要了解更多信息,只需查看即可。
贡献
欢迎所有类型的贡献。
如果您想做出贡献 - 分支仓库,实现您的功能,并提交一个PR以供审查。
如果您发现任何问题或只是有疑问 - 请毫不犹豫地报告和/或询问。
开发中……
-
基础设施
- 自动身份管理
- 默认网络客户端
- 默认内存凭证提供程序
- 内存身份存储
- 密钥链身份存储
- 使用基本HTTP方案授权请求
- 使用Bearer访问令牌授权请求
-
委托
- 可以使用自定义网络客户端
- 可以使用自定义凭证提供程序
- 可以使用自定义存储
- 可以使用自定义请求授权者
- 可以使用自定义流程
- 可以使用自定义授权类型
-
平台专用默认用户代理或示例
- iOS默认UserAgent
- macOS默认UserAgent
- tvOS 默认 UserAgent(如有可能)
- watchOS 默认 UserAgent(如有可能)
-
OpenID Connect
- 服务发现
- 混合流程
- ...
-
iOS 示例
- 授权码授予流
- 隐式授予流
- 资源所有者密码凭证授予
- 客户端凭证授予
-
macOS 示例
- 授权码授予流
- 隐式授予流
- 资源所有者密码凭证授予
- 客户端凭证授予