添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
曾深爱过的葡萄  ·  暗部资源共享 - 百度·  12 月前    · 
果断的乌冬面  ·  Oracle ...·  1 年前    · 
咆哮的勺子  ·  Access limited - ...·  2 年前    · 
Latest editor's draft:
https://w3c.github.io/push-api/
History:
https://www.w3.org/standards/history/push-api/ Commit history Bryan Sullivan ( AT&T ) - Until Eduardo Fullea ( Telefonica ) - Until Michaël van Ouwerkerk ( Google ) - Until
Feedback:
GitHub w3c/push-api ( pull requests , new issue , open issues ) The Push API enables sending of a push message to a web application via a push service . An application server can send a push message at any time, even when a web application or user agent is inactive. The push service ensures reliable and efficient delivery to the user agent . Push messages are delivered to a Service Worker that runs in the origin of the web application, which can use the information in the message to update local state or display a notification to the user. This specification is designed for use with the web push protocol , which describes how an application server or user agent interacts with a push service .

Status of This Document

This section describes the status of this document at the time of its publication. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.

This document was published by the Web Applications Working Group as a Working Draft using the Recommendation track .

Publication as a Working Draft does not imply endorsement by W3C and its Members.

This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress. This document was produced by a group operating under the W3C Patent Policy . W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy . This document is governed by the 03 November 2023 W3C Process Document .

Introduction

This section is non-normative.

The Push API allows a web application to communicate with a
user agent asynchronously. This allows an application server to provide the user agent with time-sensitive information whenever that information becomes known, rather than waiting for a user to open the web application. As defined here, push services support delivery of push messages at any time. In particular, a push message will be delivered to the web application even if that web application is not currently active in a browser window: this relates to use cases in which the user may close the web application, but still benefits from the web application being able to be restarted when a push message is received. For example, a push message might be used to inform the user of an incoming WebRTC call. A push message can also be sent when the user agent is temporarily offline. In support of this, the push service stores messages for the user agent until the user agent becomes available. This supports use cases where a web application learns of changes that occur while a user is offline and ensures that the user agent can be provided with relevant information in a timely fashion. Push messages are stored by the push service until the user agent becomes reachable and the message can be delivered. The Push API will also ensure reliable delivery of push messages while a user agent is actively using a web application, for instance if a user is actively using the web application or the web application is in active communication with an application server through an active worker, frame, or background window. This is not the primary use case for the Push API. A web application might choose to use the Push API for infrequent messages to avoid having to maintain constant communications with the application server . Push messaging is best suited to occasions where there is not already an active communications channel established between the user agent and the web application. Sending push messages requires considerably more resources when compared with more direct methods of communication such as the Fetch API or [ WebSockets ]. Push messages usually have higher latency than direct communications and they can also be subject to restrictions on use. Most push services limit the size and quantity of push messages that can be sent. Dependencies The web push protocol [ RFC8030 ] describes a protocol that enables communication between a user agent or application server and a push service . Alternative protocols could be used in place of this protocol, but this specification assumes the use of this protocol; alternative protocols are expected to provide compatible semantics. The Content-Encoding HTTP header, described in Section 3.1.2.2 of [ RFC7231 ], indicates the content coding applied to the payload of a push message . Concepts Application server The term application server refers to server-side components of a web application. Push message A push message is data sent to a web application from an application server . A push message is delivered to the active worker associated with the push subscription to which the message was submitted. If the service worker is not currently running, the worker is started to enable delivery. Push subscription A push subscription is a message delivery context established between the user agent and the push service on behalf of a web application. Each push subscription is associated with a service worker registration and a service worker registration has at most one push subscription . A push subscription has an associated push endpoint . It MUST be the absolute URL exposed by the push service where the application server can send push messages to. A push endpoint MUST uniquely identify the push subscription . A push subscription MAY have an associated subscription expiration time . When set, it MUST be the time, in milliseconds since 00:00:00 UTC on 1 January 1970, at which the subscription will be deactivated . The user agent SHOULD attempt to refresh the push subscription before the subscription expires. A push subscription has internal slots for a P-256 ECDH key pair and an authentication secret in accordance with [ RFC8291 ]. These slots MUST be populated when creating the push subscription . If the user agent has to change the keys for any reason, it MUST fire the " pushsubscriptionchange " event with the service worker registration associated with the push subscription as registration , a PushSubscription instance representing the push subscription having the old keys as oldSubscription and a PushSubscription instance representing the push subscription having the new keys as newSubscription . To create a push subscription , given an PushSubscriptionOptionsInit optionsDictionary :
  • Let subscription be a new PushSubscription .
  • Let options be a newly created PushSubscriptionOptions object, initializing its attributes with the corresponding members and values of optionsDictionary .
  • Set subscription 's options attribute to options .
  • Generate a new P-256 ECDH key pair [ ANSI-X9-62 ]. Store the private key in an internal slot on subscription ; this value MUST NOT be made available to applications. The public key is also stored in an internal slot and can be retrieved by calling the getKey () method of the PushSubscription with an argument of " p256dh ".
  • Generate a new authentication secret, which is a sequence of octets as defined in [ RFC8291 ]. Store the authentication secret in an internal slot on subscription . This key can be retrieved by calling the getKey () method of the PushSubscription with an argument of " auth ".
  • Request a new push subscription . Include the applicationServerKey attribute of options when it has been set. Rethrow any exceptions .
  • When the push subscription request has completed successfully:
  • Set subscription 's endpoint attribute to the push subscription 's push endpoint .
  • If provided by the push subscription , set subscription 's expirationTime .
  • Return subscription .

    3.3.1 Subscription Refreshes A user agent or push service MAY choose to refresh a push subscription at any time, for example because it has reached a certain age. When this happens, the user agent MUST run the steps to create a push subscription given the PushSubscriptionOptions that were provided for creating the current push subscription . The new push subscription MUST have a key pair that's different from the original subscription. When successful, user agent then MUST fire the " pushsubscriptionchange " event with the service worker registration associated with the push subscription as registration , a PushSubscription instance representing the initial push subscription as oldSubscription and a PushSubscription instance representing the new push subscription as newSubscription . To allow for time to propagate changes to application servers , a user agent MAY continue to accept messages for an old push subscription for a brief time after a refresh. Once messages have been received for a refreshed push subscription , any old push subscriptions MUST be deactivated . If the user agent is not able to refresh the push subscription , it SHOULD periodically retry the refresh. When the push subscription can no longer be used, for example because it has expired, the user agent MUST fire the " pushsubscriptionchange " event with the service worker registration associated with the push subscription as registration , a PushSubscription instance representing the deactivating push subscription as oldSubscription and null as the newSubscription .

    3.3.2 Subscription Deactivation When a push subscription is deactivated , both the user agent and the push service MUST delete any stored copies of its details. Subsequent push messages for this push subscription MUST NOT be delivered. A push subscription is deactivated when its associated service worker registration is unregistered, though a push subscription MAY be deactivated earlier. A push subscription is removed when service worker registration is cleared. Push service The term push service refers to a system that allows application servers to send push messages to a web application. A push service serves the push endpoint or endpoints for the push subscriptions it serves. The user agent connects to the push service used to create push subscriptions . User agents MAY limit the choice of push services available. Reasons for doing so include performance-related concerns such as service availability (including whether services are blocked by firewalls in specific countries, or networks at workplaces and the like), reliability, impact on battery lifetime, and agreements to steer metadata to, or away from, specific push services . Permission The Push API is a powerful feature identified by the name "push" . For integration with the Permissions specification, this specification defines the PushPermissionDescriptor permission descriptor type .
    WebIDL
    
    
    
    
        
    dictionary PushPermissionDescriptor : PermissionDescriptor {
      boolean userVisibleOnly = false;
              The userVisibleOnly has the same semantics as
              userVisibleOnly.
              {name: "push", userVisibleOnly: false} is stronger than
              {name: "push", userVisibleOnly: true}.
            Security and privacy considerations
            The contents of a push message are encrypted [RFC8291]. However, the push
            service is still exposed to the metadata of messages sent by an application
            server to a user agent over a push subscription. This includes the
            timing, frequency and size of messages. Other than changing push services, which
            user agents may disallow, the only known mitigation is to increase the apparent message
            size by padding.
            There is no guarantee that a push message was sent by an application server
            having the same origin as the web application. The application server is able to
            share the details necessary to use a push subscription with a third party at its own
            discretion.
            The following requirements are intended to protect the privacy and security of the user as
            far as possible, and subject to meeting that goal, to protect the integrity of the
            application server's communication with the user.
            User agents MUST NOT provide Push API access to web applications without the
            express permission of the user. User agents MUST acquire consent for
            permission through a user interface for each call to the subscribe() method, unless a
            previous permission grant has been persisted, or a prearranged trust relationship applies.
            Permissions that are preserved beyond the current browsing session MUST be revocable.
            The Push API may have to wake up the Service Worker associated with the service worker
            registration in order to run the developer-provided event handlers. This can cause
            resource usage, such as network traffic, that the user agent SHOULD attribute to the
            web application that created the push subscription.
            The user agent MAY consider the PushSubscriptionOptions when acquiring
            permission or determining the permission status.
            When a permission is revoked, the user agent MAY fire the
            "pushsubscriptionchange" event for subscriptions created with that permission, with
            the service worker registration associated with the push subscription as
            registration, a PushSubscription instance representing the push subscription
            as oldSubscription, and null as newSubscription. The user agent MUST
            deactivate the affected subscriptions in parallel.
            When a service worker registration is unregistered, any associated push
            subscription MUST be deactivated.
            The push endpoint MUST NOT expose information about the user to be derived by actors
            other than the push service, such as the user's device, identity or location. See
            the Privacy Considerations in [RFC8030] for the exact requirements.
            The push endpoint of a deactivated push subscription MUST NOT be
            reused for a new push subscription. This prevents the creation of a persistent
            identifier that the user cannot remove. This also prevents reuse of the details of one
            push subscription to send push messages to another push subscription.
            User agents MUST implement the Push API to only be available in a secure context. This provides better protection for the user against man-in-the-middle attacks
            intended to obtain push subscription data. Browsers may ignore this rule for development
            purposes only.
            Push Framework
          
    
    
    
    
        
    

    This section is non-normative.

    A push message is sent from an application server to a web application as follows:
  • the application server requests that the push service deliver a push message using the [ RFC8030 ]. This request uses the push endpoint included in the push subscription ;
  • the push service delivers the message to a specific user agent , identifying the push endpoint in the message;
  • the user agent identifies the intended Service Worker and activates it as necessary, and delivers the push message to the Service Worker . This overall framework allows application servers to activate a Service Worker in response to events at the application server . Information about those events can be included in the push message , which allows the web application to react appropriately to those events, potentially without needing to initiate network requests. The following code and diagram illustrate a hypothetical use of the push API. Example
  • This section is non-normative.

    Example 1
    // https://example.com/serviceworker.js
    this.onpush = event => {
      console.log(event.data);
      // From here we can write the data to IndexedDB, send it to any open
      // windows, display a notification, etc.
    // https://example.com/webapp.js
    // inside an async function...
    try {
      const serviceWorkerRegistration = await navigator.serviceWorker.register(
        "serviceworker.js"
      const pushSubscription = await serviceWorkerRegistration.pushManager.subscribe();
      // The push subscription details needed by the application
      // server are now available, and can be sent to it using,
      // for example, an XMLHttpRequest.
      console.log(pushSubscription.endpoint);
      console.log(pushSubscription.getKey("p256dh"));
      console.log(pushSubscription.getKey("auth"));
    } catch (err) {
      // In a production environment it might make sense to
      // also report information about errors back to the
      // application server.
      console.log(error);
              Sequence diagram
            

    This section is non-normative.

    The fields included in the
    PushSubscription is all the information needed for an application server to send a push message. Push services that are compatible with the Push API provide a push endpoint that conforms to the web push protocol. These parameters and attributes include:
  • The push endpoint of a PushSubscription is a URL that allows an application server to request delivery of a push message to a web application.
  • The getKey() method on a PushSubscription is used to retrieve keying material used to encrypt and authenticate push messages. Each invocation of the function returns a new ArrayBuffer that contains the value of the corresponding key, or null if the identified key doesn't exist. Passing a value of "p256dh" retrieves a elliptic curve Diffie-Hellman (ECDH) public key associated with the push subscription. Passing a value of auth returns an authentication secret that an application server uses in authentication of its messages. These keys are used by the application server to encrypt and authenticate messages for the push subscription, as described in [RFC8291]. The Service Worker specification defines a ServiceWorkerRegistration interface [SERVICE-WORKERS], which this specification extends.
    WebIDL[SecureContext]
    partial interface ServiceWorkerRegistration {
      readonly attribute PushManager pushManager;
            The pushManager attribute exposes a PushManager, which has an associated
            service worker registration represented by the ServiceWorkerRegistration on
            which the attribute is exposed.
            PushManager interface
            The PushManager interface defines the operations to access push services.
          
    WebIDL[Exposed=(Window,Worker), SecureContext]
    interface PushManager {
      [SameObject] static readonly attribute FrozenArray<DOMString> supportedContentEncodings;
      Promise<PushSubscription> subscribe(optional PushSubscriptionOptionsInit options = {});
      Promise<PushSubscription?>
    
    
    
    
        
     getSubscription();
      Promise<PermissionState> permissionState(optional PushSubscriptionOptionsInit options = {});
            The supportedContentEncodings attribute exposes the sequence of supported
            content codings that can be used to encrypt the payload of a push message. A content
            coding is indicated using the Content-Encoding header field when requesting the
            sending of a push message from the push service.
            User agents MUST support the aes128gcm content coding defined in [RFC8291], and
            MAY support content codings defined in previous versions of the draft for compatibility
            reasons.
            subscribe() method
            The subscribe() method when invoked MUST run the following steps:
            
  • Let promise be a new promise.
  • Let global be this' relevant global object.
  • Return promise and continue in parallel.
    Note: Validation order can vary across user agents
  •