Неавторизованная регистрация с использованием инструмента webpush-java CLI

Я смотрю на код webpush-java.

Я пытался отправить уведомление с помощью инструментов CLI

java -jar build/libs/web-push-3.1.0-all.jar send-notification, etc.. etc..

... но это вызывает HTTP/1.1 400 UnauthorizedRegistration. Что может вызвать это?

ОБНОВЛЕНИЕ: я повторил уведомление об отправке с новыми ключами и подпиской... и на этот раз я заметил дальнейшую диагностику ошибок: -

SLF4J: Не удалось загрузить класс "org.slf4j.impl.StaticLoggerBinder". SLF4J: По умолчанию используется логгер без операций (NOP). SLF4J: Для получения дополнительной информации см. http://www.slf4j.org/codes.html. HTTP/1.1 400 UnauthorizedRegistration [Тип контента: текст /html; charset=UTF-8, дата: пт, 16 марта 2018 г. 10:02:46 по Гринвичу, истекает: пт, 16 марта 2018 г. 10:02:46 мск, контроль кэша: частный, max-age=0, X-Content- Опции типа: nosniff, X-Frame-Options: SAMEORIGIN, X-XSS-Protection: 1; режим = блок, сервер: GSE, Alt-Svc: hq=":443"; ма =2592000; Quic=51303431; Quic=51303339; Quic=51303335, Quic=":443"; ма =2592000; v="41,39,35", диапазоны принятия: нет, изменяется: кодирование принятия, кодирование передачи: чанковано] [чанковано: ложно]

1 ответ

Решение

Автор библиотеки здесь. Как упомянул @collimarco, возможно, что-то пошло не так с генерацией или кодированием ключей. Вы используете последнюю версию библиотеки? Как вы сгенерировали ключи? Вы скопировали открытый ключ в свое веб-приложение?

Возможно, вы также захотите взглянуть на проект spring-boot-web-push, где я интегрирую библиотеку web-push в чистое приложение Spring Boot. README объясняет в пяти шагах, как запустить приложение, и оно должно просто работать (™).

В частности, SendController.java показывает, как отправить уведомление:

public class SendController {
    private static final String PUBLIC_KEY = "BAPGG2IY3Vn48d_H8QNuVLRErkBI0L7oDOOCAMUBqYMTMTzukaIAuB5OOcmkdeRICcyQocEwD-oxVc81YXXZPRY";
    private static final String PRIVATE_KEY = "A7xDGuxMZ4ufflcAhBW23xpoWZNOLwM4Rw2wXjP0y6M";
    private static final String SUBJECT = "Foobarbaz";
    private static final String PAYLOAD = "My fancy message";

    @RequestMapping("/send")
    public String send(@RequestParam("subscriptionJson") String subscriptionJson) {
        Security.addProvider(new BouncyCastleProvider());

        try {
            PushService pushService = new PushService(PUBLIC_KEY, PRIVATE_KEY, SUBJECT);
            Subscription subscription = new Gson().fromJson(subscriptionJson, Subscription.class);
            Notification notification = new Notification(subscription, PAYLOAD);
            HttpResponse httpResponse = pushService.send(notification);
            int statusCode = httpResponse.getStatusLine().getStatusCode();

            return String.valueOf(statusCode);
        } catch (Exception e) {
            return ExceptionUtils.getStackTrace(e);
        }
    }
}

и push.js показывает, как зарегистрировать подписку:

function subscribe() {
    const publicKey = base64UrlToUint8Array('BAPGG2IY3Vn48d_H8QNuVLRErkBI0L7oDOOCAMUBqYMTMTzukaIAuB5OOcmkdeRICcyQocEwD-oxVc81YXXZPRY');

    navigator.serviceWorker.ready.then(function (serviceWorkerRegistration) {
        serviceWorkerRegistration.pushManager.subscribe({
            userVisibleOnly: true,
            applicationServerKey: publicKey
        })
        .then(function (subscription) {
            return sendSubscriptionToServer(subscription);
        })
        .catch(function (e) {
            if (Notification.permission === 'denied') {
                console.warn('Permission for Notifications was denied');
            } else {
                console.error('Unable to subscribe to push.', e);
            }
        });
    });
}
Другие вопросы по тегам