web-dev-qa-db-ja.com

AndroidのParseバックエンドでGoogle+サインインユーザーをリンクするにはどうすればよいですか?

AndroidアプリでParseを3か月使用しています。次に、アプリにメールログインとソーシャルサインオン(FacebookとGoogle+)を追加したいと思います。メールとfbを正常に追加しました。ログインすると、ユーザーはメールまたはFacebookの両方またはいずれかを接続でき、アプリがユーザーを認識します。

例えばメールでログインしてからFacebookに接続し、別のデバイスでアプリを使用し、Facebookでログインすると、アプリは同じユーザーであることがわかり、カスタマイズされてデータが表示されます。そして、電子メールも機能します。

追加しました AndroidのGoogle+サインイン しかし、ユーザーのGoogle+認証情報をログインしたユーザーに接続できません。

Parse Usersテーブルには、Facebook認証データを取得してTwitterを取得するauthDataフィールドがあり、これらのサインオンは両方ともParseSDKに組み込まれています。

Google+のために何をすべきか?データベースの設計と、サインインしたユーザーをGoogle+に接続する方法について混乱していますか?

ユーザーがGoogle+経由でログインした場合はどうなりますか?解析ユーザーを作成し、解析でユーザーを認証するにはどうすればよいですか?

私はクラウドコードとAndroidに慣れており、正しい方向に私をプッシュするだけの何らかのヘルプ/指示を本当にいただければ幸いです。OAuth2を使用したことがなく、メールとソーシャルサインにParseログインを使用したことがありません。オンス、私はそれに入る必要はないと思いますが、私が間違っている場合は私に知らせてください。

ありがとう!

Update:Parse Questionsでたくさんの質問を読み、becomeメソッドを何度もチェックしました(何かが足りないと思っていたため)それを読んだ後)。 この質問を確認してください-私は現在同じ状況にあります

私が持っています:
1。 Google+サインインを実装しました。
2。 GoogltAuthUtilを使用してアクセストークンを取得しました。

立ち往生:
3。ユーザーがGoogle+でサインインした後、現在サインインしているParseユーザーをリンクするにはどうすればよいですか?
4。 Google+がユーザーの最初の(そして唯一の)ログイン選択であった場合、新しい解析ユーザーを作成するにはどうすればよいですか?

22
Rahul Sainani

これは Android Googleトークン? から解析_ユーザーアカウントを作成する方法)と似ているようです

以下はそのスレッドでの私の答えです:


1.新規ユーザー

フローは以下のとおりです。

  1. ユーザーが承認し、トークンが取得されます
  2. ランダムなパスワードで新しいユーザーを作成します

電子メールを返すnewChooseAccountIntent()メソッド内で次のコードを使用して、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.リピーター

私がインターネットで調べたとき、これはほとんどの人が立ち往生した場所です。フローは以下のとおりです。

  1. ユーザーが承認し、アプリがトークンを取得します
  2. このトークンをクラウドコードに渡して検証します。このトークンがGoogleによって署名されているかどうか、およびそれが私たちのためのものであるかどうかを確認する必要があります( Android-developers (2013))。
  3. トークンが有効であることを確認した後、Parse.Cloud.useMasterKey()メソッドを使用してクラウドコードでユーザーをクエリし、クエリ結果でgetSessionToken()メソッドを使用してセッションキーを返すことができます。
  4. セッションキーを使用して、becomeInBackgroundメソッドを呼び出してログイン状態をディスクに保存します

トークンを検証するには、_Parse.Cloud.httprequest_をこのエンドポイントに送信します:_https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=_。これは Google Identity Documentation で説明されています。以下のようなデータを受け取ります。

_{
 "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
});
_

注:クラウドコードを確認したときにメールが表示されるように、次のスコープがあることを確認してください:_https://www.googleapis.com/auth/plus.profile.emails.read_

7
Ralphilius

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
cristianorbs
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.
                }
            }
        });
    }
1
Arun Shankar

そうするために、私は次のコードを使用しました

  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");
                        }
                    }
                });

それが役立つかどうか、または何か他のものを使用したことがあるかどうかを教えてください。

1
Akshay

これを試して

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.
                 }
}

})

0
Aditya