Отображение пользователю объявления при входе#

Можно настроить, чтобы при входе Blitz Identity Provider показал пользователю объявление. При этом пользователю могут быть показаны одна или две кнопки, а выбор пользователя можно будет проанализировать в процедуре входа.

Процедура#

Процедура InfoPipe позволяет с периодичностью в 30 дней показывать пользователю при входе объявления. Перед использованием нужно выполнить следующие изменения:

  • в функции requiredNews() скорректировать критерии отображения объявления – например, в примере настроено, что показывать раз в 30 дней в случае если в прошлый раз пользователь при показе объявления нажал кнопку отказа;

  • в константе DOMAIN указать URI, по которому из браузера пользователя доступен Blitz Identity Provider;

  • настроить в конфигурационном файле тип уведомления;

  • настроить в сообщениях текст уведомления и названия кнопок.

public class InfoPipe implements Strategy {

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

    @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(Context ctx) {
        if (ctx.user() == null || ctx.user().requiredFactor() == null ||
            ctx.user().requiredFactor().equals(ctx.justCompletedFactor()))
            if (requiredNews("user_agreement", ctx)) return showNews("user_agreement", ctx);
            else return StrategyState.ENOUGH();
        else
            return StrategyState.MORE(new String[] {});
    }

    private boolean requiredNews(final String pipeId, final Context ctx) {
        Long readOn = ctx.user().userProps().numProp("pipes.info." + pipeId + ".disagreedOn");
        return (readOn == null || Instant.now().getEpochSecond() - readOn > 30*86400);
    }

    private StrategyState showNews(final String pipeId, final Context ctx) {
        String uri = "https://" + DOMAIN + "/blitz/pipes/info/start?&pipeId=" + pipeId + "&appId=_blitz_profile";
        Set<String> claims = new HashSet<String>(){{
            add("instanceId");
        }};
        Set<String> scopes = new HashSet<String>(){{
            add("openid");
       }};
       return StrategyState.ENOUGH_BUILDER()
         .withPipe(uri, "<CLIENT_ID>", scopes, claims)
         .build();
    }
}

Добавление процедуры в blitz.conf#

В конфигурационном файле blitz.conf добавьте раздел blitz.prod.local.idp.built-in-pipes, в котором назначьте вспомогательному приложению с типом info идентификатор id, определенный в процедуре, и тип объявления type. Возможны следующие типы объявлений:

  • news – отображается одна кнопка,

  • agreement – отображается две кнопки.

Пример конфигурации двух вспомогательных приложений info с идентификаторами alarm и user_agreement:

"built-in-pipes": {
    "choice": [],
    "info": [
        {
            "id": "alarm",
            "type": "news",
            "userReadAttr": "userInformed"
        },
        {
            "id": "user_agreement",
            "type": "agreement"
        }
    ]
}