我有用于android的SDK,我尝试为聊天和支持模块设置JWT标识。
我在文档中定义了一个web钩子。起作用了。我在日志中看到,zendesk正在发送我在JwtIdentity中给他的用户令牌,它返回在文档中指定的一个jwt,其中包含名称、电子邮件、jti和iat。
网络钩子的代码:
router.post('/jwt', async (req, res, next) => {
try {
console.log(req.body)
const user_token = req.body.user_token
const user = await usersService.findByTokend(user_token)
if (typeof user === "undefined" || user === null) {
return res.status(404).send('No user found').end()
}
const token = jwt.sign({
name: `${user.lastname} ${user.firstname}`.toLowerCase().trim(),
email: user.email.toLowerCase().trim(),
},
JWT_SECRET,
{
expiresIn: '12h',
jwtid: uuidv4()
})
console.log(token)
return res.status(200).send({
jwt: token
}).end()
} catch (err) {
console.log(err)
next(err)
}
})
在初始化过程中,我的web钩子日志和我的SDK实现中没有什么问题。当我调用该活动并试图对用户进行身份验证时,它失败了。
对于聊天实例,我定义了一个JwtAuthenticator如下:
public class ZendeskJwtAuthenticator implements JwtAuthenticator {
private String user_token;
public void setUserToken(String user_token) {
this.user_token = user_token;
}
@Override
public void getToken(JwtCompletion jwtCompletion) {
try {
OkHttpClient client = new OkHttpClient();
JSONObject jsonBody = new JSONObject();
jsonBody.put("user_token", user_token);
RequestBody requestJsonBody = RequestBody.create(
jsonBody.toString(),
MediaType.parse("application/json")
);
Request postRequest = new Request.Builder()
.url(url)
.post(requestJsonBody)
.build();
client.newCall(postRequest).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
jwtCompletion.onError();
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
try {
String body = response.body().string();
JsonObject jsonObject = JsonParser.parseString(body).getAsJsonObject();
if (jsonObject.has("jwt")) {
jwtCompletion.onTokenLoaded(jsonObject.get("jwt").getAsString());
} else {
jwtCompletion.onError();
}
} catch (Exception e) {
jwtCompletion.onError();
}
}
});
} catch (Exception exception) {
jwtCompletion.onError();
}
}
}
我称之为集合身份如下:
private void setUserIdentity(String user_token) {
Identity identity = new JwtIdentity(user_token);
ZendeskJwtAuthenticator autenticator = new ZendeskJwtAuthenticator();
autenticator.setUserToken(user_token);
Zendesk.INSTANCE.setIdentity(identity);
Chat.INSTANCE.setIdentity(autenticator);
}
它在init之后被称为:
Zendesk.INSTANCE.init(appContext, zendeskUrl, appId, clientId);
Chat.INSTANCE.init(appContext, chatKey, chatAppId);
Support.INSTANCE.init(Zendesk.INSTANCE);
this.setUserIdentity(options);
在日志中,当我打开聊天时,我有这样的信息:
I/okhttp.OkHttpClient: --> POST https://id.zopim.com/authenticated/web/jwt (318-byte body)
I/ReactNativeJNI: Memory warning (pressure level: TRIM_MEMORY_RUNNING_CRITICAL) received by JS VM, running a GC
I/okhttp.OkHttpClient: <-- 400 https://id.zopim.com/authenticated/web/jwt (2412ms, 63-byte body)
W/JwtLoginDetailsProvider: Error fetching authentication token. There may be an issue with your JWT. Chat will proceed unauthenticated: 400
当我打开帮助中心的时候:
I/okhttp.OkHttpClient: --> GET https://<company>.zendesk.com/hc/api/mobile/fr/article_tree.json?category_ids=§ion_ids=&include=categories%2Csections&limit=5&article_labels=&per_page=1000&sort_by=created_at&sort_order=desc
I/okhttp.OkHttpClient: --> POST https://<company>.zendesk.com/access/sdk/jwt (22-byte body)
I/okhttp.OkHttpClient: <-- 403 https://<company>.zendesk.com/access/sdk/jwt (3350ms, unknown-length body)
I/okhttp.OkHttpClient: <-- 400 Response body was null, failed to auth user. https://<company>.zendesk.com/hc/api/mobile/fr/article_tree.json?category_ids=§ion_ids=&include=categories%2Csections&limit=5&article_labels=&per_page=1000&sort_by=created_at&sort_order=desc (3359ms, 2-byte body)
发布于 2022-04-27 05:38:38
我找到了解决办法,如果有人带着同样的问题到这里来的话。
事实上,我确实有很好的配置和工作。我唯一的错误是我用同一封电子邮件来识别我在应用程序中的客户和我的zendesk管理员.。
就这样。祝你今天愉快。
https://stackoverflow.com/questions/71494215
复制