Android应用程序中的Google帐户授权
我正在编写一个与远程服务器对话的Android应用程序,我希望允许应用程序用户使用手机上的google凭据登录到服务器,也就是说,不需要用户在我的应用程序中的任何位置输入他们的google密码。例如,如果用户的(Android)手机配置了“someguy@gmail.com,然后他们安装并运行我的应用程序,我的应用程序将显示一个对话框,告诉他们“您希望以身份登录吗?”someguy@gmail.com?点击Ok按钮,他们就会在我的服务器上建立一个id,知道他们的电子邮件地址是什么someguy@gmail.com,经谷歌自身认证 我已经找到了关于如何实现这一点的广泛而多样的部分方法,包括谷歌自己的oauth2文档,但我还没有理解如何实现这一切 我确实有Android代码,它使用AccountManager来确定给定手机上有哪些google帐户。我会提示用户他们想使用哪个google帐户登录,然后我会得到一个授权令牌 过了那一步,我就开始转动轮子了。我所看到的食谱似乎要求我执行以下形式的http get:Android应用程序中的Google帐户授权,android,authorization,Android,Authorization,我正在编写一个与远程服务器对话的Android应用程序,我希望允许应用程序用户使用手机上的google凭据登录到服务器,也就是说,不需要用户在我的应用程序中的任何位置输入他们的google密码。例如,如果用户的(Android)手机配置了“someguy@gmail.com,然后他们安装并运行我的应用程序,我的应用程序将显示一个对话框,告诉他们“您希望以身份登录吗?”someguy@gmail.com?点击Ok按钮,他们就会在我的服务器上建立一个id,知道他们的电子邮件地址是什么someguy@
http://<myWebServer>.com/_ah/login?continue=<someUrlIChoose>&auth=<authToken>
http://.com/_ah/login?continue=&auth=
。。。这(a)是不满意的,因为它似乎是特定于appengine的,我希望可以自由地在我选择的任何后端上运行它,(b)即使使用appengine进行实验,我设置的appengine实例似乎根本没有信号,即日志现在显示对它的查询(我希望someUrlIChoose url会被调用一些东西)…因此没有机会被告知令牌的有效性
具体问题包括:
- 如何处理身份验证令牌…是否将其发送到服务器,以及 不知何故,让我的服务器联系谷歌以验证令牌的有效性 对于指定的帐户?或是否存在一些反向通道 应该已经(在这个阶段)进行的沟通 进程)源于google服务器,通知我的服务器 这个令牌是有效的(如果是的话,我该如何设置它)?或者什么的 还有别的吗
- 我认为这个过程在未来是可行的,对吗 任何后端的上下文(不仅仅是appengine)
- oauth2是我应该使用的吗(与oauth1或其他东西相对) 我读到的每一篇文章似乎都暗示谷歌对谷歌的支持 oauth2是“实验性的”……但我还没有确定是否是这样 断言是最新的或旧的;即使是最新的,谷歌也有一个 以永久非最终形式保存各种产品的历史(例如。 永恒的测试版),所以我不知道该如何总结
- 任何其他相关的
- 这就是你想要的吗
大多数Android应用程序都有某种服务器端后端,用于保存和共享数据。即使是最基本的游戏也需要记住它的功能
球员的高分。当你在构建后端时,有一个问题
你必须解决的是后端代码如何知道它在说什么应用程序
以及使用它的人是谁
您可能有用于与客户端通信的HTTP端点
但服务器端代码如何确定谁在发送消息
毕竟,任何人都可以从任何地方发送HTTP POST请求;
如果你的用户能猜出他们的名字,他们会模仿你的用户吗
身份
要求用户输入用户名和密码对用户来说真的很不友好
移动设备上的密码。特别是,如果有人安装了
您的应用程序,并授予其使用互联网和了解您的
身份,他们不应该再被纠缠了
事实证明,Google Play服务现在可以在每个网站上使用
运行Android 2.2版或更高版本的兼容设备提供了良好的性能
这个问题的解决方案,基于谷歌账户的使用
必须先导入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);
}
}