【问题标题】:Google Calendar API authorization working on localhost but not on HerokuGoogle Calendar API 授权在本地主机上工作,但在 Heroku 上不工作
【发布时间】:2021-12-01 02:05:34
【问题描述】:

我想为我的 Django 应用程序使用 Google Calendar API。 我已按照此处的说明进行操作:https://karenapp.io/articles/how-to-automate-google-calendar-with-python-using-the-calendar-api/

我还在 Google API 中添加了重定向 uri - 似乎浏览器试图在服务器端打开(就像在本地一样,但我无法操作它,因为服务器端的浏览器没有显示向上)。在终端中,我确实看到“请访问此 URL 以授权此应用程序:https://accounts.google.com/..."

关于我能做什么的任何想法?

views.py 中的代码:

import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

SCOPES = ['https://www.googleapis.com/auth/calendar']

CREDENTIALS_FILE = 'path_to_file/credentials.json'

def get_calendar_service():
   creds = None

   if os.path.exists('token.pickle'):
       with open('token.pickle', 'rb') as token:
           creds = pickle.load(token)

   if not creds or not creds.valid:
       if creds and creds.expired and creds.refresh_token:
           creds.refresh(Request())
       else:
           flow = InstalledAppFlow.from_client_secrets_file(
               CREDENTIALS_FILE, SCOPES)
           creds = flow.run_local_server(port=0)

       with open('token.pickle', 'wb') as token:
           pickle.dump(creds, token)

   service = build('calendar', 'v3', credentials=creds)
   return service

【问题讨论】:

    标签: python django heroku google-calendar-api google-api-python-client


    【解决方案1】:

    您遇到的问题是您正在使用已安装的应用程序流。

     flow = InstalledAppFlow.from_client_secrets_file(
                   CREDENTIALS_FILE, SCOPES)
               creds = flow.run_local_server(port=0)
    

    此代码专为与已安装的应用程序一起使用而设计,用于在当前运行它的机器上打开 Web 浏览器窗口。

    Using OAuth 2.0 for Web Server Applications

    import google.oauth2.credentials
    import google_auth_oauthlib.flow
    
    # Use the client_secret.json file to identify the application requesting
    # authorization. The client ID (from that file) and access scopes are required.
    flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
        'client_secret.json',
        scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])
    
    # Indicate where the API server will redirect the user after the user completes
    # the authorization flow. The redirect URI is required. The value must exactly
    # match one of the authorized redirect URIs for the OAuth 2.0 client, which you
    # configured in the API Console. If this value doesn't match an authorized URI,
    # you will get a 'redirect_uri_mismatch' error.
    flow.redirect_uri = 'https://www.example.com/oauth2callback'
    
    # Generate URL for request to Google's OAuth 2.0 server.
    # Use kwargs to set optional request parameters.
    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 2013-01-14
      • 2020-06-10
      • 2017-06-05
      • 1970-01-01
      • 2017-08-01
      • 2021-07-22
      • 1970-01-01
      相关资源
      最近更新 更多