gpt4 book ai didi

android - Couchbase facebook 拉验证器

转载 作者:搜寻专家 更新时间:2023-11-01 08:39:29 26 4
gpt4 key购买 nike

我正在为一个应用程序使用 couchbase mobile,我想使用 facebook 进行身份验证。根据文档,couchbase 提供了它自己的身份验证实现,唯一需要的是我从 android facebook 登录流程中检索到的 token 。

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

不会从服务器复制/拉取任何内容。但是,如果我不设置身份验证器,一切都会被拉走。是我做错了什么吗?我真的需要使用身份验证器来防止某些文档不会被未经身份验证的用户复制。

注意! token 很好,就像我正在查看同步网关管理员的用户部分一样,我可以看到我传递给 couchbase facebook 身份验证器的已登录用户 token 的正确个人资料 ID。

最佳答案

在您提供的 Sync Gateway 配置中,Sync Function 是 function(doc, oldDoc) {channel(doc.channels);} 这意味着如果 Sync Gateway 处理的文档包含一个字符串(s) 在 channels 字段下,文档将映射到此/这些 channel 。让我们假设以下配置文件:

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

如果 channel 字段不存在,那么文档将被映射到名为undefined 的 channel 。但是 GUEST 帐户可以访问 * channel (代表所有 channel 的占位符)。因此,所有未经身份验证的复制都将提取所有文档。现在让我们介绍配置文件中的 facebook 登录字段。这一次,使用 facebook token 进行身份验证的复制代表一个新用户,默认情况下只能访问 ! channel (观看此截屏视频以了解 ! channel ,也就是公众 channel https://www.youtube.com/watch?v=DKmb5mj9pMI )。要授予用户访问其他 channel 的权限,您必须在同步函数中使用访问 API 调用(阅读有关所有同步函数 API 调用的更多信息 here)。

在facebook认证的情况下,使用用户的facebook ID来表示用户名。假设文档有一个保存用户 facebook ID 的属性 (user_id: FACEBOOK_ID),您可以将文档映射到一个 channel 并授予用户访问权限。新的同步功能看起来像这样:

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

您可以使用 Facebook Android SDK 检索用户的 Facebook ID 并保存在文档字段中。

关于android - Couchbase facebook 拉验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34130610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com