Отображение пользователю объявления при входе#
Можно настроить, чтобы при входе 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"
}
]
}