【问题标题】:AccessTokenRefreshError: invalid_grant from oauth2clientAccessTokenRefreshError:来自 oauth2client 的 invalid_grant
【发布时间】:2014-08-01 11:13:33
【问题描述】:

我正在创建一个脚本,该脚本将使用 Google-api-python-client 为特定的 Google Apps 用户下载文件 首先,我试图获取用户帐户包含的文件列表。 我正在按照链接https://developers.google.com/drive/v2/reference/files/list

中给出的示例进行操作

代码块如下

用户对客户端的授权

def authorize_application(request):

    #setting flow to get permission and code 
    flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI, ACCESS_TYPE)
    authorize_url = flow.step1_get_authorize_url()

    code = request.GET.get('code', '')

    if code:
        #import ipdb
        #ipdb.set_trace()
    #setting flow step2 to exchage code for access token    
        credential = flow.step2_exchange(code)

    #initialising httplib2 instance and building a DriveAPI service
        http = httplib2.Http()
        http = credential.authorize(http)
        drive_service = build('drive', 'v2', http=http)

        # getting user's data
    about = drive_service.about().get().execute()
        user_info = about.get('user')
        email = user_info.get('emailAddress')
        request.session['username'] = email[0:email.index('@')]
        username = request.session['username']
        #import ipdb
        #ipdb.set_trace()
        #creating a Django user object 
    user, created = User.objects.get_or_create(username=username, email=email)

    #saving credentials to database 
        if created == True: 
            storage = Storage(CredentialsModel, 'id', user, 'credential')
            storage.put(credential)
            return HttpResponseRedirect('/download/')
        else:
        return HttpResponseRedirect('/download/')
    else:
        return HttpResponseRedirect(authorize_url)

获取用户云端硬盘中的文件列表

def download_file(request):

    #import ipdb
    #ipdb.set_trace()

    username = request.session['username']
    user = User.objects.get(username=username)

    storage = Storage(CredentialsModel, 'id', user, 'credential')
    credential = storage.get()

    access_token = credential.access_token

    http = httplib2.Http()
    http = credential.authorize(http)
    drive_service = build('drive', 'v2', http=http)

    result = []
    page_token = access_token

    while True:

    try:
        param = {}
            if page_token:
                param['pageToken'] = page_token
            files = drive_service.files().list(**param).execute()

            result.extend(files['items'])
                page_token = files.get('nextPageToken')

        if not page_token:
        break
    except errors.HttpError, error:
        print 'An error occured: %s' % error
        break

    return HttpResponse(result)

它正在从数据库中保存和检索凭证,但它给出错误“AccessTokenRefreshError:invalid_grant” files = drive_service.files().list(**param).execute() of download_file()

我做错了什么?请提出正确的方法。

【问题讨论】:

标签: python google-api-python-client


【解决方案1】:

(2017 年 2 月) 不确定您的问题是什么,但有几件事:1)Drive API 有一个 newer version(v3),以及 2)您的身份验证代码使用 Google API 客户端库中的最新更新现在可以显着简化。 (确保使用pip install -U google-api-python-client [或pip3 用于Python 3] 更新您的Python 库。)

下面是一个可行的解决方案——告诉我它是否适合你——我在this blog postthis video 中写道。我省略了 about() 调用来获取用户信息,但我将代码分为与上面相同的 2 个部分,但正如您所见,代码要少得多:

用户对客户端的授权

SCOPES = 'https://www.googleapis.com/auth/drive.readonly.metadata'
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_id.json', SCOPES)
    creds = tools.run_flow(flow, store)

获取用户云端硬盘中的文件列表(前 100 个文件)

DRIVE = discovery.build('drive', 'v3', http=creds.authorize(Http()))
files = DRIVE.files().list().execute().get('files', [])
for f in files:
    print(f['name'], f['mimeType'])

如果您想了解有关使用 Drive API 的更多信息,以下是我创建的一些其他资源(视频、博客文章等):

(*) - TL;DR:将纯文本文件上传到云端硬盘,导入/转换为 Google 文档格式,然后将该文档导出为 PDF。上面的帖子像您的代码示例一样使用 Drive API v2; this follow-up post 描述了将其迁移到 Drive API v3,这是一个 developer video 结合了两个“穷人的转换器”帖子。

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2015-09-19
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多