【问题标题】:web push UnauthorizedRegistration error 400网络推送 UnauthorizedRegistration 错误 400
【发布时间】:2017-05-18 08:28:43
【问题描述】:

我正在使用网络推送,并关注this codelab学习如何注册用户。

对于后端,我将使用这个库来发送推送消息: https://github.com/web-push-libs/web-push-csharp

我注意到 Chrome 中的一些用户在我注册时具有以下两种可能来源之一:

fcm.googleapis.com/fcm/sendandroid.googleapis.com/gcm/send

我已将所有参数添加到后端库,我正在尝试向所有用户批量发送通知。

当我发送消息时,我对所有消息都使用vapidDetails,我看到只有 ID 以fcm.googleapis.com 开头的用户才能正确发送推送消息。对于所有使用android.googleapis.com 的用户,我收到了错误UnauthorizedRegistration。所以我尝试使用gcmAPIKey

我从 Firebase 获得了密钥,我看到那是 2 个密钥,所以我尝试了它们,我还读到在用户注册的网站上我需要将文件名 manifest.json 与 gcm_sender_id 一起放置,所以我做到了……

我使用的所有代码都来自顶部的两个库。

我举例说明我发送的内容以及我从有效的 fcm 和无效的 gcm 获得的响应。 我也尝试阅读这个问题,但没有解决我的问题

{
  Method: POST,
  RequestUri: 'https://android.googleapis.com/gcm/send/f9PkPIROxKo:APA91bESvQBjMpHDmi_InXNHScEFt_-xWy4zEYhUfQvS6W78YBVZLrDGoYnKkw21bYjbTU0Q6zk_VXt8qdEiQtNEe0W2znE2Ho4_gYh5yLhqPZt8CHFrhhmUWdZaWpIlFDwvS8FhOALA', Version: 1.1, Content: System.Net.Http.ByteArrayContent,
  Headers: {
    TTL: 2419200
    Encryption: salt=mfZ6vUxS7u3Xo5jDPau_NA
    Authorization: key=AAAAZYYARKI:APA91bEIdVZ3LiZUsL0CgWmQTkz6hK_U8OPMTjuMt_6Ux2PmNNGGZEluzllixLIQHEDjUYygENPN8MCmnTmhxnPD29WfyHJrDVZjEUzbl7u--1NQVI49pYtag9kijSBsDw-mE4b6lOvD
    Crypto-Key: dh=BIBz0FvQPs6BdNCwFut_vHwU-Tk-pyuCBxnxqOSufo4EHEaps0DZ5lZjSTG46RcI53D-Dkj6uMHqyw9X5r2u_Hk
    Content-Type: application/json
    Content-Length: 74
    Content-Encoding: aesgcm
  }
}

{
  StatusCode: 400,
  ReasonPhrase: 'UnauthorizedRegistration', 
  Version: 1.1, 
  Content: System.Net.Http.StreamContent, 
  Headers: {
      X-Content-Type-Options: nosniff
      X-Frame-Options: SAMEORIGIN
      X-XSS-Protection: 1; mode=block
      Alt-Svc: quic=":443"; ma=2592000; v="37,36,35"
      Vary: Accept-Encoding
      Transfer-Encoding: chunked
      Accept-Ranges: none
      Cache-Control: max-age=0, private
      Date: Thu, 18 May 2017 07:28:48 GMT
      Server: GSE
      Content-Type: text/html; charset=UTF-8
      Expires: Thu, 18 May 2017 07:28:48 GMT
  }
}

对于有效的 fcm:

{
  Method: POST,
  RequestUri: 'https://fcm.googleapis.com/fcm/send/e1N5dtHsikc:APA91bEHZztef21cjooCnaPu_lAmcYjA2twELeecS7wIuJibbpptAlUdYaVHNkVukph5qy9mnVml3qenqti1Yz7wUqL6A-UY3h-Ifkv1dnxSsngPIvmG8VXMmjy66aSvJ1DtI1p3W3Sm', Version: 1.1, Content: System.Net.Http.ByteArrayContent,
  Headers: {
      TTL: 2419200
      Encryption: salt=W1Y-iRlHUu1spMta3etHGw
      Authorization: WebPush eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL2ZjbS5nb29nbGVhcGlzLmNvbSIsImV4cCI6MTQ5NTEzNTQ2OCwic3ViIjoibWFpbHRvOm9maXJAZmllbGRzb2ZsZWFkcy5jb20ifQ.zZ5cqwhbGNHDhO_swjwdxjqnCczFrOFoAJSvjMP2Xeylt5C6MfGwNz92vZWMPkiJwhHrJZt9nmsbrh_6ghxaLw
      Crypto-Key: dh=BLeaQC8dvMuxASHFsp4_8kcExsa6yZcT1V2x7MZJnUGgSxq3JXYa6JN7Rm6xtPpwA0Q5tftSdy6dR7P1ZMztPMs;p256ecdsa=BDd3_hVL9fZi9Ybo2UUzA284WG5FZR30_95YeZJsiApwXKpNcF1rRPF3foIiBHXRdJI2Qhumhf6_LFTeZaNndIo
      Content-Type: application/json
      Content-Length: 74
      Content-Encoding: aesgcm
  }
}

{
  StatusCode: 201,
  ReasonPhrase: 'Created',
  Version: 1.1,
  Content: System.Net.Http.StreamContent,
  Headers: {
      X-Content-Type-Options: nosniff
      X-Frame-Options: SAMEORIGIN
      X-XSS-Protection: 1; mode=block
      Alt-Svc: quic=":443"; ma=2592000; v="37,36,35"
      Cache-Control: max-age=0, private
      Date: Thu, 18 May 2017 07:25:38 GMT
      Location: https://fcm.googleapis.com/fcm/0:1495092338974351%0f493ae6f9fd7ecd
      Server: GSE
      Content-Length: 0
      Content-Type: text/plain
      Expires: Thu, 18 May 2017 07:25:38 GMT
  }
}

【问题讨论】:

    标签: javascript c# git web push-notification


    【解决方案1】:

    让我们把这个问题分解成2个:

    1。为什么有两个不同的起源?

    在较新版本的 Chrome(和三星互联网浏览器)中,您可以传入 applicationServerKey,这将返回 fcm.googleapis.com 推送订阅。

    如果您不提供 applicationServerKey 或者您使用的浏览器不支持 applicationServerKey确实支持网络应用清单中的专有 gcm_sender_id 参数,那么您将获得android.googleapis.com 端点。

    2。为什么你不能让它工作?

    我的预感是你已经将你最初链接到的 codelab 和 my simple push demo 混合在一起。

    既然您说您您已经订阅了android.googleapis.com 之后创建了一个 Firebase 项目,我 99% 确定您使用了其他人的 gcm_sender_id,这意味着只有该项目的所有者才能向该用户发送消息。如果您从数据库中删除这些用户,请使用您自己的gcm_sender_id 重新注册,如果应该可以。

    有关 gcm_sender_id 的信息以及如何使其与 Firebase 一起使用的详细信息:https://web-push-book.gauntface.com/chapter-06/01-non-standards-browsers/

    【讨论】:

      【解决方案2】:
      • 您将遇到此错误的一种情况如下所述:

        One will produce the wrong process

        而且谷歌教程还提到了以下内容:

        open DevTools (Right Click > Inspect) and go to the Application panel, click the Service Workers tab and check the Update on Reload checkbox. When this checkbox is enabled the service worker is forcibly updated every time the page reloads.

      • 如果您想在网站中使用有效负载推送通知:

        当你subscribe时添加applicationServerKey

      • 如果你在subscribe时添加applicationServerKey

        1. openssl 生成的密钥对我不起作用。
        2. vapid 生成的密钥对我不起作用。
        3. 谷歌教程中提到的网站生成的密钥有效。
      • 可用的密钥生成器(包括公共服务器应用程序密钥和私钥): Workable keys generator

      • 可行的谷歌教程: Workable google tutorial

      结论

      1. 我添加了applicationServerKey 并导致错误
      2. 我使用Workable keys generator,但仍然出错
      3. 我关注 Google tutorial 更新 service worker 以防止出现错误
      4. 作品

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 2021-06-09
        • 2019-05-13
        • 1970-01-01
        相关资源
        最近更新 更多