我正在编写一个与远程服务器通信的 Android 应用程序,我希望允许应用程序用户使用他们手机上的谷歌凭据登录服务器,即不需要用户输入他们的谷歌密码在我的应用程序中的任何地方。例如,如果用户的 (Android) 手机已配置为“someguy@gmail.com”,然后他们安装并运行我的应用程序,我的应用程序将向他们显示一个对话框,内容为“您希望以 someguy@ 身份登录吗? gmail.com?”,并在点击“确定”按钮后,他们会在我的服务器上建立一个 ID,该 ID 知道他们的电子邮件地址是 someguy@gmail.com,由谷歌本身认证。
我发现了关于如何实现这一点的广泛而多样的部分秘诀,包括谷歌自己的 oauth2 文档,但还没有对如何实现这一切的理解。
我确实有 Android 代码,它使用 AccountManager 来确定给定手机上有哪些谷歌帐户。我提示用户他们想使用哪个谷歌帐户登录,然后我取回授权 token 。
过了那个点,我几乎在旋转我的轮子。我看过的食谱似乎要求我使用这种形式的 http get:
http://<myWebServer>.com/_ah/login?continue=<someUrlIChoose>&auth=<authToken>
... 这 (a) 令人不满意,因为它似乎特定于 appengine,我希望可以自由地在我选择的任何后端上运行它,以及 (b) 甚至尝试使用 appengine,我的 appengine 实例已经设置似乎根本没有发出信号,即日志显示现在对它的查询(我希望 someUrlIChoose url 会被调用一些东西)......因此没有机会被告知有效性 token 。
具体问题包括:
- 我如何处理授权 token ...我是否将它发送到我的服务器,以及 以某种方式让我的服务器联系谷歌来验证 token 的有效性 对于指定的帐户?或者是否有一些反向 channel 本来应该有的沟通(在这个阶段 进程)源自谷歌服务器通知我的服务器 此 token 有效(如果有效,我该如何设置)?或者其他的东西 还有吗?
- 我认为这个过程应该在 任何后端(不仅仅是应用引擎)的上下文?
- 我应该使用 oauth2 吗(与 oauth1 或其他东西相反) 别的)?我读到的一切似乎都暗示谷歌支持 oauth2 是“实验性的”......但我还不确定是否这样 断言是当前的还是旧的;即使是当前的,谷歌也有 以永久非最终形式保存各种产品的历史(例如 永恒的测试版),所以我不知道该对此下什么结论。
- 任何其他相关的...
最佳答案
您必须先导入 google-play-services_lib 才能使用此代码:
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;
private void gmail_login() {
dialog = ProgressDialog.show(LoginActivity.this, "", getString(R.string.login_loading), true);
AsyncTask task = new AsyncTask() {
@Override
protected Object doInBackground(Object... params) {
getAndUseAuthTokenBlocking();
return null;
}
};
task.execute((Void)null);
}
void getAndUseAuthTokenBlocking() {
try
{
String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email";
AccountManager accountManager = AccountManager.get(this);
Account[] accounts = accountManager.getAccountsByType("com.google");
String token = GoogleAuthUtil.getToken(this, accounts[0].name, AUTH_TOKEN_TYPE);
//token here
}
catch (UserRecoverableAuthException userAuthEx) {
startActivityForResult(userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE);
}catch (Exception e){
DropErrorMsg.drop(this, handler, R.string.connection_error, R.string.error, dialog, false);
}
}
关于android - Android 应用中的 Google 帐户授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10557478/