小编ppa*_*k10的帖子

使用推送通知订阅对象的“p256dh”或“endpoint”键值作为后端内的标识符是否安全?

当用户通过PushManager.subscribe()创建订阅时,给定applicationServerKey(VAPID 公钥),它会创建一个有效的订阅,其内容可以发送并存储在数据库中。发送到数据库的内容如下所示:

{"endpoint":"https://fcm.googleapis.com/fcm/send/dpH5lCsTSSM:APA91bHqjZxM0VImWWqDRN7U0a3AycjUf4O-byuxb_wJsKRaKvV_iKw56s16ekq6FUqoCF7k2nICUpd8fHPxVTgqLunFeVeB9lLCQZyohyAztTH8ZQL9WCxKpA6dvTG_TUIhQUFq_n",
"keys": {
    "p256dh":"BLQELIDm-6b9Bl07YrEuXJ4BL_YBVQ0dvt9NQGGJxIQidJWHPNa9YrouvcQ9d7_MqzvGS9Alz60SZNCG3qfpk=",
    "auth":"4vQK-SvRAN5eo-8ASlrwA=="
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:推送通知简介

该对象提供了唯一的端点,后端服务器知道在哪里调用以将推送通知发送到并使用相应的 VAPID 私钥进行身份验证。

谷歌表示,该端点的唯一标识符是不透明的,无法从中确定任何个人数据。

标识符是不透明的。作为开发人员,您无法从中确定任何个人数据。此外,它还不稳定,因此不能用于跟踪用户。

按照Surya Sankar的本教程,可以将整个订阅对象发送到服务器并存储在数据库中,以便稍后向关联的浏览器/设备发送推送通知时使用。然而,在将条目记录到数据库之前,它会比较是否已经记录了具有相同内容的条目,以免创建重复项。

@app.route("/api/push-subscriptions", methods=["POST"])
def create_push_subscription():
    json_data = request.get_json()
    subscription = PushSubscription.query.filter_by(
        subscription_json=json_data['subscription_json']
    ).first()
    if subscription is None:
        subscription = PushSubscription(
            subscription_json=json_data['subscription_json']
        )
        db.session.add(subscription)
        db.session.commit()
    return jsonify({
        "status": "success"
    })
Run Code Online (Sandbox Code Playgroud)

来源:push_subscriptions_api.py

由于整个订阅对象用于webpush触发推送通知,因此我知道整个订阅对象需要发送到服务器。

from pywebpush import webpush, WebPushException
import json
from flask import current_app


def trigger_push_notification(push_subscription, title, body):
    try:
        response = webpush(
            # Uses entire subscription object stored …
Run Code Online (Sandbox Code Playgroud)

javascript push-notification flask service-worker web-push

10
推荐指数
1
解决办法
4669
查看次数

从前端上传大文件

我试图了解将大文件从前端上传到服务器的最佳方法是什么。对于前端,我使用一个名为的库react-dropzone,它允许我获取我打算上传的文件的信息。我的上传组件看起来像这样:

// Node Modules
import React, {useCallback} from 'react';
import {useDropzone} from 'react-dropzone';
import {useTranslation} from 'react-i18next';

export default function Upload() {
  // i18n
  const [t] = useTranslation();

  // React Dropzone
  const onDrop = useCallback((droppedFiles) => {
    console.log(droppedFiles);
  }, []);
  const {getRootProps, getInputProps, isDragActive} = useDropzone({onDrop});

  return (
    <div className="upload" {...getRootProps()}>
      <input {...getInputProps()} />
      {isDragActive ? (
        <p>{t('DROP_FILES_HERE')}</p>
      ) : (
        <p>{t('DRAG_AND_DROP_FILES_HERE_OR_CLICK_TO_SELECT_FILES')}</p>
      )}
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

这使我能够访问文件的内容,例如文件的名称、类型和大小(以字节为单位)。文件上传示例内容 这个库似乎也适用于更大的文件(100+ MB),但我的问题是当我想上传这个数据时如何调用这些数据?

我的一个想法是使用localStorage,但最大大小似乎约为5 到 10 MB。我也在Redux …

javascript large-file-upload reactjs react-dropzone

6
推荐指数
0
解决办法
7660
查看次数