【问题标题】:FCM HTTP v1: how to get access token using Go?FCM HTTP v1:如何使用 Go 获取访问令牌?
【发布时间】:2017-11-22 10:04:54
【问题描述】:

为了使用 Go 发送 Firebase 云消息传递,我们需要将访问令牌放在 HTTP 请求标头中。

在 Firebase 文档中, 有关于如何使用 Node.JSPythonJava 检索访问令牌的示例:

https://firebase.google.com/docs/cloud-messaging/auth-server

任何人都可以使用 Go 显示获取访问令牌吗?

似乎有很多关于 Firebase/Google 身份验证的 Go 软件包。理解应该使用哪些非常令人困惑:

  • firebase.google.com/go
  • firebase.google.com/go/auth
  • github.com/firebase/firebase-admin-go
  • google.golang.org/api/option
  • golang.org/x/oauth2
  • golang.org/x/oauth2/google
  • github.com/google/google-api-go-client

【问题讨论】:

  • 嗨。抱歉,您能否指出我需要 访问令牌 才能从 Go 发送 FCM 消息的文档? AFAIK,您应该只需要 Server Key 和有效的目标来发送 FCM 消息。
  • 在较新的协议 FCM v1 HTTP API 上,您需要一个访问令牌,如下所述:firebase.google.com/docs/cloud-messaging/auth-server
  • 好的。我快速通读了一遍。我没有从服务帐户使用 FCM 的经验,也没有使用 Go lang。但是根据Git guide 链接,您最需要的包是golang.org/x/oauth2。实例化 GoogleCredentials 是我无法弄清楚的事情。抱歉没能帮上忙。
  • 嘿@DanieleB。 Firebase 最近上传了一个关于getting auth tokens via the Admin SDK using Go 的视频。不知道有没有用,看到你的帖子就想到了。祝你好运。
  • @AL。谢谢。这与 8 月份在 firebase 博客上发布的内容相同:firebase.googleblog.com/2017/08/…,但这些 custom tokens 似乎与云消息传递所需的 access tokens 不同。

标签: firebase go google-api firebase-authentication firebase-cloud-messaging


【解决方案1】:

我正在开发 go firebase SDK 以添加 FCM HTTP v1。

现在差不多完成了,我要写测试和集成测试,你可以在这里查看代码:https://github.com/chemidy/firebase-admin-go/tree/fcm/messaging

我可能会在下周完成测试并发送 PR,(在 ios + android + web 上测试有点棘手)

【讨论】:

    【解决方案2】:

    FCM httpv1 使用 JSON 文件作为它的凭据。

    首先下载它,然后将其移动到您的项目中。 download JSON credentials in your firebase

    第二,做:

    go get "golang.org/x/oauth2/google"
    

    然后使用此方法获取token

    const firebaseScope = "https://www.googleapis.com/auth/firebase.messaging"
    
    type tokenProvider struct {
        tokenSource oauth2.TokenSource
    }
    
    // newTokenProvider function to get token for fcm-send
    func newTokenProvider(credentialsLocation string) (*tokenProvider, error) {
        jsonKey, err := ioutil.ReadFile(credentialsLocation)
        if err != nil {
            return nil, errors.New("fcm: failed to read credentials file at: " + credentialsLocation)
        }
        cfg, err := google.JWTConfigFromJSON(jsonKey, firebaseScope)
        if err != nil {
            return nil, errors.New("fcm: failed to get JWT config for the firebase.messaging scope")
        }
        ts := cfg.TokenSource(context.Background())
        return &tokenProvider{
            tokenSource: ts,
        }, nil
    }
    
    func (src *tokenProvider) token() (string, error) {
        token, err := src.tokenSource.Token()
        if err != nil {
            return "", errors.New("fcm: failed to generate Bearer token")
        }
        return token.AccessToken, nil
    }
    

    然后在您的 FCM-Send 方法中调用它:

    tp, err := newTokenProvider("yourJSONFileLocation")
    if err != nil {
        return nil, err
    }
    token, err := tp.token()
    if err != nil {
        return nil, err
    }
    

    最后,将其添加到标题中:

    r.Header.Add("Authorization", "Bearer "+token)
    

    完成。

    【讨论】:

      【解决方案3】:

      我是通过使用 volly 放置标题授权

        @Override
                  public Map<String, String> getHeaders() throws AuthFailureError {
                      Map<String, String> headerMap = new HashMap<String, String>();
                      headerMap.put("Content-Type", "application/json");
                      headerMap.put("Authorization", "Bearer " + key);
                      Log.v(TAG,"getHeaders "+headerMap);
      
                      return headerMap;
                  }
      

      但发送 Authorization=Bearer Add..

      如何更改为当前 授权:承载

      【讨论】:

        猜你喜欢
        • 2020-02-04
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 2016-10-13
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多