最近我收到了谷歌的一封电子邮件,他们抱怨第三方访问:
您的帐户容易遭受恶意攻击,因为您允许使用应用程序&使用安全性较低的登录技术访问您帐户的设备。您应该关闭此类访问权限。
这是我正在开发的一个应用程序。我使用Google身份验证,因为它在开发人员页面上进行了解释,以获取用户数据以在我的系统中识别它们。谁能告诉我为什么这是不安全的呢?
这是应用代码:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signin);
// Button click listeners
findViewById(R.id.sign_in_button).setOnClickListener(this);
// [START configure_signin]
// Configure sign-in to request offline access to the user's ID, basic
// profile, and Google Drive. The first time you request a code you will
// be able to exchange it for an access token and refresh token, which
// you should store. In subsequent calls, the code will only result in
// an access token. By asking for profile access (through
// DEFAULT_SIGN_IN) you will also get an ID Token as a result of the
// code exchange.
String serverClientId = getString(R.string.web_client_id);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestServerAuthCode(serverClientId)
.requestEmail()
.build();
// [END configure_signin]
// Build GoogleAPIClient with the Google Sign-In API and the above options.
googleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
//If there is the sign out intent, we sign the user out
Intent intent = getIntent();
final boolean signOut = intent.getBooleanExtra(RequestCode.SIGNOUT_BUNDLE.name(), false);
if (signOut)
{
//sign out
}
}
..这发生在服务器上:
public OAuthBo processAuthentication(String authCode) throws NoSuchAlgorithmException, ForbiddenException
{
logger.info("processAuthentication()");
try
{
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new FileReader(configuration.getClientSecretFile()));
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
new NetHttpTransport(),
JacksonFactory.getDefaultInstance(),
GOOGLEAPIS_OAUTH2_TOKEN_URL,
clientSecrets.getDetails().getClientId(),
clientSecrets.getDetails().getClientSecret(),
authCode,
"") // Specify the same redirect URI that you use with your web
// app. If you don't have a web version of your app, you can
// specify an empty string.
.execute();
// Get profile info from ID token
GoogleIdToken idToken = tokenResponse.parseIdToken();
idToken.verify(new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance()).setAudience(Collections.singletonList(WEB_CLIENT_ID)).build());
GoogleIdToken.Payload payload = idToken.getPayload();
String email = payload.getEmail();
//process user data
//more code...
}
catch (Exception e)
{
logger.info("error while authentication. exception={}", e.getMessage(), e);
throw new ForbiddenException(ErrorCodes.ERR_COULD_NOT_RETRIEVE_LOGIN_DATA);
}
}
[UPDATE]
附加信息:
Google建议停用不太安全的应用(https://myaccount.google.com/security)。如果你这样做,你甚至不能再通过Thunderbird访问你的邮件了。
以下是为什么这可能是:
https://support.mozilla.org/de/questions/1201406
Google / gmail调用不支持OAuth2“不太安全”的应用。但, 这不会让他们不安全。那意味着什么是gmail的意思 LessSecureApp基本上是任何不使用OAuth2的东西。
我发现在我的开发测试帐户中,默认情况下安全性较低的应用程序总是被关闭(现在我知道为什么我永远无法通过Thunderbird连接到此帐户)。这也意味着我的应用程序也适用于“不安全的应用程序:关闭”。但这并没有解决我的问题,因为我不想在收到用户收到电子邮件时让用户感到不安,我的应用程序“安全性较低”。
如果链接中的评论是正确的,那么问题是: OAuth2足以让Google满足多少?我完全遵循here的实现,这实际上是某种谷歌的OAuth2实现,除了我不提取访问令牌,因为我不需要它来获取用户的电子邮件地址进行识别,而REDIRECT_URL是一个空字符串,但根据指南这是有效的。另外,我添加了验证检查(在上面的代码中也更新了):
idToken.verify(new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance()).setAudience(Collections.singletonList(WEB_CLIENT_ID)).build());
[更新2]
也许我正在从邮件中解释错误的信息。以下是来自邮件的内容:
也许他们并不意味着我的登录实施。他们也可能意味着我的“服务帐户访问权限”:我在主帐户上收到了电子邮件。我的主要帐户也是我的Google Play帐户和Google Pay帐户等。我的应用程序,尤其是使用查看器帐户的后端服务器,可以访问Google Play开发帐户,因为它必须获取有关订阅的信息(通过授权):https://developers.google.com/android-publisher/api-ref/purchases/subscriptions/get。 但是为什么他们告诉我关于我自己完成的这种特殊配置,你可能永远不会巧合或者其他什么。确实,这件事花了我很多时间来配置。现在他们通知我了吗?这是愚蠢的。
答案 0 :(得分:0)
显然Google登录与邮件无关。当我点击感叹号时,我看到此帐户具有以下权限:
查看和管理您的Google Play开发者帐户
此外,当我执行此检查时,我的其他Google Pay订阅测试帐户并未向我提供此类不太安全的消息,尽管此帐户通过Google Play Alpha设置下载了该应用(以测试应用内结算)。这证实我误解了这条消息。)