在JWT用户映射期间创建Gentics网格用户配置文件节点-导致失败

问题描述 投票:1回答:1

我正在使用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);
    }
});
java rx-java gentics-mesh
1个回答
1
投票

您的令牌是否包含令牌ID? (jti或iat)。 Mesh将使用这些值之一来确定是否需要为令牌重新运行键映射。这背后的想法是避免对未更改的令牌进行伪映射调用。我怀疑您的令牌没有通过此检查,并且将始终传递给mapper插件。

如果我能看到一些日志,我也许能够为您提供更多提示。

© www.soinside.com 2019 - 2024. All rights reserved.