- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在尝试在我的 iOS (Swift) 应用程序中实现新的 AWS Cognito 用户池,但我正在努力使登录过程正常工作。我基本上是在尝试遵循可用的示例 here .
这是我到目前为止:
应用委托(delegate):
class AppDelegate: UIResponder, UIApplicationDelegate, AWSCognitoIdentityInteractiveAuthenticationDelegate {
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: nil)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = serviceConfiguration
let configurationUserPool = AWSCognitoIdentityUserPoolConfiguration(
clientId: "###",
clientSecret: "#########",
poolId: "###")
AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithConfiguration(serviceConfiguration, userPoolConfiguration: configurationUserPool, forKey: "UserPool")
self.userPool = AWSCognitoIdentityUserPool(forKey: "UserPool")
self.userPool!.delegate = self
return true
}
func startPasswordAuthentication() -> AWSCognitoIdentityPasswordAuthentication {
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let logInNavigationController = mainStoryboard.instantiateViewControllerWithIdentifier("LogInNavigationController") as! UINavigationController
dispatch_async(dispatch_get_main_queue(), {
self.window?.rootViewController = logInNavigationController
})
let logInViewController = mainStoryboard.instantiateViewControllerWithIdentifier("LogInViewController") as! LogInViewController
return logInViewController
}
}
class LogInViewController: UIViewController, AWSCognitoIdentityPasswordAuthentication {
var usernameText : String?
var passwordAuthenticationCompletion = AWSTaskCompletionSource()
func getPasswordAuthenticationDetails(authenticationInput: AWSCognitoIdentityPasswordAuthenticationInput, passwordAuthenticationCompletionSource: AWSTaskCompletionSource) {
self.passwordAuthenticationCompletion = passwordAuthenticationCompletionSource
dispatch_async(dispatch_get_main_queue(), {
if self.usernameText == nil {
self.usernameText = authenticationInput.lastKnownUsername
}
})
}
func didCompletePasswordAuthenticationStepWithError(error: NSError) {
dispatch_async(dispatch_get_main_queue(), {
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let mainNavigationController = mainStoryboard.instantiateViewControllerWithIdentifier("MainNavigationController") as! UINavigationController
(UIApplication.sharedApplication().delegate as! AppDelegate).window?.rootViewController = mainNavigationController
})
}
func logInButtonPressed() {
self.passwordAuthenticationCompletion.setResult(AWSCognitoIdentityPasswordAuthenticationDetails(username: emailTextField.text, password: passwordTextField.text))
}
}
class SignInViewController: UIViewController {
@IBAction func signInButtonTouched(sender: UIButton) {
if (emailTextField.text != nil) && (passwordTextField.text != nil) {
let user = (UIApplication.sharedApplication().delegate as! AppDelegate).userPool!.getUser(emailTextField.text!)
user.getSession(emailTextField.text!, password: passwordTextField.text!, validationData: nil, scopes: nil).continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: {
(task:AWSTask!) -> AnyObject! in
if task.error == nil {
// user is logged in - show logged in UI
} else {
// error
}
return nil
})
} else {
// email or password not set
}
}
}
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: "###", identityProviderManager: (UIApplication.sharedApplication().delegate as! AppDelegate).userPool!)
let serviceConfiguration = AWSServiceConfiguration(region: .APNortheast1, credentialsProvider: credentialsProvider)
AWSLambdaInvoker.registerLambdaInvokerWithConfiguration(serviceConfiguration, forKey: "Lambda")
let lambdaInvoker = AWSLambdaInvoker(forKey: "Lambda")
Fabric.with([AWSCognito.self, Crashlytics.self])
Fabric.with([Crashlytics.self])
最佳答案
更新 6 :(这次真的是最后一次)
值得一提的是,(最后)AWS 已经让 AWS Mobile Hub 构建了一个非常好的演示应用程序,其中包括用户池作为 SignInProvider(谷歌和 Facebook 也是如此)。该架构(在我看来)非常出色(他们将身份管理和从身份验证中获取凭据分开了)
一探究竟
更新 5:(和最终)
有一个相当完整的示例实现,以及一些关于它在另一个答案中如何工作的文档。
iOS - AWS MobileHub sign in with developer authenticated provider
更新 4:
如果您想访问 AWS 服务,则需要执行更多步骤
事实证明,这不会让您使用 Cognito 联合身份进行身份验证(身份浏览器上的“登录”计数保持为 0)。要解决此问题,您需要建立一个凭据提供程序并执行“credentialsProvider.getIdentityId”。之后登录将显示为肯定,您可以根据您的身份验证角色从 AWS 获取服务。
如果您尝试对移动应用程序进行 Authenticated 和 UnAuthenticated 访问,则需要创建 AWSAnonymousCredentialsProvider(在单独的服务配置中)。然后您在注销时 self.credentialsProvider?.invalidateCachedTemporaryCredentials() 和 self.credentialsProvider?.clearCredentials() 并使用匿名服务配置再次执行 getidentityid ,您将获得一个匿名 ID。 (注意:我发现如果您在凭据提供程序上清除钥匙串(keychain),每次用户注销时它都会以一个新 ID 开头,这可能会很快消耗掉您的 50,000 个免费 ID。)
更新 3:
在 Swift 中上传了适用于 IOS 的 AWS 用户池的 github 示例应用程序。
https://github.com/BruceBuckland/signin
更新 2:
我终于让 AWS 用户池在 Swift 中正常工作
我的问题是每次身份验证开始时都是由不同 View Controller 中的身份验证失败引起的(我的错误)。我最终让他们中的一群人在等待完成返回,而这些返回从未出现,并且 API 是“无声的”(没有显示任何错误)。 API 不会注意到它被多次启动(每次由不同的 viewController 启动),因此它会默默地一遍又一遍地登录。原始帖子中没有足够的代码来查看您是否遇到同样的问题。
你必须小心,AWS 示例代码(在 Objective-C 中)有两个导航 Controller ,代码重用了它们。我不喜欢示例应用程序在身份验证委托(delegate)开始之前闪烁登录 View Controller 的方式,我试图在 swift 版本中改进它,这导致了我的问题。
AWS 用户池 API 设置为使用 Storyboard或应用程序结构,其工作方式如下:
1) 您的应用假定它已登录,然后触发委托(delegate),如果未登录,则触发身份验证和登录屏幕。
2)在原始登录 View Controller pool.currentUser() 不足以进行身份验证,API 只会在您执行更多操作时触发委托(delegate)(在我的情况下为 user.getDetails())。
3) 通过 didCompletePasswordAuthenticationStepWithError 完成认证。如果您收到身份验证(或其他)错误并且成功进行身份验证,则会调用此委托(delegate)方法。在认证成功的情况下,NSError 为零,所以它应该声明为 NSError?在委托(delegate)中(这会导致警告)。 API 是测试版,他们可能会解决这个问题。
4) 另一个小“问题”,对你来说可能很明显,它捕获了我,当你在控制台中定义你的用户池时,你指定了允许的应用程序,这些应用程序中的每一个都有不同的客户端 ID 字符串字符串。 (我只是将相同的东西插入示例中)效果不佳(但不报告错误)。 API 需要报告部门的一些工作。它在工作时非常冗长,但如果您传递错误的客户端字符串,则什么也不说。此外,如果您(像我一样)从不同的 View Controller 调用 API,它似乎什么也没说。它只是从不同的 View Controller 获取每个新的身份验证请求并且什么也不说。
无论如何,它现在有效。我希望这有助于解决您的问题。
更新:
我终于得到了 getPasswordAuthenticationDetails 来执行。
事实证明,直到当前用户的 user.getDetails 才会执行它(即使没有当前用户)。
所以let user = appDelegate.pool!.currentUser()
let details = user!.getDetails()
将导致在第二行执行 getPasswordAuthenticationDetails 回调。
AWS UserPool 的概念似乎是我们编写了一个假设我们有一个登录用户的应用程序。我们从该用户那里获取详细信息(例如在初始 View Controller 中),如果我们没有用户,则委托(delegate)将被启动。
IOS 上用户池的 AWS 文档缺少一些重要的概念页面。这些页面包含在(否则并行)Android 文档中。我承认我仍然在努力让用户池快速工作(现在几天),但是阅读 Android 文档的“主要类”和“关键概念”部分对我来说澄清了很多。我不明白为什么从 IOS 文档中省略了它。
关于ios - iOS (Swift) 应用程序中的 AWS Cognito 用户池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37176334/
在为 Web 应用程序用例图建模时,为用户可以拥有的每个角色创建一个角色是否更好?或拥有一个角色、用户和一个具有特权的矩阵? guest < 用户 < 版主 < 管理员 1: guest 、用户、版主
我无法使用 Elixir 连接到 Postgres: ** (Mix) The database for PhoenixChat.Repo couldn't be created: FATAL 28P
这个问题已经有答案了: Group by field name in Java (7 个回答) 已关闭 7 年前。 我必须编写一个需要 List 的方法并返回 Map> . User包含 Person
感谢您的帮助,首先我将显示代码: $dotaz = "Select * from customers JOIN contracts where customers.user_id ='".$_SESS
我只想向所有用户中的一个用户显示一个按钮。我尝试了 orderByKey() 但没有成功! 用户模型有 id 成员,我尝试使用 orderByChild("id") 但结果相同! 我什至尝试了以下技巧
我们在工作中从 MongoDB 切换到 Postgres,我正在建立一个 BDR 组。 在这一步,我正在考虑安全性并尽可能锁定。因此,我希望设置一个 replication 用户(角色)并让 BDR
export class UserListComponent implements OnInit{ users; constructor(private userService: UserS
我可以使用 Sonata User Bundle 将 FOS 包集成到 sonata Admin 包中。我的登录功能正常。现在我想添加 FOSUserBundle 中的更改密码等功能到 sonata
在 LinkedIn 中创建新应用程序时,我得到 4 个单独的代码: API key 秘钥 OAuth 用户 token OAuth 用户密码 我在 OAuth 流程中使用前两个。 的目的是什么?最后
所以..我几乎解决了所有问题。但现在我要处理另一个问题。我使用了这个连接字符串: SqlConnection con = new SqlConnection(@"Data Source=.\SQLEX
我有一组“用户”和一组“订单”。我想列出每个 user_id 的所有 order_id。 var users = { 0: { user_id: 111, us
我已经为我的Django应用创建了一个用户模型 class User(Model): """ The Authentication model. This contains the u
我被这个问题困住了,找不到解决方案。寻找一些方向。我正在用 laravel 开发一个新的项目,目前正致力于用户认证。我正在使用 Laravels 5.8 身份验证模块。 对密码恢复 View 做了一些
安装后我正在使用ansible配置几台计算机。 为此,我在机器上本地运行 ansible。安装中的“主要”用户通常具有不同的名称。我想将该用户用于诸如 become_user 之类的变量. “主要”用
我正在尝试制作一个运行 syncdb 的批处理文件来创建一个数据库文件,然后使用用户名“admin”和密码“admin”创建一个 super 用户。 到目前为止我的代码: python manage.
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我已在 Azure 数据库服务器上设置异地复制。 服务器上运行的数据库之一具有我通过 SSMS 创建的登录名和用户: https://learn.microsoft.com/en-us/azure/s
我有一个 ionic 2 应用程序,正在使用 native FB Login 来检索名称/图片并将其保存到 NativeStorage。流程是我打开WelcomePage、登录并保存数据。从那里,na
这是我的用户身份验证方法: def user_login(request): if request.method == 'POST': username = request.P
我试图获取来自特定用户的所有推文,但是当我迭代在模板中抛出推文时,我得到“User”对象不可迭代 观看次数 tweets = User.objects.get(username__iexact='us
我是一名优秀的程序员,十分优秀!