Получение геоданных пользователя#

Процедуру входа можно использовать для получения данных о стране и городе, в которых находится пользователь, и на основании этого гибко настраивать правила входа, например, вводить запрет на вход из-за рубежа, активировать второй фактор аутентификации и др.

Для этого в процедурах входа используйте следующие классы и методы:

  1. Класс LGeoData c функциями getCountry() и getCity().

    public class LGeoData {
        /**
        *  Get IP address country
        *
        * @return - country or null if country not specified.
        */
        public final String getCountry();
    
        /**
        *  Get IP address city
        *
        * @return - city or null if city not specified.
        */
    
        public final String getCity();
    }
    
  2. Метод geoData() в Context.

    /**
     * Get geo data of user IP address
     *
     * @return - geo data.
     */
     LGeoData geoData();
    

    Важно

    Для работы метода необходимо импортировать класс LGeoData.

    import com.identityblitz.idp.login.authn.flow.LGeoData
    
Пример кода, который выводит в лог страну и город пользователя#
import com.identityblitz.idp.login.authn.flow.LGeoData;

LGeoData geoData = _ctx.geoData();
String country = geoData.getCountry();
logger.trace("IP location: country - {}, city - {}, factor - {}", country , geoData.getCity());
Пример процедуры, включающей 2FA для определенных стран#
package com.identityblitz.idp.flow.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 org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import com.identityblitz.idp.login.authn.flow.api.*;
import com.identityblitz.idp.login.authn.flow.Context;
import com.identityblitz.idp.login.authn.flow.Strategy;
import com.identityblitz.idp.login.authn.flow.StrategyState;
import com.identityblitz.idp.login.authn.flow.StrategyBeginState;
import com.identityblitz.idp.login.authn.flow.LCookie;
import com.identityblitz.idp.login.authn.flow.LUserAgent;
import com.identityblitz.idp.login.authn.flow.LBrowser;
import com.identityblitz.idp.login.authn.flow.LGeoData;
import com.identityblitz.idp.federation.matching.JsObj;
import com.identityblitz.idp.flow.common.api.*;
import com.identityblitz.idp.flow.dynamic.*;
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.lang.invoke.LambdaMetafactory;
import java.util.function.Consumer;
import static com.identityblitz.idp.login.authn.flow.StrategyState.*;

public class EnableSecondFactorByCountry implements Strategy {

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

    @Override public StrategyBeginState begin(final Context ctx) {
        if ("login".equals(ctx.prompt())){
            List<String> methods = new ArrayList<String>(Arrays.asList(ctx.availableMethods()));
            methods.remove("cls");
            return StrategyState.MORE(methods.toArray(new String[0]), true);
        } else {
            if(ctx.claims("subjectId") != null)
                return StrategyState.ENOUGH();
            else
                return StrategyState.MORE(new String[]{});
        }
    }

    @Override public StrategyState next(final Context ctx) {
        Integer reqFactor = (ctx.user() == null) ? null : ctx.user().requiredFactor();
        LGeoData geoData = ctx.geoData();
        String country = geoData.getCountry();
        logger.info("IP location: country - {}, city - {}, factor - {}", country , geoData.getCity());
        if(ctx.justCompletedFactor() == 1 && (country == null || !country.equals("Russia")))
            return StrategyState.MORE(new String[]{});
        else
            return StrategyState.ENOUGH();
    }
}