【问题标题】:Pydrive authentication usingPydrive 身份验证使用
【发布时间】:2014-05-08 12:20:45
【问题描述】:

我正在使用 gdata 模块从 google doc 访问、上传、下载文件。我有 oauth 密钥和秘密。现在我想切换到 google drive api。在google drive api上学习和研究了一下,在认证上看起来有点不同。我还下载了 pydrive 模块,这样我就可以启动了。但我无法授权我的服务器端 python 代码使用我的 oauth 密钥授权/验证用户并访问我的驱动器。有没有人知道如何使用 pydrive 通过我以前的身份验证密钥访问我的驱动器。我只需要一种简单的身份验证方式。

【问题讨论】:

    标签: python-2.7 google-drive-api google-oauth


    【解决方案1】:

    为了使用 gdata 模块,我们使用这些凭据中的任何一个 - 1> 用户名和密码或 2> 消费者 oauth 密钥和密钥。

    由于您尝试使用 oauth 凭据,我认为您需要 Google Drive 的域范围委派访问,这将帮助您通过域将文件上传/下载到任何用户的 Google Drive。

    为此,您需要从 Developer's Console

    *.p12 文件将被下载。请注意保存它的路径。 另请记下您的服务帐户的电子邮件地址。这些将在编码时使用。

    下面是你必须仔细编辑的python代码—— 服务帐户私钥的路径,something@developer.gserviceaccount.com,EMAIL_ID@YOURDOMAIN.COM,以便正确运行并测试它。

    希望这会有所帮助! 资源-Google Drive API

    import httplib2
    import pprint
    import sys
    
    from apiclient.discovery import build
    from oauth2client.client import SignedJwtAssertionCredentials
    
    """Email of the Service Account"""
    SERVICE_ACCOUNT_EMAIL = 'something@developer.gserviceaccount.com'
    
    """Path to the Service Account's Private Key file"""
    SERVICE_ACCOUNT_PKCS12_FILE_PATH = 'PATH TO SERIVE ACCOUNT PRIVATE KEY'
    
    def createDriveService(user_email):
      """Build and returns a Drive service object authorized with the service accounts
      that act on behalf of the given user.
    
      Args:
        user_email: The email of the user.
      Returns:
        Drive service object.
      """
      f = file(SERVICE_ACCOUNT_PKCS12_FILE_PATH, 'rb')
      key = f.read()
      f.close()
    
      credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key,
          scope='https://www.googleapis.com/auth/drive', sub=user_email)
      http = httplib2.Http()
      http = credentials.authorize(http)
    
      return build('drive', 'v2', http=http)
    
    drive_service=createDriveService('EMAIL_ID@YOURDOMAIN.COM')
    
    result = []
    page_token = None
    
    
    while True:
        try:
            param = {}
            if page_token:
                param['pageToken'] = page_token
            files = drive_service.files().list().execute()
            #print files
            result.extend(files['items'])
            page_token = files.get('nextPageToken')
            if not page_token:
                break
        except errors.HttpError, error:
            print 'An error occurred: %s' % error
            break
    
    for f in result:
        print '\n\nFile: ',f.get('title')
    
        print "\n"
    

    【讨论】:

    • 感谢 Jai 的漂亮。让我试试这些东西并检查一下......非常感谢。 :)
    • 不客气。我在回答中提到了来源-Google Drive API,请访问链接以获取其他不同语言的代码 java、php、javascript 等。也不要忘记投票我的答案;)
    • 我知道这是一个迟到的回复:)。我尝试了代码并创建了一个服务帐户,然后在安全性下的域管理员中进行了所需的更改,如link,在将域范围的权限委托给您的服务帐户下。但是当我使用 sub=myuser@mydoamin.com 从域下的其他用户尝试时,它给了我'invalid_grant'。不知道如何找出问题所在。检查pdb_trace(),凭证对象没有credential.access_token, rob in build.
    • 您是否从开发者控制台生成了服务帐户类型的客户端 ID,以及域管理员帐户?
    • 做了一些功课后,我发现这样创建的电子邮件(服务帐户)无效。可能是我从域下的普通用户创建了服务帐户。我删除了以前的服务帐户,并使用了使用域用户帐户创建的服务帐户,它可以工作。干杯...
    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 2020-01-24
    • 2022-01-17
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多