我想知道这里是否存在安全问题?任何使用谷歌智能锁的应用程序都会知道用户的谷歌、推特等帐户凭据,对吗?看看这里的谷歌教程,在credentialsRetried回调中,Credential对象具有应用程序可以访问的用户用户名和密码。但现在该应用程序知道用户是谷歌还是推特账户?这是我所说的代码:
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);
// ...
}
}
所以我在这里看到的是Credentials对象可以公开用户的密码。我意识到继续登录过程需要凭据,但这是用户在打开智能锁时做出的选择吗?
更糟糕的情况是:想象一下,用户启用了智能锁,而我制作了一个使用智能锁的应用程序。现在我可以访问用户的twitter帐户凭据并做恶意的事情。如何保护用户?
我在谷歌的智能锁团队工作,希望这能回答你的问题:
在谷歌、脸书、推特或其他"联合"凭据的情况下,这些身份提供商帐户的密码不会存储在凭据中。此类凭据上的密码字段为空,"凭据"仅作为用户为给定应用程序使用哪个身份提供商的指针。其想法是,保存和检索这样的凭据将使应用程序能够知道当前用户有一个现有帐户,并且应该使用特定的登录方法(并且可以通过触发相应的流来自动登录用户,或者帮助自定义UI,以便用户在返回时使用适当的方法登录)。
请注意,从当前版本的Play Services(8.4)起,如果应用程序尝试构建和保存同时设置了帐户类型和密码的凭据,API将抛出错误;第三方应用程序不应要求或存储身份提供商的密码。只有用于登录服务本身的当前用户的应用程序第一方密码才应通过API存储在凭据中,并且在这种情况下不应设置帐户类型。
在问题的示例代码中,Google类型的凭据用于以编程方式触发Google登录流(请参阅此处的Auth.GoogleSignInApi.silentSignIn()
调用和完整示例),即自动将用户登录到Google,就像他们单击了Google登录按钮一样,因为他们存储了一个类型为"Google"的凭据。
一般来说,还需要注意的是,应用程序只能检索从应用程序本身(由安卓系统上的包和证书签名识别)或Chrome中保存的已验证和相关网站的凭据(请参阅详细信息)。这意味着该应用程序只能访问其代表用户存储的数据(可能是在另一台设备上,其想法是智能锁API有助于在设备之间检索身份验证详细信息),或者用户为相关网站输入的用户名和密码,并选择通过Chrome的密码管理器保存到谷歌。
如果这回答了你的问题或你需要更多信息,请留下评论!