如何从Android Google令牌创建parse_用户帐户?

如何从Android Google令牌创建parse_用户帐户?,android,parse-platform,oauth-2.0,Android,Parse Platform,Oauth 2.0,我发现了一些有用的信息片段 演示如何在拥有解析令牌后登录Android应用程序 我可以成功获得手机谷歌账户的谷歌代币 如何让Parse使用Google令牌创建解析令牌 我假设这将涉及编写一些云代码,但我不清楚云代码应该做什么。我认为它需要为Google令牌创建或找到一个新的用户,并返回解析令牌 有没有解析云代码的例子来说明如何处理GoogleAndroid登录/注册,或者除了Facebook/Twitter之外的其他例子 注意:这个答案不适用于开源解析服务器,因为它只使用可撤销会话。查看更多更

我发现了一些有用的信息片段

演示如何在拥有解析令牌后登录Android应用程序

我可以成功获得手机谷歌账户的谷歌代币

如何让Parse使用Google令牌创建解析令牌

我假设这将涉及编写一些云代码,但我不清楚云代码应该做什么。我认为它需要为Google令牌创建或找到一个新的用户,并返回解析令牌


有没有解析云代码的例子来说明如何处理GoogleAndroid登录/注册,或者除了Facebook/Twitter之外的其他例子

注意:这个答案不适用于开源解析服务器,因为它只使用可撤销会话。查看更多更新

更新(2016年1月):

您需要关闭才能在
Parse.User
上调用
getSessionToken
。转到应用程序设置>用户>>关闭需要可撤销会话。这在2016年并不新鲜,但在给出答案时,作者并不知道这一变化


为了便于理解,我将分为两种情况:新用户和返回用户

1.新用户 流程如下:

{
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "email": "billd1600@gmail.com",
 "at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
 "email_verified": "true",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953"
}
  • 用户授权并获取令牌
  • 我们使用随机密码创建一个新用户
  • 您可以在返回电子邮件的
    newchooseAccountContent()
    方法中使用以下代码创建ParseUser

    ParseUser user = new ParseUser();
    user.setUsername(mEmail);
    user.setPassword(randomPassword);
    user.setEmail(mEmail);
    user.signUpInBackground(new SignUpCallback() {
      public void done(ParseException e) {
        if (e == null) {
          // Hooray! Let them use the app now.
        } else {
          // Sign up didn't succeed. Look at the ParseException
          // to figure out what went wrong
        }
      }
    });
    
    2.返回用户 正如我在互联网上研究的那样,这是大多数人陷入困境的地方。流程如下:

    {
     "iss": "https://accounts.google.com",
     "sub": "110169484474386276334",
     "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
     "email": "billd1600@gmail.com",
     "at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
     "email_verified": "true",
     "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
     "iat": "1433978353",
     "exp": "1433981953"
    }
    
  • 用户授权,应用程序获得令牌
  • 我们将此令牌传递给云代码进行验证。我们需要检查该代币是否由谷歌签署,以及是否是为我们所用((2013))
  • 验证令牌是否有效后,可以使用Parse.Cloud.useMasterKey()方法在云代码中查询用户,并使用getSessionToken()方法在查询结果上返回会话密钥
  • 通过调用
    becomeInBackground
    方法,使用会话密钥在磁盘上保存登录状态
  • 要验证令牌,可以将
    Parse.Cloud.httprequest
    发送到此端点:
    https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=
    。这是在中说明的。您将收到以下数据:

    {
     "iss": "https://accounts.google.com",
     "sub": "110169484474386276334",
     "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
     "email": "billd1600@gmail.com",
     "at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
     "email_verified": "true",
     "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
     "iat": "1433978353",
     "exp": "1433981953"
    }
    
    需要比较的是“aud”、“azp”和“电子邮件”,它们被翻译为受众、授权方和电子邮件

    要查询云上当前用户代码

    var query = new Parse.Query(Parse.User);
    query.equalTo("email",mEmail);
    query.first({
      success: function(user) {
        // Use user..getSessionToken() to get a session token
      },
      error: function(user, error) {
        //
      },
      useMasterKey: true
    });
    
    注意:确保您具有以下范围,以便在检查云代码时显示电子邮件:https://www.googleapis.com/auth/plus.profile.emails.read

    步骤:

  • 获取谷歌代币
  • 将Google令牌发送到您的解析后端进行验证
  • 使用已验证的Google令牌创建解析会话令牌
  • 使用解析会话令牌允许用户访问应用程序

  • (1):参见指南:


    (2):将ID令牌发送到后端服务器(在本例中为解析)

    //将令牌发送到后端
    String backendapirltogeneratesessiontoken=您的\u url\u与\u cloud\u code\u生成\u会话\u令牌;
    Log.i(“URL:,BackendApirlToGenerateSessionToken”);
    RequestQueue newRequestQueue=Volley.newRequestQueue(this);
    JSONObject getSessionTokenJsonRequestBody=新JSONObject();
    //后端需要验证令牌和Google客户端ID
    试一试{
    getSessionTokenJsonRequestBody.put(“idToken”,idTokenFromGoogle);
    getSessionTokenJsonRequestBody.put(“GClientId”,您的\u google\u客户端\u id);//在google-services.json文件中找到它
    }捕获(JSONException e){
    e、 printStackTrace();
    }
    最后一个字符串requestBody=getSessionTokenJsonRequestBody.toString();
    JsonObjectRequest JsonObjectRequest=新的JsonObjectRequest(Request.Method.POST、BackendApirlToGenerateSessionToken、getSessionTokenJsonRequestBody、,
    新的Response.Listener(){
    @凌驾
    公共void onResponse(JSONObject响应){
    //成功回调
    //设置当前用户并继续
    试一试{
    ParseUser.becomeInBackground(response.getString(“result”),new LogInCallback(){
    @凌驾
    公共无效完成(ParseUser用户,parsee异常){
    如果(用户!=null){
    //成功登录,将用户转到他们所在的最后一页
    完成();
    }否则{
    //错误
    Log.e(“登录错误:,e.getMessage());
    //显示错误对话框,提示用户再次登录
    }
    }
    });
    }捕获(JSONException e){
    e、 printStackTrace();
    }
    }
    },
    新的Response.ErrorListener(){
    @凌驾
    公共无效onErrorResponse(截击错误){
    //错误回调
    int statusCode=error.networkResponse.statusCode;
    NetworkResponse=错误。NetworkResponse;
    Log.d(“错误响应请求:”、“+statusCode+”+Response.data.toString());
    }
    })
    {
    @凌驾
    
    //generating a random password
    function getRandomString(){
        var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
        var string_length = 10;
        var randomstring = '';
    
        for (var i=0; i<string_length; i++) {
            var rnum = Math.floor(Math.random() * chars.length);
            randomstring += chars.substring(rnum,rnum + 1);
        }
        return randomstring;
    }
    
    Parse.Cloud.define("getSessionToken", function(request, response) {
        console.log(request);
        console.log(request.params.accessToken);
        console.log(request.params.GClientId);
        Parse.Cloud.useMasterKey();
    
    //Verifying token (id Token)
    var authTokenVerificationURL = "https://oauth2.googleapis.com/tokeninfo?id_token=" + request.params.idToken;
    console.log(authTokenVerificationURL);
    Parse.Cloud.httpRequest({
        url:authTokenVerificationURL
    }).then(function(httpResponse){
        //Success
        //console.log("success httpResponse: " + httpResponse.text);
    
        //Verify if token is generated from our client
        var gAudience = httpResponse.data.aud;
        if(gAudience == request.params.GClientId) {
            console.log("Verified: Token is generated from our app");
    
            var user_emailId = httpResponse.data.email; 
            var user_username = httpResponse.data.name;
            //console.log(user_emailId);
    
            /*
            * 1. User signing up for the first time
            * 2. User already signed up logging in
            */
    
            //Check if User account exists for the emailId
            var query = new Parse.Query(Parse.User);
            query.equalTo("email",user_emailId);
            query.first({
                success: function(user) {
    
                    //if the user exists, they could have logged out so no sessionToken is available so we'll need to log them in again
                    if(user) {
                        console.log("User found with Username: " + user.getUsername() + ", objectId: " + user.id);
    
                        //Generate the Session Token
                        var sessionToken = user.getSessionToken();
                        if(sessionToken) {
                            console.log("SessionToken: " + sessionToken);
                            response.success(sessionToken);
                        }else {
                            //create a new session - login (user can signup then log-out which deletes the session)
                            var newRandomPassword = getRandomString();
                            user.set("password", newRandomPassword);
                            user.save(null, {useMasterKey : true}).then(function(user){
                                Parse.User.logIn(user.get("username"), newRandomPassword).then(function(user){
                                    var sessionToken = user.getSessionToken();
                                    response.success(sessionToken);
                                }, function(error){
                                    response.error("Cannot create session");
                                })
                            }, function(error){
                                response.error("Unable to save user data");
                            });
    
                        }
    
                    }else {
                        console.log("User not found, Creating new account for user with emailId: " + user_emailId);
    
                        //Create New Account
                        var nUser = new Parse.User();
                        nUser.set("username",user_username);
                        nUser.set("password",getRandomString());
                        nUser.set("email",user_emailId);
                        nUser.signUp(null,{
                            success: function(user) {
                                console.log("New account created for user with emailID: " + user_emailId);
    
                                //Generate the Session Token
                                var sessionToken = user.getSessionToken();
                                console.log("SessionToken: " + sessionToken);
                                response.success(sessionToken);
                            },
                            error: function(user, error) {
                                console.log("Failed to create a new account for emailID: " + user_emailId);
                                console.log("User: " + user + ", Error: " + error);
                                response.error(error);
                            }
                        });
                    }
    
    
                },
                error: function(user, error) {
                    console.log("Query to fetch user failed");
                    console.log("User: " + user + ", Error: " + error);;
    
                    response.error(error);  
                },
                userMasterKey:true
            });
    
    
    
        }else { //Client has not login from our app
            console.log("Google AudienceID: " + gAudience + "\n AppClientId: " + request.params.GClientId);
            response.error('Invalid Audience');
        }
    
    },function(httpResponse) {
        //Error
        console.log("Failed httpResponse: " + httpResponse.text);
        console.error('Request Failed with response code' + httpResponse.status);
        response.error('Failed to verify access token');
    });
    
    });