验证Android应用的后台请求,可通过Google Play进行。(手机验证应用)(怎么验证android安装成功)

访客 138 0

绝大多数Android应用都会配备服务器后台,用于存储和共享数据。即使是最简单的游戏应用也需要保存玩家的最高分记录。在设计后台时,必须解决一个关键问题:如何让后台程序能够识别与其对话的应用以及正在使用它的用户身份。

你可能已经设置了与客户端应用进行HTTP对话的端点,但服务器端程序如何确定消息发送者的身份呢?毕竟,任何人都可以从任何地方发送HTTP POST请求。如果他们能够猜到用户的身份,他们是否可以冒充你的用户呢? 要求移动设备上的用户输入用户名和密码是一种糟糕的用户体验。特别是当某个用户已经安装了你的应用,并且允许其使用互联网并知道其身份时,就不应该再给他们添麻烦了。实际上,在所有兼容Android版本2.2或更高版本设备上,Google Play服务提供了一个基于Google账号的解决方案。

主题

我将全面概述这个多步骤的过程,但是下面是一个简短的版本:你可以使用Google Play服务中的GoogleAuthUtil类来获取一个名为“身份令牌(ID Token)”的字符串。将该令牌发送到你的后台,然后你的后台可以使用它来快速方便地验证哪个应用发送了该令牌以及哪个用户在使用该应用。

验证Android应用的后台请求,可通过Google Play进行。(手机验证应用)(怎么验证android安装成功)-第1张图片-谷歌商店上架验证Android应用的后台请求

该功能已经与Google的设施整合,例如App Engine的新云端点功能。通过这个功能,应用程序/后端身份被转化为一个简单的编程模型。

现在,让我们深入细节吧。

注册应用

在应用注册过程中,你将不得不经常用到Google API控制台。为此,你需要创建一个新项目。虽然你可以给这个项目一个响亮的且有可读性的名字以及一个图形的标识,但实际上在此过程中,我们并不需要这些东西。
你也可以授权大量的Google APIs权限给这个项目,但是事实依然是,你不需要这些东西。
你需要认真考虑你要批准谁成为这个项目的成员,因为这些成员是很重要的管理角色。

生成用户ID

为了你的项目,你需要创建两个不同的OAuth 2.0用户ID。第一个是用于Web应用的用户ID。在这个过程中,你可以忽略所有标签和品牌推广内容,只需使用一个类似于“9414861317621.apps.googleusercontent.com”的用户ID字符串即可。

现在,您需要为您的Android应用程序创建一个新的用户ID。为此,您需要提供两个信息:应用程序包名称和证书签名。应用程序包名称是指在您的Android.xml文件中顶层package属性中使用Java风格的反向DNS命名,例如com.example.identity。

请使用以下的shell命令来获取您的证书签名: $ keytool -exportcert -alias -keystore -v -list

请将名为SHA1的八位字节复制,然后粘贴到Developer Console字段中,以创建您应用程序的用户ID。实际上,您只需要用户ID字符串即可。

在你的Anroid应用中

您需要使用GoogleAuthUtil类从Google Play服务中获取一个ID令牌。详细的过程将在“获取一个访问令牌”部分进行介绍。请特别注意 getToken(email, scope)方法中scope参数的取值。它必须是audience:server:client_id:X,其中X代表Web应用的用户ID。如果我们的Web应用的用户ID与上面例子中提到的值相同,那么scope参数应为audience:server:client_id:9414861317621.apps.googleusercontent.com。”

奇迹降临

通常情况下,当您请求OAuth令牌时,正在使用设备的用户会收到一个询问是否允许使用其身份来获取某些资源的提示。然而,在这种情况下,系统会检查您scope参数中的服务器端用户ID,并发现该项目与您的Android应用程序属于同一项目。因此,在无需用户干预的情况下,系统将为您生成令牌。他们已确认您是该项目开发者控制权相关方面的人员。

发送验证码

当你准备与服务器后台进行对话时,需要将之前获取的令牌发送给服务器后台。最佳方式是在POST消息中携带令牌,也可以将其作为URL参数传递,但这样会被系统记录。为了防止“中间人”窥视你的令牌,务必使用HTTPS连接。

不必进行多余的数据往返。如果你需要将高分数据发送到后台,只需将身份令牌放在一个额外的参数中即可。

令牌的使用

当你的服务器接收到来自你的Android应用的令牌时,验证该令牌变得至关重要。这个过程需要两个步骤:首先,验证该令牌是否是由Google签名的;其次,确定该令牌对你有何作用。

进行签名验证

请前往 www.googleapis.com/oauth2/v1/certs 查看,令牌将由一个Google的公共/私有密钥对进行签名。这些公开密钥经常会改变。

您需要验证获得的ID令牌,这个身份令牌实际上是一个以JSON格式编写的Web令牌。该令牌是由之前提到的证书之一签名生成的。幸运的是,有一些优秀的类库可以完成这个任务。在本篇博客中,我将介绍Java、Ruby和PHP三种语言来进行讲解。

这些类库具备缓存Google证书的功能,并且只在需要时刷新证书,因此验证过程(通常情况下)是一个快速、静态的调用。

验证令牌字段

ID令牌有一个JSON格式的有效负载,大多数的验证签名的类库也会把它以哈希或者数据字典或者其他的格式返回给你。因此,你可以读取命名的字段比如aud,azp,email

首先,你要查看名为aud的字段,验证是否你的用户ID(你在Android应用中scope参数值)一致。请不要忽略这一步,如果你不验证ID令牌,那么其他的开发者可以伪造请求来戏弄你。

此外,您还可以根据需求查看名为azp(即“授权方(authorized party)”)的字段,并验证该字段是否与您的Android应用的用户ID相匹配。另外,在顶层项目中,如果有多个Android客户端应用程序,则每个应用程序都具有自己独立的用户身份。

如果你已经顺利完成了这三项任务,那么你必然会明白

1、这个令牌是由Google发布的。

2、该令牌已发送至一台设备,并且使用该设备的用户ID作为有效负载中的电子邮件字段值。

你对下面的事情也会充满信心:

3. 该令牌是从Android应用中获取的,并且该应用的ID是有效负载中azp字段的值。

用户只能对其身份保持“高度信心”,而不是完全信任,因为不兼容或已经ROOT的Android设备可能篡改该信息。然而,他们无法伪造Google签名或通过Google认证设备来欺骗用户。

接下来,我们将继续前进。

由你决定。你要清楚自己在与谁以及哪个应用进行对话,接下来如何处理这些信息完全取决于你。

代码片段

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 import java.io.IOException; import java.security.GeneralSecurityException;   import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory;   public class Checker {        private final List mClientIDs;      private final String mAudience;      private final GoogleIdTokenVerifier mVerifier;      private final JsonFactory mJFactory;      private String mProblem = "Verification failed. (Time-out?)" ;        public Checker(String[] clientIDs, String audience) {          mClientIDs = Arrays.asList(clientIDs);          mAudience = audience;          NetHttpTransport transport = new NetHttpTransport();          mJFactory = new GsonFactory();          mVerifier = new GoogleIdTokenVerifier(transport, mJFactory);      }        public GoogleIdToken.Payload check(String tokenString) {          GoogleIdToken.Payload payload = null ;          try {              GoogleIdToken token = GoogleIdToken.parse(mJFactory, tokenString);              if (mVerifier.verify(token)) {                  GoogleIdToken.Payload tempPayload = token.getPayload();                  if (!tempPayload.getAudience().equals(mAudience))                      mProblem = "Audience mismatch" ;                  else if (!mClientIDs.contains(tempPayload.getIssuee()))                      mProblem = "Client ID mismatch" ;                  else                      payload = tempPayload;              }          } catch (GeneralSecurityException e) {              mProblem = "Security issue: " + e.getLocalizedMessage();          } catch (IOException e) {              mProblem = "Network problem: " + e.getLocalizedMessage();          }          return payload;      }        public String problem() {          return mProblem;      } }

以下是一个使用Google Java类库实现身份-令牌验证的Java类示例:

1 2 3 4 5 6 7 8 require 'google-id-token' validator = GoogleIDToken::Validator. new jwt = validator.check(token, required_audience, required_client_id) if jwt    email = jwt[ 'email' ] else    report "Cannot validate: #{validator.problem}" end

如果您计划使用Ruby来实现,您需要安装google-id-token Ruby gem,并执行以下类似的操作:

1 2 3 4 5 6 7 8 require 'google-id-token' validator = GoogleIDToken::Validator. new jwt = validator.check(token, required_audience, required_client_id) if jwt    email = jwt[ 'email' ] else    report "Cannot validate: #{validator.problem}" end

对于PHP程序员而言,他们可以参考Google APIs Client Library for PHP中的apiOAuth2.php文件中的verifyIdToken方法。特别是这个方法非常重要。

英文原文: Android Official Blog, 编译: ImportNew - 魏铮 改写后的版本:由魏铮编译,来自ImportNew的文章,发布于Android官方博客

点击这里查看译文:http://www.importnew.com/3115.html

 

标签: 谷歌商店上架 用户 身份

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~