如何使用 AWS Mobile-hub SDK 获取登录用户名

How to get login username with AWS Mobile-hub SDK

我已经为我的应用程序的登录部分工作了一段时间。我正在尝试使用 ASW Mobile Hub 来解决这个问题。我找到了一种方法让它与我需要的不同提供商一起工作:我自己的用户池、FB 和 Google.

问题是我一直在此处和整个 AWS 文档中搜索,试图找到获取用户数据(用户名和一些其他用户数据,如图片、电子邮件等)的方法。如果我直接使用 FBSDK(使用 FBSDKGraphRequest),我可以得到它,但如果用户选择登录我的认知用户池,我不知道该怎么做。我也看不到用户曾经成功使用的提供程序。

我可以找到一些其他方法来获得它,但是使用旧的 SDK o 直接调用 Cognito 最初并不是我需要的。这是我用来显示登录名的代码 window:

    override func viewDidLoad() {
       super.viewDidLoad()

       if !AWSSignInManager.sharedInstance().isLoggedIn {
         presentAuthUIViewController()
       }
    }

    func presentAuthUIViewController() {
        let config = AWSAuthUIConfiguration()
        config.enableUserPoolsUI = true
        config.addSignInButtonView(class: AWSFacebookSignInButton.self)
        config.addSignInButtonView(class: AWSGoogleSignInButton.self)


        AWSAuthUIViewController.presentViewController(
        with: self.navigationController!,
        configuration: config, completionHandler: { (provider: 
        AWSSignInProvider, error: Error?) in
            if error == nil {
                // SignIn succeeded.
            } else {
                // end user faced error while loggin in, take any 
                required action here.
            }
        })
     }

那么问题来了,登录成功后如何获取相关的用户信息呢?

如果用户使用 cognito 登录,您可以使用以下代码获取用户名。

let identityManager = AWSIdentityManager.default()
let identityUserName = identityManager.identityProfile?.userName

为了在用户成功后检索提供者,请将其保存在会话中,如下所示

func onLogin(signInProvider: AWSSignInProvider, result: Any?, 
authState: AWSIdentityManagerAuthState, error: Error?) {
  let defaults = UserDefaults.standard
  defaults.set(signInProvider.identityProviderName, forKey: 
     "identityProviderName")
}

希望这个回答对您有所帮助。

更新代码以获取用户名:

let pool = AWSCognitoIdentityUserPool.init(forKey: "CognitoUserPools")
let username = pool.currentUser()?.username

我一直在研究解决方法,直到我以更优雅的方式解决这个问题。我想我需要更深入地了解 Cognito。但事实是连亚马逊提供的样本都没有显示用户名...

Sample Amazon app screen

因此,与此同时,我修改了 Cognito 库的源代码 AWSUserPoolsUIOperations 以将数据直接发送到我的应用程序,在消息中:

@implementation AWSUserPoolsUIOperations

-(void)loginWithUserName:(NSString *)userName
            password:(NSString *)password
            navigationController:(UINavigationController *)navController
            completionHandler:(nonnull void (^)(id _Nullable, NSError * 
            _Nullable))completionHandler {
            self.userName = userName;

NSDictionary* userInfo = @{@"username": self.userName};

[[NSNotificationCenter defaultCenter]
 postNotificationName:@"UsernameNotification"
 object:nil userInfo:userInfo];

然后只是在应用程序中获取消息并存储值。

    @objc private func TestNotification(_ notification: NSNotification){
    if let dict = notification.userInfo as NSDictionary? {
        if let username = dict["username"] as? String {
            appEstats.username = username
            defaults.set(username, forKey: sUserName)
        }
    }
}

正如我所说,这不是解决方案,但同时它有效。