2

アプリケーションにcouchbase mobileを使用しており、認証にfacebookを使用したいと考えています。ドキュメントによると、couchbase は認証のための独自の実装を提供します。必要なのは、android facebook ログイン フローから取得したトークンのみです。

Synchronize クラスのコードは次のようになります。

public class Synchronize {

public Replication pullReplication;
public Replication pushReplication;

public static class Builder {
    public Replication pullReplication;
    public Replication pushReplication;

    public Builder(Database database, String url, Boolean continuousPull) {

        if (pullReplication == null && pushReplication == null) {

            URL syncUrl;
            try {
                syncUrl = new URL(url);
            } catch (MalformedURLException e) {
                throw new RuntimeException(e);
            }

            pullReplication = database.createPullReplication(syncUrl);
            pullReplication.setContinuous(true);

            pushReplication = database.createPushReplication(syncUrl);
            pushReplication.setContinuous(true);
        }
    }

    public Builder facebookAuth(String token) {

        if (!TextUtils.isEmpty(token)) {
            Authenticator facebookAuthenticator = AuthenticatorFactory.createFacebookAuthenticator(token);

            pullReplication.setAuthenticator(facebookAuthenticator);
            pushReplication.setAuthenticator(facebookAuthenticator);
        }

        return this;
    }

    public Builder basicAuth(String username, String password) {

        Authenticator basicAuthenticator = AuthenticatorFactory.createBasicAuthenticator(username, password);

        pullReplication.setAuthenticator(basicAuthenticator);
        pushReplication.setAuthenticator(basicAuthenticator);

        return this;
    }

    public Builder addChangeListener(Replication.ChangeListener changeListener) {
        pullReplication.addChangeListener(changeListener);
        pushReplication.addChangeListener(changeListener);

        return this;
    }

    public Synchronize build() {
        return new Synchronize(this);
    }

}

private Synchronize(Builder builder) {
    pullReplication = builder.pullReplication;
    pushReplication = builder.pushReplication;
}

public void start() {
    pullReplication.start();
    pushReplication.start();
}

public void destroyReplications() {
    if (pullReplication != null && pushReplication != null) {
        pullReplication.stop();
        pushReplication.stop();
        pullReplication.deleteCookie("SyncGatewaySession");
        pushReplication.deleteCookie("SyncGatewaySession");
        pullReplication = null;
        pushReplication = null;
    }
}

}

そして、私はそれを次のように使用します:

...
public void startReplicationSync(String facebookAccessToken) {

    if (sync != null) {
        sync.destroyReplications();
    }

    final String url = BuildConfig.URL_HOST + ":" + BuildConfig.URL_PORT + "/" + DATABASE_NAME;
    sync = new Synchronize.Builder(databaseManager.getDatabase(), url, true)
            .facebookAuth(facebookAccessToken)
            .addChangeListener(getReplicationChangeListener())
            .build();
    sync.start();

}
...

私の同期ゲートウェイjson構成ファイル:

{
"interface":":4984",       
"adminInterface":":4985",
"log":["REST"],
"facebook":{
  "register" : true
},
"databases":{               
"sync_gateway":{
"server":"http://localhost:8091",
"bucket":"sync_gateway",
"users": {
    "GUEST": {"disabled": false}
},
"sync":`function(doc) {channel(doc.channels);}`
}
}
}

私も "GUEST": {"disabled": true} で試しましたが、うまくいきませんでした

私の問題は、これを行うと

pullReplication.setAuthenticator(facebookAuthenticator);
pushReplication.setAuthenticator(facebookAuthenticator);

サーバーからレプリケート/プルされるものはありません。ただし、オーセンティケーターを設定しないと、すべてがプルされます。それは私が間違っていることですか?認証されていないユーザーに対して一部のドキュメントが複製されないようにするために、オーセンティケーターを使用する必要があります。

ノート!同期ゲートウェイ管理者のユーザー セクションを見ているように、トークンは適切です。couchbase facebook 認証システムに渡したログイン ユーザー トークンの正しいプロファイル ID を確認できます。

4

1 に答える 1

3

あなたが提供した同期ゲートウェイ構成では、同期機能は、function(doc, oldDoc) {channel(doc.channels);}同期ゲートウェイによって処理されたドキュメントにフィールドの下の文字列が含まれている場合、ドキュメントchannelsがこの/これらのチャネルにマップされることを意味します。次の設定ファイルがあるとします。

{
  "log": ["CRUD"],
  "databases": {
    "db": {
      "server": "walrus:",
      "users": {
        "GUEST": {"disabled": false, "admin_channels": ["*"]}
      },
      "sync": `
        function sync(doc, oldDoc) {
          channel(doc.channels);
        }
      `
    }
  }
}

チャネル フィールドが存在しない場合、ドキュメントは というチャネルにマップされundefinedます。ただし、GUESTアカウントには * チャネル (すべてのチャネルを表すプレースホルダー) へのアクセス権があります。そのため、認証されていない複製はすべて、すべてのドキュメントをプルします。設定ファイルに facebook ログイン フィールドを導入しましょう。今回は、Facebook トークンで認証された複製は、!デフォルトでチャネルへのアクセス権のみを持つ新しいユーザーを表します (このスクリーンキャストを見て、!チャネル、別名パブリック チャネルを理解してください https://www.youtube.com/watch?v=DKmb5mj9pMI)。ユーザーが他のチャネルにアクセスできるようにするには、同期関数でアクセス API 呼び出しを使用する必要があります (すべての同期関数 API 呼び出しの詳細については、こちらを参照してください)。

Facebook 認証の場合、ユーザーの Facebook ID を使用してユーザー名を表します。ドキュメントにユーザーの facebook ID ( user_id: FACEBOOK_ID) を保持するプロパティがあると仮定すると、ドキュメントをチャネルにマップして、ユーザーにアクセス権を与えることができます。新しい同期関数は次のようになります。

function(doc, oldDoc) {
  channel(doc._id);
  access(doc.user_id, doc._id);
}

Facebook Android SDK を使用してユーザーの Facebook ID を取得し、ドキュメント フィールドに保存できます。

于 2015-12-09T18:28:02.760 に答える