Как исправить redirect_uri_mismatch перенаправление URI OAuth Google

#python-3.x #google-api #google-oauth #google-calendar-api

#python-3.x #google-api #google-oauth #google-calendar-api

Вопрос:

Я получаю эту ошибку при попытке получить доступ к API календаря Google

ошибка:

Ошибка 400: redirect_uri_mismatch перенаправление URI в запросе, http://localhost:37461 /, не соответствует тем, которые авторизованы для клиента OAuth. Чтобы обновить авторизованные URI перенаправления, посетите: https://console.developers.google.com/apis/credentials/oauthclient/${your_client_id}?project=${your_project_number}

этот порт, упомянутый выше http://localhost:37461/ , всегда меняется.

И вот как я установил свой credentials.json

 {
  "web": {
    "client_id": "<id>.apps.googleusercontent.com",
    "project_id": "stunning-surge-291419",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_secret": "***",
    "redirect_uris": ["http://localhost:3000/create"],
    "javascript_origins": ["http://localhost:3000"]
  }
}

  

И это python я использую для перечисления событий в:

 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

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/calendar']

CREDENTIALS_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 there are no (valid) credentials available, let the user log in.
   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)

       # Save the credentials for the next run
       with open('token.pickle', 'wb') as token:
           pickle.dump(creds, token)

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

  
 from createevent import get_calendar_service

def main():
   service = get_calendar_service()
   # Call the Calendar API
   print('Getting list of calendars')
   calendars_result = service.calendarList().list().execute()

   calendars = calendars_result.get('items', [])

   if not calendars:
       print('No calendars found.')
   for calendar in calendars:
       summary = calendar['summary']
       id = calendar['id']
       primary = "Primary" if calendar.get('primary') else ""
       print("%st%st%s" % (summary, id, primary))

if __name__ == '__main__':
   main()
  

И я также установил URL-адреса перенаправления в консоли:

введите описание изображения здесь

Может кто-нибудь, пожалуйста, помогите мне?

Комментарии:

1. В вашем случае, как насчет изменения URL перенаправления с http://localhost:3000/create на http://localhost:3000 , и сценарий будет изменен с creds = flow.run_local_server(port=0) на creds = flow.run_local_server(port=3000) . Кстати, из вашего credentials.json и изображения кажется, что http://localhost это не сохраняется. Поэтому, когда вы изменили URL перенаправления, пожалуйста, нажмите кнопку Сохранить. Пожалуйста, будьте осторожны с этим. Если этот комментарий не был полезен для вашей ситуации, я прошу прощения.

2. Сработало ли предложение @Tanaike для вашей проблемы?

Ответ №1:

на самом деле вы можете указать порт для исправления uri перенаправления, чтобы вы были перенаправлены на правильный URL, в вашем случае вы были перенаправлены на http://localhost:37461 / :37461 это число рандомизируется, если вы не указываете конкретный порт, поскольку @Tanaike упоминает, что вам нужно будет исправить порт на 3000как показано на вашем скриншоте. creds = flow.run_local_server(port=3000)