[收到Google Calendar API通知时出现403错误

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

我已经成功为各种GSuite用户创建了日历事件,然后我想设置一个监视事件。我能够成功做到这一点:

SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = BASE_DIR + 'path_to_json'

credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES)

delegated_user = credentials.with_subject(user)
delegated_service = googleapiclient.discovery.build('calendar', 'v3', credentials=delegated_user)


event = {
        'summary': '%s at %s' % (event_name, event_location),
        'description': 'description',
        'location': event_address,
        'extendedProperties': {
            "private": {
                'briefType': event_name,
            }
        },
        'start': {
            'dateTime': event_start_time.astimezone().isoformat(),
        },
        'end': {
            'dateTime': event_end_time.astimezone().isoformat(),
        }

    }


event = delegated_service.events().insert(calendarId='primary', body=event).execute()

watch_body = {
    'id': event['id'],
    'type': 'web_hook',
    'address': 'https://example.com/googleapi'
}

watch = delegated_service.events().watch(calendarId='primary', body=watch_body).execute()

我不太确定如何接收推送通知。我已经注册/添加了我的域(按https://developers.google.com/calendar/v3/push),当我在Google日历中更改事件时,我收到了API推送通知,但收到403错误:

Dec 11 20:58:38 ip-xxx gunicorn[3104]:  - - [11/Dec/2019:20:58:38 +0000] "POST /googleapi HTTP/1.0" 403 1889 "-" "APIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html)"

我如何在处理view/googleapi中进行身份验证,以能够实际接收来自Google的API通知?

我尝试了以下操作,只是为了调试从Google接收到的内容,但是除了403错误之外,我什么也没得到:

def GoogleAPIWatchView(request):

    SCOPES = ['https://www.googleapis.com/auth/calendar']
    SERVICE_ACCOUNT_FILE = BASE_DIR + 'path_to_json'

    credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)

    regex = re.compile('^HTTP_')
    headers = dict((regex.sub('', header), value) for (header, value) 
           in request.META.items() if header.startswith('HTTP_'))

    print(headers)
    print(request)

    return JsonResponse('success', status=200, safe=False)
python django google-api google-calendar-api google-oauth
3个回答
1
投票

您的应用程序正在尝试使用服务帐户访问用户数据,这是正确的,并且这样做是正确的,但是由于您没有获得执行此权限的权限,因此您将收到403服务器响应。

为了在尝试使用服务帐户时能够使用服务帐户运行您的应用程序,必须授予以下权限:

域范围内的授权:

如果服务帐户没有对域的委派权限,则使用服务帐户的应用程序将无法代表域的用户访问数据。

要启用它,请转到here

  1. 选择您的项目
  2. 选择您的服务帐户或创建一个新帐户
  3. 单击“编辑”以编辑服务帐户的参数
  4. 选择“启用G Suite域范围委派”>
  5. 您的服务帐户现在具有域范围的委派。

接下来,您需要设置服务帐户的范围。

服务帐户范围:

G Suite域的管理员必须执行以下步骤:

  1. 转到您的G Suite域admin console
  2. 从控件列表中选择安全性
  3. 从选项列表中选择高级设置
  4. 在“身份验证”部分中选择“管理API客户端访问”
  5. 在“客户名称”字段中输入服务帐户的客户ID。您可以在“服务帐户”页面中找到服务帐户的客户ID
  6. 在“一个或多个API范围”字段中,输入应授予您的应用程序访问权限的范围列表。在这种情况下:https://www.googleapis.com/auth/calendar
  7. 授权
  8. 关于域范围内的授权和服务帐户创建的Google文档:

https://developers.google.com/identity/protocols/OAuth2ServiceAccount


0
投票

似乎是这样的[[[HTTP 403


0
投票
正如@JPG正确指出的那样,您的

api正在拒绝未经授权的请求

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