Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Login using Google+ on Parse

I know this question has already been asked, but I couldn't find any solution. I am using Parse, where are users are able to login using Facebook, Twitter, and Google+. As of now, only Facebook and Twitter is fully functional.

I have managed to login using Facebook and Twitter in the following way:

private void onLoginButtonClicked() {
        LoginActivity.this.progressDialog = ProgressDialog.show(
                LoginActivity.this, "", "Logging in...", true);
        List<String> permissions = Arrays.asList("public_profile", "user_about_me",
                "user_relationships", "user_birthday", "user_location");
        ParseFacebookUtils.logIn(permissions, this, new LogInCallback() {
            @Override
            public void done(ParseUser user, ParseException err) {
                LoginActivity.this.progressDialog.dismiss();
                if (user == null) {
                    Log.d(IntegratingFacebookTutorialApplication.TAG,
                            "Uh oh. The user cancelled the Facebook login.");
                } else if (user.isNew()) {
                    Log.d(IntegratingFacebookTutorialApplication.TAG,
                            "User signed up and logged in through Facebook!");
                    showUserDetailsActivity();

                } else {
                    Log.d(IntegratingFacebookTutorialApplication.TAG,
                            "User logged in through Facebook!");
                moodpage();             

                }
            }
        });
    }

    private void onTwitterButtonClicked() {
        ParseTwitterUtils.logIn(this, new LogInCallback() {
              @Override
              public void done(ParseUser user, ParseException err) {
                if (user == null) {
                  Log.d("MyApp", "Uh oh. The user cancelled the Twitter login.");
                } else if (user.isNew()) {
                  Log.d("MyApp", "User signed up and logged in through Twitter!");
                  showUserDetailsActivity();        
                  } else {
                  Log.d("MyApp", "User logged in through Twitter!");
                  moodpage();               }
              }

            });
    }

I am trying to figure out to achieve this with Google+ through parse. Someone has suggested for me to look into Parse Rest API, however, I am not familiar with it, and need more guidance.

Some people have suggested me to use https://github.com/Glamdring/google-plus-java-api/ and looks promissing, but I am not sure how I would work that out.

for example lets say I have

    googleButton = (Button) findViewById(R.id.twitterButton);
        googleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {



                onGoogleButtonClicked();
            }
        });

private void onGoogleButtonClicked(); {
        //what to input here
    }

Any clarification will be appreciated.

like image 280
code_legend Avatar asked Sep 30 '22 14:09

code_legend


1 Answers

Parse.com only support facebook and twitter yet but not google+, for that you have to implement your own using authentication at cloud (parse.com) side

This is long process so be patient

Follow this steps

1) get google profile information for that implement this necessary functions

put in onCreate()

mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
    .addConnectionCallbacks(this) //lets impement ConnectionCallbacks
    .addOnConnectionFailedListener(this).addApi(Plus.API) // lets implement OnConnectionFailedListener
    .addScope(Plus.SCOPE_PLUS_LOGIN).build();
    mGoogleApiClient.connect();

2) method of implemented OnConnectionFailedListener

@Override
public void onConnectionFailed(ConnectionResult result) {
    // TODO Auto-generated method stub
    if (!result.hasResolution()) {
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), getActivity(),
                0).show();
        return;
    }

    if (!mIntentInProgress) {
        // Store the ConnectionResult for later usage
        mConnectionResult = result;

        if (mSignInClicked) {
            // The user has already clicked 'sign-in' so we attempt to
            // resolve all
            // errors until the user is signed in, or they cancel.
            resolveSignInError();
        }
    }
}

/**
 * Method to resolve any signin errors for google plus
 * */
private void resolveSignInError() {
    if (mConnectionResult.hasResolution()) {
        try {
            mIntentInProgress = true;
            mConnectionResult.startResolutionForResult(getActivity(), RC_SIGN_IN);
        } catch (SendIntentException e) {
            mIntentInProgress = false;
            mGoogleApiClient.connect();
        }
    }
}

3) call on google+ button click

private void loginUsingGoolgePlus() {
    // TODO Auto-generated method stub
    if (!mGoogleApiClient.isConnecting()) {
        mSignInClicked = true;
        resolveSignInError();
    }

}

4) methods of implemented ConnectionCallbacks

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub
    mSignInClicked = false;
    Toast.makeText(getActivity(), "User is connected!", Toast.LENGTH_LONG).show();

    // Get user's information
    getProfileInformation();

}
@Override
public void onConnectionSuspended(int arg0) {
    // TODO Auto-generated method stub
    mGoogleApiClient.connect();

}

5) this method will give you profile information

/**
 * Fetching user's information name, email, profile pic
 * */
private void getProfileInformation() {
    try {
        if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
            Person currentPerson = Plus.PeopleApi
                    .getCurrentPerson(mGoogleApiClient);
            String personName = currentPerson.getDisplayName();
            String personPhotoUrl = currentPerson.getImage().getUrl();
            String personGooglePlusProfile = currentPerson.getUrl();
            final String email = Plus.AccountApi.getAccountName(mGoogleApiClient);

            Log.e(TAG, "Name: " + personName + ", plusProfile: "
                    + personGooglePlusProfile + ", email: " + email
                    + ", Image: " + personPhotoUrl);

            // by default the profile url gives 50x50 px image only
            // we can replace the value with whatever dimension we want by
            // replacing sz=X
            personPhotoUrl = personPhotoUrl.substring(0,
                    personPhotoUrl.length() - 2)
                    + PROFILE_PIC_SIZE;

            new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    googleAuthWithParse(email);
                }
            }).start();
        } else {
            Toast.makeText(getActivity(),
                    "Person information is null", Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

6) this is important here we generate one token and using this and email id, we call script function accessGoogleUser at cloud side (Parse.com) (this cloud code nothing but javascript main.js

-accessGoogleUser will give you accessToken using this accessToken you can do login or signup

protected void googleAuthWithParse(String email) {
    // TODO Auto-generated method stub
     String scopes = "oauth2:" + Scopes.PLUS_LOGIN + " ";
     String googleAuthCode = null;
    try {
        googleAuthCode = GoogleAuthUtil.getToken(
                 getActivity(),                                           // Context context
                 email,                                             // String email
                 scopes,                                            // String scope
                 null                                      // Bundle bundle
         );
    } catch (UserRecoverableAuthException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (GoogleAuthException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

     //Log.i(TAG, "Authentication Code: " + googleAuthCode);

    final HashMap<String, Object> params = new HashMap<String, Object>();
    params.put("code", googleAuthCode);
    params.put("email", email);
    //loads the Cloud function to create a Google user
    ParseCloud.callFunctionInBackground("accessGoogleUser", params, new FunctionCallback<Object>() {
        @Override
        public void done(Object returnObj, ParseException e) {
            if (e == null) {
                Log.e("AccessToken", returnObj.toString());
                ParseUser.becomeInBackground(returnObj.toString(), new LogInCallback() {
                    public void done(final ParseUser user, ParseException e) {
                        if (user != null && e == null) {
                            showToast("The Google user validated");

                            if(user.isNew()){
                                  //isNew means firsttime   
                            }else{

                              loginSuccess();
                            }
                        } else if (e != null) {
                            showToast("There was a problem creating your account.");
                            e.printStackTrace();
                            mGoogleApiClient.disconnect();
                        } else
                            showToast("The Google token could not be validated");
                    }
                });
            } else {
                        if (e != null) {

                            try {
                                JSONObject jsonObject = new JSONObject(e.getMessage());
                                showToast(jsonObject.getString("message"));
                            } catch (JSONException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            }
                            e.printStackTrace();
                            mGoogleApiClient.disconnect();
                        }
            }
        }
    });
}

7) How to upload cloud code main.js at parse.com cloud

read carefully and download Parse.exe and from here after download do

place parse.exe and ParseConsole.exe in ':\Windows\System32' folder. Then search for Windows PowerShell in the start menu and run it as an administrator. Wait for the prompt in the window (mine was a blue window) to indicate it is in the ':\Windows\System32' folder. Then type '.\ParseConsole.exe' and press enter.

this how we upload files

below files will create at C:\Users\xxxx while follow image steps

1) cloud
   - main.js
2) config
  ─ global.json
3) public
  ─ index.html

enter image description here

8) download main.js from here and replace with default main.js which created in cloud folder

Note : don't forgot to add your client id and secret into this main.js

9) check this too.!!

Require Revocable Sessions should be false in parse data browser -> settings ->General

Ask me for any doubt. i am ready for help.!!

like image 131
Kishore Jethava Avatar answered Oct 02 '22 16:10

Kishore Jethava