使用Google Cloud签名的URL从Android应用访问表格

时间:2018-08-29 14:36:19

标签: android python google-cloud-storage google-sheets-api

我正在尝试创建一个能够读取Google表格中数据的Android应用。该应用程序用户在工作表上没有任何权利。

我使用Python服务器及其服务帐户来生成签名的URL,该URL将发送回Android应用。这是生成代码:

SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly'
SHEETS_API_URL = 'https://sheets.googleapis.com/v4/spreadsheets'
#other definitions like PROJECT_ID, SPREADSHEET_ID, CREDS_PATH...

SA_CREDS = ServiceAccountCredentials.from_json_keyfile_name(SA_CREDS_PATH)
SA_CREDS = SA_CREDS.create_scoped(SCOPES)
if not SA_CREDS or SA_CREDS.invalid:
    flow = client.flow_from_clientsecrets(CREDS_PATH, SCOPES)
    SA_CREDS = tools.run_flow(flow, store)
SA_CLIENT_ID = SA_CREDS.service_account_email
SHEET_SERVICE = build('sheets', 'v4', http=SA_CREDS.authorize(Http()))

def buildSignedURL():
    expiration_dt = int(time.time()) + 600
    expirationDate = str(expiration_dt)
    toSign = '\n'.join([
        'GET',          #HTTP_Verb
        '',             #MD5 digest value
        'text/plain',   #Content-Type
        expirationDate, #Expiration Date (Unix Epoch)
                        #Extension headers
        'x-goog-project-id:' + PROJECT_ID,
        '',             #Path to resource
        ])
    signed = SA_CREDS.sign_blob(toSign)[1]
    encoded = base64.b64encode(signed)
    signature = encoded.decode('utf-8')
    signature = signature.replace('+', '%2B')
    signature = signature.replace('/', '%2F')
    URL = SHEETS_API_URL + '/' + SPREADSHEET_ID
    URL += '?GoogleAccessId=' + SA_CLIENT_ID
    URL += '&Expires=' + expirationDate
    URL += '&Signature=' + signature
    return URL

该URL被发送回Android应用,并使用它来访问工作表。我的问题:我不知道如何。我尝试查找文档,但只能找到如何生成它们以及它们的用途,而找不到如何使用它们。

向该URL发送GET请求时,它会与403 Forbidden一起生成The request is missing a valid API key.

如果我了解API密钥正确执行的操作,那么我就不想使用它们,因为最终,python服务器将允许用户访问他们自己的工作表。

0 个答案:

没有答案