Search code examples
python-3.xdjangogoogle-oauthgoogle-calendar-api

Google Calendar API v3 error after allowing permission using oauth2.0


I followed the quickstart example to integrate my django app with google calendar. The difference from quickstart to my situation is that i just want to generate a URL and send it back to my user, through

from google_auth_oauthlib.flow import InstalledAppFlow

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

flow = InstalledAppFlow.from_client_secrets_file(f"{PATH_TO_FILE}/{CLIENT_SECRET_FILE}", SCOPES)
(auth_url, state) = flow.authorization_url()
if is_dev():
    auth_url += '&redirect_uri=http%3A%2F%2Flocalhost%3A43759%2F'
print(auth_url)

(OBS: I added this is_dev option, because no redirect_uri was not considered)

I get this printed URL and get this steps:

1- The URL from auth_url printed when i ran the program

enter image description here

2- After choosing my user

enter image description here

3- and BAM, I cant proceed (i am redirected to localhost:47759 and cant access)

enter image description here

What should I do?


Solution

  • we wen't through one solution, that 3 steps are important to talk about.

    1- Create a new credential on Google Cloud, OAuth 2.0 Client ID for Web Application, as js origins with my local url, and another redirect URL authorized (this redirect solved the number 3 error for the question) enter image description here

    2- Also I read some examples about, and to get the user authorization, we send him an URL, if everything goes ok, he is redirected to our endpoint described above

    from google_auth_oauthlib.flow import InstalledAppFlow
    
    SCOPES = ['https://www.googleapis.com/auth/calendar']
    
    flow = InstalledAppFlow.from_client_secrets_file(f"{PATH_TO_FILE}/{CLIENT_SECRET_FILE}", SCOPES)
    flow.redirect_uri = URL_SAVED_ON_STEP_1
    (auth_url, state) = flow.authorization_url()
    print(auth_url)
    

    3- And to the URL receiving my code, was necessary an endpoint where we could save the user credential and use it if we wanted to add an event on the user calendar

    flow = InstalledAppFlow.from_client_secrets_file(f"{CONFIG_FILES_PATH}/{CLIENT_SECRET_FILE}", SCOPES)
    flow.redirect_uri = URL_SAVED_ON_STEP_1
    flow.fetch_token(authorization_response=request.url)
    creds = flow.credentials
    with open(f"{CONFIG_FILES_PATH}/token.json", 'w') as token:
        token.write(creds.to_json())
    

    So we can let any user share their calendar and we can manage as they allow