Вычисление имени внешней учетной записи#

В процедуре связывания можно при каждом входе через внешнего поставщика вычислять имя внешней учетной записи и обновлять соответствующий параметр в базе данных. Для этого используется функция updateFederatedAccountName.

Пример использования в процедуре:

package com.identityblitz.idp.federation.matching.dynamic;

import java.lang.*;
import java.util.*;
import java.text.*;
import java.time.*;
import java.math.*;
import java.security.*;
import javax.crypto.*;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import com.identityblitz.idp.federation.*;
import com.identityblitz.idp.federation.matching.*;
import com.identityblitz.idp.flow.common.api.*;
import com.identityblitz.idp.flow.common.model.*;
import com.identityblitz.idp.federation.matching.dynamic.*;
import java.util.function.Consumer;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import com.identityblitz.idp.extensions.types.JsObject;

import com.identityblitz.idp.federation.matching.*;
import com.identityblitz.idp.flow.common.api.HttpFactory;

public class Esia_1Esia extends MatchingBlock {

  private final Logger logger = LoggerFactory.getLogger("com.identityblitz.idp.federation.matching.dynamic");

  @Override public MatchResult match(MatchingContext ctx, List<MatchingUser> users){

    if (ctx.iteration() == 1) {
      //return matchError(ctx, new MatchingError("bad_err_code","bad_err_msg"));
      return tryToSearch(ctx);
    }

    if (users.isEmpty()) {
      return matchError(ctx, new MatchingError("error","error"));
    }

    if (users.size() == 1) {
      return matched(ctx, users.get(0));
    }

    return refine(ctx, users, ctx.extAttrs());
  };

  private MatchResult tryToSearch(MatchingContext ctx) {
    return find(ctx, filter().eq("uid", "test@test.ru"));
  }

  @Override public Tuple2<JsObj, Set<String>> update(JsObj extAttrs, MatchingUser user, Boolean justMatched, HttpFactory httpFactory){
    return change(JsObj.empty(), Collections.<String>emptySet());
  };

  @Override  public boolean isAllowMultiBind() {
    return true;
  }

  @Override public String updateFederatedAccountName(JsObj extAttrs){
    if (extAttrs.contains("firstName") && extAttrs.contains("lastName")){
      String name = extAttrs.asString("firstName") + " " + extAttrs.asString("lastName");
      if (extAttrs.contains("middleName")) {
        name = name + " " + extAttrs.asString("middleName");
      }
      return name;
   } else {
     // don't update federated account name
     return super.updateFederatedAccountName(extAttrs);
   }
  };
}