Google Smart Lock for Passwords - 应用程序是否可以看到联合凭据密码?(例如,保存用户的 Facebook 或 Google 登录操作时)

j2e*_*nue 2 android google-smartlockpasswords

我想知道这里是否存在安全问题?任何使用 google 智能锁的应用程序都会知道用户的 google、twitter 等帐户凭据,对吗?看看这个谷歌教程here,在credentialsRetrieved回调中,Credential对象具有应用程序可以访问的用户用户名和密码。但是现在应用程序知道用户的 google 或 twitter 帐户?这是我正在谈论的代码:

 private void onCredentialRetrieved(Credential credential) {
    String accountType = credential.getAccountType();
    if (accountType == null) {
        // Sign the user in with information from the Credential. 
//right here we have the users login credentials, dont we ??  There exposed. 
        signInWithPassword(credential.getId(), credential.getPassword());
    } else if (accountType.equals(IdentityProviders.GOOGLE)) {
        // The user has previously signed in with Google Sign-In. Silently
        // sign in the user with the same ID.
        // See https://developers.google.com/identity/sign-in/android/
        GoogleSignInOptions gso =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .build();
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .setAccountName(credential.getId())
                .build();
        OptionalPendingResult<GoogleSignInResult> opr =
                Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我在这里看到的是 Credentials 对象可以公开用户密码。我意识到继续登录过程需要凭据,但这是用户在打开智能锁时做出的选择吗?

更糟糕的情况:想象一下用户启用智能锁,我制作了一个使用智能锁的应用程序。现在我可以访问用户的 Twitter 帐户凭据并进行恶意操作。如何保护用户?

son*_*eff 6

我在 Google 的 Smart Lock 团队工作,希望这能回答您的问题:

对于 Google、Facebook、Twitter 或其他“联合”凭据,这些身份提供商帐户的密码不会存储在凭据中。此类凭据上的密码字段为空,“凭据”仅用作指示用户用于给定应用程序的身份提供者的指针。这个想法是,保存和检索这样的凭据将使应用程序知道当前用户有一个现有帐户,并且应该使用特定的登录方法(并且可以通过触发相应的流程自动登录用户,或帮助自定义UI,以便用户在返回时使用适当的方法登录)。

请注意,从当前版本的 Play Services (8.4) 开始,如果应用程序尝试使用帐户类型和密码集构建和保存凭据,则 API 将抛出错误;第三方应用程序不应要求或存储身份提供者的密码。只有当前用户用于登录服务本身的应用程序的第一方密码应通过 API 存储在凭证中,并且在这种情况下不应设置帐户类型。

在问题的示例代码中,Google 类型的凭据用于以编程方式触发 Google 登录流程(请参阅此处Auth.GoogleSignInApi.silentSignIn()调用和完整示例),即自动使用 Google 登录用户,就像他们点击了Google 登录按钮,因为他们存储了“Google”类型的凭据。

通常,还请注意,应用程序只能检索已从应用程序本身(由 Android 上的程序包和证书签名标识)或 Chrome 中为已验证和关联的网站保存的凭据(请参阅详细信息)。这意味着应用程序只能访问它代表用户存储的数据(可能在另一台设备上,其想法是 Smart Lock API 有助于检索跨设备的身份验证详细信息),或者用户输入的用户名和密码关联的网站,并选择通过 Chrome 的密码管理器使用 Google 保存。

如果这回答了您的问题或您需要更多信息,请发表评论!