I wrote a Python script(Google_add.py) which creates users in the Google Workspace. However, When it is run, an AttributeError occurred. How do I resolve this Error?
・Google_add.py (Excerpt)
PATH = '/opt/Google/credentials.json'
CLIENT_SECRETS = '/opt/Google/client_secrets.json'
credentials = None
#If there are credentials
if os.path.exists(PATH):
credentials = Credentials.from_authorized_user_file(
path = PATH,
scopes = SCOPES)
#If there are no (valid) credentials available
if not credentials or not credentials.valid:
if credentials and credentials.expired and credentials.refresh_token:
credentials.refresh(Request())
else:
FLOW = flow.InstalledAppFlow.from_client_secrets_file(
client_secrets_file = CLIENT_SECRETS,
scopes = SCOPES)
credentials = FLOW.run_console()
with open(PATH, 'w') as token:
token.write(credentials.to_json())
・Error Message
File "Google_add.py", line 186, in <module>
main()
File "Google_add.py", line 172, in main
FLOW.run_console()
AttributeError: 'InstalledAppFlow' object has no attribute 'run_console'
I refer the below site when I wrote it.
In the script, I want to authorize using the user account(not service account). And "run_local_server()" method doesn't work because my linux server isn't a web server (doesn't have httpd, nginx and so on).
(I'm sorry if my writing is hard to read.)
4 Answers
Expanding on George's answer above, the versions of the library from the github post that work are:
google-api-python-client==1.7.2
google-auth==1.8.0
google-auth-httplib2==0.0.3
google-auth-oauthlib==0.4.1
The issue may have been a version compatibility issue of google-api-python-client library with other libraries like
- google-auth
- google-auth-httplib2
- google-auth-oauthlib
You just need to make sure that the version of your google-api-python-client supports the versions you have installed to its dependency libraries.
You can view the full change log of google-api-python-client library here
References:
google-api-python-client change log
You said:
"run_local_server()" method doesn't work because my linux server isn't a web server (doesn't have httpd, nginx and so on).
This isn't true. The solution below will work also on non-web servers, your local machine, local scripts etc... However, you need a way to open a browser. If not, you can create the token on your local machine and copy the token to your server.
Replace:
credentials = FLOW.run_console()
with:
credentials = FLOW.run_local_server(port=0)
This will work perfectly in all situations.
For more info, refer to
The
run_console()(OOB) flow has been deprecated by Google, that's why it was removed from newer versions of the Google OAuth connector
Replace the line
credentials = FLOW.run_console()
to
credentials = FLOW.run_local_server()
people also got it working by these configurations:
google-api-python-client==1.7.2
google-auth==2.14.1
google-auth-httplib2==0.0.3
google-auth-oauthlib==0.4.1
git link :