Как связать Google +, подписанный с пользователями в Parse backend на Android?
Я использую Parse в течение 3 месяцев в своем приложении для Android. Теперь я хочу добавить адрес электронной почты и социальные значки (Facebook и Google+) в приложении. Я успешно добавил логин электронной почты и fb, и пользователь может подключиться как к одному, так и к электронной почте или facebook, и приложение узнает пользователя.
например. Если я вхожу в систему через электронную почту, тогда подключаю фейсбук, использую приложение на другом устройстве, входите в систему через facebook, приложение будет знать его одним и тем же пользователем и будет настроено для меня и будет показывать мои данные. И электронная почта также работает.
Я добавил вход в Google+ для Android, но я не могу подключить учетные данные пользователя Google+ с зарегистрированным пользователем.
Таблица Parse Users имеет поле authData, которое получает данные аутентификации facebook и будет получать Twitter, а оба этих знака запекаются в Parse SDK.
Что лучше всего делать в Google+? Я запутался в дизайне db, а также о том, как подключить пользователя, который подписался с Google +?
Что делать, если пользователь просто входит в систему через Google+? Как создать пользователь Parse и аутентифицировать пользователя в Parse?
Мне нравится облачный код и Android, и я бы очень хотел, чтобы какая-то помощь/инструкции просто подталкивали меня в правильном направлении. Я никогда не пользовался OAuth2 и с логином Parse для электронной почты и Social Sign ons, я не думаю, что мне нужно это сделать. Но дайте мне знать, если я ошибаюсь.
Спасибо!
Обновление. Я прочитал много вопросов по вопросам Parse Questions и много раз проверял метод старта (потому что я продолжал думать, что я что-то пропустил после прочтения). Отметьте этот вопрос - сейчас я в той же ситуации.
У меня есть:
1. Внедрение входа в Google+.
2. Получил токен доступа, используя GoogltAuthUtil.
Застрял с:
3. Как связать подписанный в настоящее время пользователь Parse после входа пользователя в Google+?
4. Как создать нового пользователя Parse, если Google+ был первым (и единственным) пользователем выбора входа?
Ответы
Ответ 1
Это похоже на
Как создать учетную запись parse _User из токена Google Android?
Вот мой ответ в этом потоке:
1. Новый пользователь
Поток выглядит следующим образом:
- Пользователь разрешает и получает токен
- Мы создаем нового пользователя со случайным паролем
Вы можете создать ParseUser, используя следующий код внутри метода newChooseAccountIntent()
, который возвращает электронную почту.
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. Возвращаемый пользователь
Это то место, где большинство людей застревают, как я исследовал через Интернет. Поток выглядит следующим образом:
- Пользователь разрешает и приложение получает токен
- Мы передаем этот токен в Cloud Code для проверки. Нам нужно проверить, подписан ли этот токен Google и если он предназначен для нас (android-developers (2013)).
- После того, как вы можете проверить, что токен действителен, вы можете запросить пользователя в облачном коде с помощью метода
Parse.Cloud.useMasterKey()
и вернуть ключ сеанса с помощью метода getSessionToken()
в результате запроса.
- Используйте ключ сеанса для сохранения состояния входа на диск, вызывая метод
becomeInBackground
Чтобы проверить токен, вы можете отправить Parse.Cloud.httprequest
в эту конечную точку: https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=
. Это указано в Документация по идентификационной информации Google. Вы получите следующие данные:
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"email": "[email protected]",
"at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
"email_verified": "true",
"aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"iat": "1433978353",
"exp": "1433981953"
}
Необходимо сравнить "aud", "azp" и "email", которые переводится как аудитория, авторизованная сторона и электронная почта.
Запрос текущего пользователя в облачном коде:
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
});
Примечание.. Удостоверьтесь, что у вас есть следующая область действия, чтобы сообщение появлялось при проверке Cloud Code: https://www.googleapis.com/auth/plus.profile.emails.read
Ответ 2
Есть вопрос об этом на вопросах Parse. Это прямо здесь, и я уверен, что он отвечает на ваши вопросы.
https://parse.com/questions/google-plus
Он ссылается на блог синтаксического анализа, который имеет некоторые обходные пути.
В нем говорится, что вы можете добавить любой логин в ParseUser. Вы бы делали что-то вроде этого:
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.
});
Еще один сайт, на котором вы должны посмотреть:
https://parse.com/tutorials/adding-third-party-authentication-to-your-web-app
Этот последний является официальным и имеет пример кода
Ответ 3
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.
}
}
});
}
Ответ 4
Для этого я использовал следующий код
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");
}
}
});
Дайте мне знать, если это поможет или вы использовали что-то еще.
Ответ 5
Попробуйте это
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.
}
}
})