On my internship I must work with Parse.
I'm made now an android app in wich I am using this Parse Cloud.
I create a sign up button and if the user push this button, a new account should be create.
But after the pushing this button,I have this exception:
com.parse.ParseRequest$ParseRequestException: invalid session token
I don't know my mistake.Android Studio don't show any errors and I am using this instruction.
My app was work fine yesterday morning and my first app that I am created for 1 week ago have now the same problem.
I have internet connection and restarted my tablet device.
My source code:
ParseUser user = new ParseUser();
user.setUsername(username); // String username = "Ivan"
user.setPassword(password); // String password = "Divan"
user.enableRevocableSessionInBackground();
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
Toast.makeText(getApplicationContext(),
"Successfully Signed up, please log in.",
Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getApplicationContext(),
"Sign up Error :" +e.toString(),
Toast.LENGTH_LONG).show();
}
}
});
Thanks and sorry for my bad english.
If you aren't using the latest version this tutorial explain how to make a migration. Also check the versions for all the sdk you are using.
Related
So I'm rebuilding an Android app after grieving the shutdown of Parse, and am trying to lean on Heroku and MongoLab to host my data as outlined in this tutorial.
I've been able to save and read custom objects as well as save new ParseUser objects. I just can't successfully log users in (which I was able to do previously with just Parse).
Here is a snippet of my code, after I've enabled local datastore and initialized Parse:
ParseUser.logInInBackground(username.getText().toString(), password.getText().toString(),
new LogInCallback() {
public void done(ParseUser user, ParseException e) {
if (user != null) {
Intent intent = new Intent(
MainActivity.this,
Dashboard.class);
startActivity(intent);
Toast.makeText(getApplicationContext(),
"Successfully Logged in",
Toast.LENGTH_LONG).show();
finish();
} else {
Toast.makeText(
getApplicationContext(),
"No such user exists, please signup",
Toast.LENGTH_LONG).show();
}
}
});
Running this doesn't throw any errors, but the user is not logged in and the "No such user exists, please signup" toast is shown.
Does MongoLab somehow encrypt the passwords in a way that ParseUser's login methods can't read? If you have any ideas on what the issue could be, please let me know.
I was running into the same issue. My problem ended up being the fact that I built my Android app pointing to localhost instead of to the actual IP address where my instance of Parse Server was running.
My initial (faulty) code:
Parse.initialize(
new Parse.Configuration.Builder(getApplicationContext())
.applicationId(PARSE_APPLICATION_ID)
.clientKey(PARSE_CLIENT_KEY)
.server("http://localhost:1337/parse/") // HERE
.build());
Which works with the correct IP address:
Parse.initialize(
new Parse.Configuration.Builder(getApplicationContext())
.applicationId(PARSE_APPLICATION_ID)
.clientKey(PARSE_CLIENT_KEY)
.server("http://192.168.1.9:1337/parse/") // HERE
.build());
I've been using Parse for 3 months in my android app. Now I want to add email login and social sign ons (Facebook and Google+) in the app. I have successfully added email and fb login and the user can connect both or either one of email or facebook and the app would recognise the user.
e.g. If I login through email, then connect facebook, use the app on another device, login via facebook, the app would know it's the same user and would be customised for me and would show my data. And email also works.
I have added Google+ sign-in for Android but I am not able to connect the user's Google+ credentials with the logged in user.
Parse Users table has an authData field which gets the facebook auth data and would get Twitter as well as both of these sign ons are baked into Parse SDKs.
What should be the best thing to do for Google+? I'm confused about the db design as well as how to connect the user who signed in with Google+?
What if the user just logs in via Google+? How do I make a Parse User and authenticate the user on Parse?
I'm comfortable with cloud code and Android and would really appreciate some sort of help/instructions just pushing me in the correct direction. I have never used OAuth2 and with Parse login for email and Social Sign ons, I don't think I should get into it. But let me know if I'm wrong.
Thanks!
Update: I have read a lot of questions on Parse Questions and have checked out the become method plenty of times (because I kept thinking I'm missing something after reading that). Check this question - I'm currently in the same situation.
I have:
1. Implemented Google+ sign in.
2. Got access token using GoogltAuthUtil.
Stuck with:
3. How to link currently signed in Parse user after the user signs in with Google+?
4. How to create a new Parse User if Google+ was the user's first (and only ) login choice?
This seems to be similar with
How to create a parse _User account from a Android Google token?
Following is my answer in that thread:
1. New User
The flow is as below:
User authorizes and a token is acquired
We create a new user with a random password
You can create a ParseUser using following code inside the newChooseAccountIntent() method that return email.
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. Returning User
This is the where most of people stuck, as I researched over the Internet. The flow is as below:
User authorizes and the app gets a token
We pass this token to Cloud Code to validate. We need to check if this token is signed by Google and if it is meant for us (android-developers (2013)).
After you can verify that the token is valid, you can query for the user in Cloud Code using Parse.Cloud.useMasterKey() method and return the session key by using getSessionToken() method on the query result.
Use the session key to save login state on disk by calling becomeInBackground method
To validate the token, you can send Parse.Cloud.httprequest to this endpoint: https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=. This is instructed in Google Identity Documentation. You will receive data as below:
{
"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"
}
Things need to compare are "aud", "azp" and "email" which are translated as audience, authorized party and email.
To query for the current user on Cloud Code:
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
});
Note: Make sure you have following scope so that the email will show up when you check on Cloud Code: https://www.googleapis.com/auth/plus.profile.emails.read
There's a question about this on Parse's questions. It's right here and I'm pretty sure it answers your questions.
https://parse.com/questions/google-plus
It links to the parse blog, that has some workarounds on this.
It says that you can add any login into ParseUser. You would be doing something like this:
Parse.User.become("session-token-here").then(function (user) {
// The current user is now set to user.
}, function (error) {
// The token could not be validated.
});
Another site where you should take a look:
https://parse.com/tutorials/adding-third-party-authentication-to-your-web-app
This last one is official and has an example code
void createNewGPlusUser(final String email, String name) {
final ParseUser user = new ParseUser();
user.setUsername(email);
user.setPassword("my pass");
user.put("any other variable in User class", "value");
user.setEmail(email);
user.put("name", name);
signInParseUser(user, email);
}
void signInParseUser(final ParseUser user, final String email) {
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
Log.d("TAG", "Created user");
// Hooray! Let them use the app now.
login(email);
} else {
Log.d("TAG", "Failed Creating user");
e.printStackTrace();
// Sign up didn't succeed. Look at the ParseException
// to figure out what went wrong
}
}
});
}
void login(final String email) {
ParseUser.logInInBackground(email, "my pass", new LogInCallback() {
public void done(ParseUser user, ParseException e) {
if (user != null) {
// Hooray! The user is logged in.
Log.d("TAG", "Login successful");
} else {
// Signup failed. Look at the ParseException to see what happened.
}
}
});
}
To do so, I have used the following code
ParseUser.becomeInBackground(ParseUser.getCurrentUser().getSessionToken(), new LogInCallback() {
#Override
public void done(ParseUser parseUser, ParseException e) {
if (parseUser != null) {
parseUser.setUsername(userEmail);
//firstName and lastName I am getting from Person class of google plus api
parseUser.put("FirstName", firstName);
parseUser.put("LastName", lastName);
parseUser.saveInBackground();
ParseUtils.verifyParseConfiguration(context);
ParseUtils.subscribeWithUsername(strEmail);
Intent successIntent = new Intent(context, OurServicesActivity.class);
startActivity(successIntent);
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
finish();
} else {
Log.e(TAG, e.getMessage());
Utilities.showToast(context, "Something occurred");
}
}
});
Let me know if it helps or if you have used something else.
Try this
ParseUser.becomeInBackground("session-token-here", new LogInCallback() {
public void done(ParseUser user, ParseException e) {
if (user != null) {
// The current user is now set to user.
} else {
// The token could not be validated.
}
}
})
I am developing android application and using parse.com as back end storage. But I got stuck on change password. I am able to send the reset password mail using parse.com sdk to particular email. but I want to change the password using application as well without log enter code herein using old password.
Function to send mail:-
public void resetPassword() {
CustomProgressDialog.show(LoginActivity.this, "", getResources()
.getString(R.string.please_wait));
ParseUser.requestPasswordResetInBackground("test#gmail.com",
new RequestPasswordResetCallback() {
public void done(ParseException e) {
CustomProgressDialog.dismissMe();
if (e == null) {
// An email was successfully sent with reset
// instructions.
Toast.makeText(getApplicationContext(), getResources().getString(R.string.reset_password_sent), Toast.LENGTH_LONG).show();
} else {
// Something went wrong. Look at the ParseException
// to see what's up.
Toast.makeText(getApplicationContext(), getResources().getString(R.string.reset_password_fail), Toast.LENGTH_LONG).show();
}
}
}
);
}
And also able to launch the application from mail using declaring the permission in AndroidManifest.xml.
You can use for that next method ParseUser.setPassword().
Idea is next, if user is logged in then you don't need to check old password, because it was already entered and applied by Parse.com. So you will have 2 fields New Password and Confirm New Password. Users enters them and application changes it on server.
ParseUser parseUser = ParseUser.getCurrentUser();
parseUser.setPassword(password);
parseUser.saveInBackground(new SaveCallback() {
#Override
public void done(ParseException e) {
if (null == e) {
// report about success
} else {
// report about error
}
}
});
I'm trying to link an existing user to his or her Facebook account using Parse. After logging into through Parse, the user can go to the SettingsActivity and link their Facebook account.
I achieved this by calling ParseUser.logInInBackground and then verified it by checking if ParseUser.getCurrentUser() != null.
In my SettingsActivity, the user can press a 'Connect to Facebook' button, which is supposed to link the account to Facebook, but it's not working. When the user clicks the button, I executed this code below, as per the Parse Android documentation:
mUser = ParseUser.getCurrentUser();
public void onToggleFacebookConnectedClick(View v) {
if (!ParseFacebookUtils.isLinked(mUser)) {
ParseFacebookUtils.link(mUser, this, new SaveCallback() {
#Override
public void done(ParseException ex) {
if (ParseFacebookUtils.isLinked(mUser)) {
Log.d(Application.APPTAG, "Woohoo, user logged in with Facebook!");
}
}
});
} else if(ParseFacebookUtils.isLinked(mUser)) {
ParseFacebookUtils.unlinkInBackground(mUser, new SaveCallback(){
#Override
public void done(ParseException ex) {
if (ex == null) {
Log.d(Application.APPTAG, "The user is no longer associated with their Facebook account.");
}
}
});
}
}
I am getting the error: com.parse.ParseException:java.lang.IllegalArgumentException: Cannot save a ParseUser until it has been signed up. Call SignUp first.
The user has already signed up (not using Facebook), so I am confused as to why I'm am getting this message. How can I resolve this issue?
It turns out I made a silly mistake. I wasn't linking the user correctly because my Facebook Application ID was not set correctly in my Parse App Settings.
I ran into some strange behaviour while implementing the facebook login from Parse.com in my application. Here's how to replicate it with the Blank Facebook App sample code from their samples:
I want to create a new "Post" associated to the current user. At the end of the onCreate() from UserDetailsActivity, I added :
ParseObject post = new ParseObject("Post");
post.put("name", "New post");
post.put("user", ParseUser.getCurrentUser());
post.saveInBackground(new SaveCallback() {
#Override
public void done(ParseException e) {
if (e != null) {
e.printStackTrace();
}
}
});
This work pretty well until I enable the localDataStore in the Application. The code above returns :
com.parse.ParseException : java.lang.IllegalArgumentException : Cannot save a ParseUser until it has been signed up. Call signUp first.
Note : the data associated with the ParseUser returned in the callback of ParseFacebookUtils.logIn() are null (objectId, username, ..) which explains the behaviour above.
The question is then : why adding
Parse.enableLocalDatastore(this);
to the App makes facebook login return an empty ParseUser ?
Ths error happens once every two launches :
First launch, no valid current user is stored in the offlineStore database, facebook login successfully add one, everything works perfectly
Second launch, a valid user is already stored, which is replaced by an "OfflineObject" User with no objectId or data, causing the error above.
I'm using Parse 1.5.0 & Facebook SDK 3.14.
It is very possible that ParseUser.getCurrentUser() is returning null as per https://parse.com/docs/android/api/com/parse/ParseUser.html#getCurrentUser(). You may want to do a facebook login first and then try to use the ParseUser
ParseFacebookUtils.logIn(getActivity(), new LogInCallback() {
#Override
public void done(ParseUser user, ParseException err) {
if(user != null) {
// use ParseUser here
}
}
});
Also, I wouldn't recommend using Parse 1.5.0 with version 3.14 of the facebook SDK. The docs for Parse https://www.parse.com/docs/android_guide#fbusers state that "Parse is compatible with v3.0 of the Facebook SDK for Android." My experience leads me to believe they aren't lying.