OAuth2 for iOS
OpenAuth 是一个用 Swift 4 编写的轻量级 iOS 框架,它提供了在 iOS 应用中集成 OAuth 2.0 的一种简单方法。
安装
使用 CocoaPods 安装
我们建议使用 CocoaPods,这可以自动化并简化将 OpenAuth 等第三方库集成到您的项目中的过程。您可以使用以下命令进行安装
$ gem install cocoapods
Podfile
要使用 CocoaPods 将 OpenAuth 集成到 Xcode 项目中,请指定您的 Podfile
pod 'OpenAuth'
然后,运行以下命令
$ pod install
手动安装
如果您已经使用 CocoaPods 将 OpenAuth 链接到项目,请跳过本节。
- 下载位于 OpenAuth/OpenAuth.framework 下的 SDK
- 将
OpenAuth.framework
文件添加到您的项目中,并将其添加到嵌入的二进制
中。
恭喜!框架已完全集成到应用中,您现在可以开始使用了。
支持的授权流程
OpenAuth 使用泛型类型为 GrantType
,OpenAuth 是一个实现了代码授权流程的授权管理器。以下是所有实现流程的列表:
流程 | 类 |
---|---|
代码授权流程 | OpenAuth |
不带令牌类型的代码授权 | OpenAuth |
带基本认证的代码授权流程 | OpenAuth |
隐式授权流程 | OpenAuth |
带查询参数的隐式授权流程 | OpenAuth |
客户端凭据 | OpenAuth |
在此阶段,一旦您选择了应用要实现的授权流程,所有对 OpenAuth 的请求都应当使用授权类型流程来指定。您可以在 OpenAuth 上声明一个别名(usualy called typealias),指定您想使用的授权流程。在此文档的其余部分,我们将使用代码授权流程。
typealias Auth = OpenAuth<CodeGrant>
启用日志记录器
您可以选择启用日志记录器。使用以下代码设置日志记录器的日志级别:
Auth.logger.level = .verbose
您可以选择以下日志级别之一:
- verbose
- info
- warning
- error
- none
添加您的 OAuth2 配置
Info.plist 文件
OpenAuth 会从您的应用的 Info.plist
文件中自动加载 OAuth2 配置。在 Info.plist 中添加新行。将其命名为 OpenAuthConfiguration
并将其类型设置为 Dictionary
。以下是您可以放入创建的字典中的所有配置的描述:
键 | 类型 | 必需 | 描述 |
---|---|---|---|
CLIENT_ID |
String | 是 | 客户端 ID |
CLIENT_SECRET |
String | 否 | 客户端密钥,通常只在代码授权时需要。 |
CLIENT_NAME |
String | 否 | 客户端名称,用于动态客户端注册。 |
LOGO_URI |
String | 否 | 应用标志/图标的 URL。 |
授权URI |
String | 是 | 用于授权的URL。 |
令牌URI |
String | 是 | 用于将代码交换为令牌的URL。 |
注册URI |
String | 否 | 用于注册客户端的URL。在动态客户端注册时使用。 |
重定向URI列表 |
字符串数组 | 是 | 重定向URI列表。 |
作用域 |
String | 否 | 目前使用的作用域。 |
正文中的秘密 |
布尔值 | 否 | 是否接收者应使用请求体而不是授权头中的客户端秘密;默认为false 。 |
头部 |
字典 | 否 | 包含特殊的授权请求头部,可用于覆盖默认值 |
参数 |
字典 | 否 | 将自定义参数添加到授权请求中。 |
令牌假定未过期 |
布尔值 | 否 | 如果设置为true(默认值),即使没有提供“expires_in”参数,也会使用钥匙串提供的访问令牌。 |
启用钥匙串 |
布尔值 | 否 | 如果设置为false(默认值),将禁用钥匙串支持。 |
令牌钥匙串账户 |
String | 否 | 用于存储令牌的钥匙串账户。默认为currentTokens 。 |
客户端钥匙串账户 |
String | 否 | 用于存储客户端凭证的钥匙串账户名称。默认为clientCredentials 。 |
钥匙串访问模式 |
String | 否 | 定义了钥匙串访问模式。默认为kSecAttrAccessibleWhenUnlocked |
钥匙串访问组 |
String | 否 | 定义了钥匙串访问组标识符,允许组内不同应用程序之间的令牌交换。默认未定义。 |
提示
对于钥匙串访问模式
,可能的值包括
- kSecAttrAccessibleWhenUnlocked:项目数据只能在使用设备解锁时访问。建议用于仅需要在前台应用程序中可访问的项目。具有此属性的项目将在使用加密备份时迁移到新设备。
- kSecAttrAccessibleAfterFirstUnlock:项目数据只在实际启动后首次解锁设备时才能访问。建议用于需要在后台应用程序中可访问的项目。具有此属性的项目将在使用加密备份时迁移到新设备。
- kSecAttrAccessibleAlways:无论设备的锁定状态如何,都可以始终访问项目数据。不建议用于除系统使用之外的内容。具有此属性的项目将在使用加密备份时迁移到新设备。
- kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly:仅在使用设备解锁时才能访问项目数据。建议用于仅需要在前台应用程序中可以访问并需要在设备上设置密码的项目。具有此属性的项目在使用加密备份时将永远迁移到新设备,因此在新设备上恢复备份后,这些项目可能丢失。此属性在无密码的设备上不可用。禁用设备密码将删除所有以前受保护的项目。
- kSecAttrAccessibleWhenUnlockedThisDeviceOnly:仅在使用设备解锁时才能访问项目数据。建议用于仅需要在前台应用程序中需要访问的项目。具有此属性的项目将永远不会迁移到新设备,因此在新设备上恢复备份后,这些项目可能丢失。
- kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly:只有在重启后设备解锁后才能访问项目数据。此选项建议用于需要后台应用程序访问的项目。具有此属性的项将永远不会迁移到新设备,因此在使用备份恢复到新设备后,这些项目将丢失。
- kSecAttrAccessibleAlwaysThisDeviceOnly:无论设备的锁定状态如何,都可以始终访问项目数据。此选项不推荐用于任何非系统用途。具有此属性的项将永远不会迁移到新设备,因此在使用备份恢复到新设备后,这些项目将丢失。
最小可行配置
您可以从这里下载包含最小必需配置的plist文件,或者复制XML到项目的Info.plist资源中。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>OpenAuthConfiguration</key>
<dict>
<key>CLIENT_ID</key>
<string></string>
<key>AUTHORIZE_URI</key>
<string></string>
<key>TOKEN_URI</key>
<string></string>
<key>REDIRECT_URIS</key>
<array>
<string></string>
</array>
</dict>
</dict>
</plist>
完整配置
您可以从这里下载包含高级配置所有键的plist文件,或将其XML复制到项目的Info.plist资源中。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>OpenAuthConfiguration</key>
<dict>
<key>CLIENT_ID</key>
<string></string>
<key>AUTHORIZE_URI</key>
<string></string>
<key>TOKEN_URI</key>
<string></string>
<key>REDIRECT_URIS</key>
<array>
<string></string>
</array>
<key>CLIENT_SECRET</key>
<string></string>
<key>CLIENT_NAME</key>
<string></string>
<key>LOGO_URI</key>
<string></string>
<key>REGISTRATION_URI</key>
<string></string>
<key>SCOPE</key>
<string></string>
<key>SECRET_IN_BODY</key>
<false/>
<key>HEADERS</key>
<dict/>
<key>PARAMETERS</key>
<dict/>
<key>TOKEN_ASSUME_UNEXPIRED</key>
<true/>
<key>ENABLE_KEYCHAIN</key>
<false/>
<key>TOKENS_KEYCHAIN_ACCOUNT</key>
<string></string>
<key>CLIENT_KEYCHAIN_ACCOUNT</key>
<string></string>
<key>KEYCHAIN_ACCESS_MODE</key>
<string>kSecAttrAccessibleWhenUnlocked</string>
<key>KEYCHAIN_ACCESS_GROUP</key>
<string></string>
</dict>
</dict>
</plist>
处理重定向URL
在您的AppDelegate.swift文件中,导入OpenAuth并实现以下方法
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
Auth.shared.handleRedirect(url: url)
return true
}
获取令牌
要获取访问令牌,在您的代码中导入OpenAuth并调用以下函数
Auth.acquireToken(success: { (token: String) in
//Use your token here
}) { (error: Error) in
//Handle error here
}
要强制OpenAuth显示嵌入在您的应用中的Safari视图控制器,将嵌入布尔属性设置为true,并提供一个OpenAuth使用该内容显示Safari控制器的上下文。该上下文可以是当前的视图控制器、导航视图控制器或其他基于视图控制器的对象
Auth.acquireToken(authorizeContext: context, embedded: true, success: { (token: String) in
//Use your token here
}) { (error: Error) in
//Handle error here
}
可选地,您可以将自定义参数传递到要添加到授权请求的参数中
let params = ["key1": "value1",
"key2": "value2"]
Auth.acquireToken(success: { (token: String) in
//use your token here
}, failure: { (error: Error) in
//handle error here
}, params: params,
embedded: false,
authorizeContext: nil)
登出
要登出,请按照以下代码片段中所示使用登出功能。OpenAuth将忘记所有令牌并删除与其流相关的任何存储cookie。
Auth.logout()
致谢
所有致谢均归Pascal Pfiffner所有。SDK的大部分灵感来自p2.OAuth2 swift库。
许可证
OpenAuth在Apache 2.0许可证下发布。有关更多详细信息,请参见LICENSE。