我正在使用JWT解析的身份验证插件,以获取详细信息并更新Mesh中的用户。我还想使用user.setNodeReference()
//创建一个新节点并将其附加到Mesh中的User上,这是我如何将User关联到节点上?
问题是,当我返回映射结果时,如果创建用户配置文件节点,则会看到mapToken()
方法再次使用与以前相同的标记被调用,就像它正在循环一样。 我发现这是由于路由器中的“重试”功能造成的
如果我不将节点附加到user.nodeReference()
,则它将按预期进行。
想法?
@Override
public MappingResult mapToken(HttpServerRequest req, String uuid, JsonObject token) {
MappingResult result = new MappingResult();
if (uuid == null) {
log.info("First time login of the user");
} else {
log.info("Already synced user is logging in.");
}
log.info("Mapping user in plugin");
printToken(token);
String username = extractUsername(token).get();
UserUpdateRequest user = new UserUpdateRequest();
user.setUsername(username);
user.setEmailAddress(username);
user.setFirstname(token.getString("firstname", "firstname"));
user.setLastname(token.getString("lastname", "lastname"));
// TODO: Stop the infinite loop
if (uuid == null) {
log.info("Creating profile node");
user.setNodeReference(createProfileNode(username, token));
} else {
log.info("Updating profile node");
//updateProfileNode(uuid, token);
}
result.setUser(user);
...
}
private ExpandableNode createProfileNode(String username, JsonObject token) {
NodeCreateRequest nodeCreateRequest = new NodeCreateRequest()
.setLanguage("en")
.setSchemaName(getConfig().getProfileSchema())
.setParentNodeUuid(getConfig().getProfileParentUuid());
FieldMap fields = nodeCreateRequest.getFields();
fields.putString("name", username);
fillProfileFieldMappedValues(fields, token);
nodeCreateRequest.setFields(fields);
return this.adminClient.createNode(getConfig().getProjectName(), nodeCreateRequest).blockingGet();
}
更新
我检查了jti和iat-令牌包含两者。我以为也许如果我订阅USER_CREATED事件,可以在创建用户之后添加一个配置文件节点。但是我看不到这个曾经执行过。我可能错误地订阅了本地事件总线。
getRxVertx().eventBus().localConsumer(MeshEvent.USER_CREATED.getAddress()).handler((message) -> {
try {
String uuid = JsonUtil.getMapper().readTree(message.body().toString()).get("uuid").asText();
adminClient().findUserByUuid(uuid).toSingle().doAfterSuccess(u -> {
u.setNodeReference(createProfileNode(u.getUuid()).getBody());
}).doOnError(e -> {
log.error("Failed to create user profile node: {}", e);
});
} catch (IOException e) {
log.error("Failed to deserialize user: {}", e);
}
});
您的令牌是否包含令牌ID? (jti或iat)。 Mesh将使用这些值之一来确定是否需要为令牌重新运行键映射。这背后的想法是避免对未更改的令牌进行伪映射调用。我怀疑您的令牌没有通过此检查,并且将始终传递给mapper插件。
如果我能看到一些日志,我也许能够为您提供更多提示。