检查OAuth 2.0是否已获得授权

时间:2016-12-08 11:27:25

标签: android oauth-2.0 gmail-api

我已经实施了使用Google Gmail API转发电子邮件的应用程序。但为了做到这一点,我必须得到OAuth 2.0授权。 如何检查我是否已完成特定设备的授权?

例如,我下载应用程序,选择帐户,我想在开始时授予发送电子邮件的权限,因为这是强制性操作。 我的方法是尝试发送电子邮件,如果失败,我将在AsyncTask中获取onCancelled(),这样我就可以处理GoogleAuthException并获取错误(mLastError)。这是个坏主意,检查是否授权会更简单。

我需要发送假电子邮件,以获取UserRecoverableAuthIOException,然后我处理并授权。在那之后,一切正常。

activity.startActivityForResult((UserRecoverableAuthIOException) mLastError).getIntent(), MainActivity.REQUEST_AUTHORIZATION);

我选择了ALLOW,API工作得很好。

我可以在共享首选项中保存应用程序已授权的标记,但如果我重新安装应用程序,我的设备仍然是经过授权的,我没有相关信息。

所以我必须使用 curl https://accounts.google.com/o/oauth2/revoke?token=XXX 删除令牌。

为什么我的应用仍然获得授权? 为什么我必须手动撤销令牌? 它有一段时间到期,但如何检查? 如果它没有过期,我可以继续使用我的应用程序而无需再次授权。 有任何想法吗?

由于

1 个答案:

答案 0 :(得分:0)

您应该捕获UserRecoverableAuthException并在catch块中通过调用UserRecoverableAuthException#getIntent()从异常中恢复Intent。启动该意图,将用户带到您应用的OAuth2权限页面。

对于这些类型的服务器到服务器交互,您需要一个服务帐户,该帐户属于您的应用程序而不是单个最终用户。您的应用程序代表服务帐户调用Google API,并且不需要用户同意。

您从Google API控制台获取的服务帐户凭据包括生成的唯一电子邮件地址,客户端ID以及至少一个公钥/私钥对。您使用客户端ID和一个私钥来创建签名的JWT,并以适当的格式构造访问令牌请求。然后,您的应用程序会将令牌请求发送到Google OAuth 2.0授权服务器,后者会返回访问令牌。该应用程序使用令牌访问Google API。当令牌过期时,应用程序会重复该过程。

请在此处查看Oauth文档:https://developers.google.com/identity/protocols/OAuth2#expiration