有没有办法从Google服务帐户获取永久访问令牌?

问题描述 投票:0回答:1

我目前正在开发一个 iOS 应用程序(使用 Swift),当两个用户中的任何一个向另一个用户发送消息时(以及当其他事件发生时),该应用程序会在两个用户之间发送推送通知。为此,我使用 Firebase Cloud Messaging,这是实际发送通知的 swift 函数:

        let accessToken  = "xxxx"
        
        let urlString = "https://fcm.googleapis.com/v1/projects/\( K.FCMessaging.projectId)/messages:send"
        
        let url = NSURL(string: urlString)!
        
        let paramString: [String : Any] = ["message": [
            "apns" : ["payload" : ["aps": ["alert": ["title": title, "body": body], "sound": "default"] as [String : Any], OrderModel.CodingKeys.orderId.rawValue: order.orderId!, OrderModel.CodingKeys.senderId.rawValue: order.senderId] as [String : Any]],
            "token" : receiverToken] as [String : Any]
        ]
        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "POST"
        request.httpBody = try? JSONSerialization.data(withJSONObject:paramString)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
        let task =  URLSession.shared.dataTask(with: request as URLRequest)
        task.resume()

访问令牌是通过在 Mac 本地运行此 python 代码来获取的:

import argparse
import json
import requests
import google.auth.transport.requests
from google.oauth2 import service_account


PROJECT_ID = 'xxxx'
BASE_URL = 'https://fcm.googleapis.com'
FCM_ENDPOINT = 'v1/projects/' + PROJECT_ID + '/messages:send'
FCM_URL = BASE_URL + '/' + FCM_ENDPOINT
SCOPES = ['https://www.googleapis.com/auth/firebase.messaging']

def access_token():
    credentials = service_account.Credentials.from_service_account_file('/Users/...-firebase-xxxx.json', scopes=SCOPES)
    request = google.auth.transport.requests.Request()
    credentials.refresh(request)
    return credentials.token

现在,当我将访问令牌复制到 swift 函数中时,一切正常(即发送和接收通知),但它在一小时后过期,我必须再次运行代码并再次复制访问令牌。 由于我没有自动运行 python 函数的服务器,所以我似乎遗漏了一些东西。 您能否告诉我如何获取应用程序的永久访问令牌或在 iOS 中的两个设备之间发送推送通知的正确方法?

ios swift firebase push-notification firebase-cloud-messaging
1个回答
0
投票

自从 Google 过渡到 FCM v1 以来,他们现在强制使用 OAuth2,这与 FCM(旧版)不同。 OAuth2 通过生成临时令牌来发挥作用,临时令牌可作为针对各种攻击(例如中间人攻击)的预防措施。因此,不幸的是,不可能使用永久代码。

正如评论中提到的,我认为最直接的方法是利用 Google Cloud Functions。这种方法可以最大程度地减少本地应用程序的工作负载。然而,不幸的是,您在自己的国家/地区无法访问。

© www.soinside.com 2019 - 2024. All rights reserved.