Неавторизованная регистрация с использованием инструмента 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);
}
});
});
}