2013-02-01 36 views
0

我想通過我的web應用程序上傳文件到我的谷歌驅動器。 我爲我的web應用程序創建客戶端ID如下:重定向uri錯誤,同時上傳文件到谷歌驅動器

Client ID: 916885716524-1qvrrridktedn50pasooe1ndepe1oefp.apps.googleusercontent.com 
Email address: [email protected]account.com 
Client secret: 6an3xatjgt7sU4Y5v61er7hd 
Redirect URIs: http://localhost:9000/ 
JavaScript origins: http://localhost:9000/ 

我下載了JSON文件,並保存它。

現在,無論何時用戶試圖從網絡應用程序上傳。

它將進入認證窗口。現在,當我選擇的帳戶,它是說:

錯誤:HTTP:redirect_uri_mismatch

在請求重定向的URI //本地主機:8080 /不匹配的註冊重定向URI

請求細節

from_login=1 
scope=https://www.googleapis.com/auth/drive.readonly https://www.googleapis.com/auth/drive.apps.readonly https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/drive.file 
response_type=code 
access_type=offline 
redirect_uri=http://localhost:8080/ 
as=36ff9556bb7c2164 
display=page 
pli=1 
client_id=916885716524-1qvrrridktedn50pasooe1ndepe1oefp.apps.googleusercontent.com 
authuser=0 
hl=en 

,你可以看到我沒有在我的重定向URI提到8080,但隨後也被試圖重定向到URI。

我的代碼如下:

在我的處理程序:

Class Upload(tornado.web.RequestHandler): 
    def post(self, *args, **kwargs): 
     # some logic here by which I am getting the file path 
     # then calling following function from another file 
     file_path = "/home/user/filename.txt" 
     upload_to_drive(file_path) 
     self.finish(json.dumps({"status": "success"})) 

在那裏,我要上傳到Google雲端硬盤中寫入邏輯另一個文件是:

#幫助全鏈接https://developers.google.com/drive/quickstart-
蟒蛇#step_1_enable_the_drive_api

import os 
import sys 
import socket 
import logging 
import httplib2 
from mimetypes import guess_type 

from apiclient.discovery import build 
from apiclient.http import MediaFileUpload 
from oauth2client.client import OAuth2WebServerFlow 
from oauth2client.file import Storage 
import apiclient 
from oauth2client.client import flow_from_clientsecrets 
from oauth2client.tools import run 

# Log only oauth2client errors 
logging.basicConfig(level="ERROR") 


token_file = os.path.join(os.path.dirname(__file__), 'sample.dat') 

CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json') 

# Helpful message to display if the CLIENT_SECRETS file is missing. 
MISSING_CLIENT_SECRETS_MESSAGE = """ 
WARNING: Please configure OAuth 2.0 

To make this sample run you will need to download the client_secrets.json file 
and save it at: 

    %s 

""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS) 

FLOW = flow_from_clientsecrets(CLIENT_SECRETS, 
    scope=[ 
     'https://www.googleapis.com/auth/drive', 
     'https://www.googleapis.com/auth/drive.apps.readonly', 
     'https://www.googleapis.com/auth/drive.file', 
     'https://www.googleapis.com/auth/drive.readonly', 
     'https://www.googleapis.com/auth/drive.metadata.readonly', 
    ], 
    message=MISSING_CLIENT_SECRETS_MESSAGE) 


def authorize(token_file, storage): 
    if storage is None: 
     storage = Storage(token_file) 
    credentials = storage.get() 

if credentials is None or credentials.invalid: 
    credentials = run(FLOW, storage) 

# Create an httplib2.Http object and authorize it with credentials 
http = httplib2.Http() 

credentials.refresh(http) 
http = credentials.authorize(http) 
return http 


def upload_file(file_path, file_name, mime_type): 
# Create Google Drive service instance 
    http = httplib2.Http() 
    drive_service = build('drive', 'v2', http=http) 

    media_body = MediaFileUpload(file_path, 
          mimetype=mime_type, 
          resumable=False) 
    body = { 
     'title': file_name, 
     'description': 'backup', 
     'mimeType': mime_type, 
    } 
    permissions = { 
     'role': 'reader', 
     'type': 'anyone', 
     'value': None, 
     'withLink': True 
    } 

    # Insert a file 
    # drive_services.files() is at first an empty list. 
    file = drive_service.files().insert(body=body, media_body=media_body).execute() 
    # Insert new permissions and create file instance 
    drive_service.permissions().insert(fileId=file['id'], body=permissions).execute() 
    print 'file uploaded !!' 


def file_properties(file_path): 
    mime_type = guess_type(file_path)[0] 
    file_name = file_path.split('/')[-1] 
    return file_name, mime_type 

def upload_to_drive(file_path): 
    try: 
     with open(file_path) as f: pass 
    except IOError as e: 
     print(e) 
     sys.exit(1) 

    http = authorize(token_file, None) 
    file_name, mime_type = file_properties(file_path) 

    upload_file(file_path, file_name, mime_type) 

我無法理解我在做錯的地方。請有人解釋一下這個辦法。

感謝

回答

0

在最後的Upload類的你有

self.redirect("/") 

如果您是在本地開發服務器上運行此,它希望有是在HTTP的東西://本地主機:8080 /,您的開發服務器的默認主機/地址。

+0

重定向到localhost:8080在oauth之後。在這裏我寫了self.redirect(「/」)來確保通話完成。把它看作是我在那裏做轉儲。我將修改帖子,這將使其更加清晰。 – Somesh

0

我並沒有與python庫建立密切關係,但無論哪個調用構造了認證URI,顯然在參數中輸入http://localhost:8080,就像您在帖子中看到的那樣。因此,無論您需要弄清楚如何更改python庫的行爲以放入localhost:9000,或者您需要在開發者控制檯中更改註冊以允許localhost:8080

我發現當我通過開發,暫存和產品化應用程序工作時,最終會在開發控制檯中創建六個不同的重定向。沒有明顯的傷害,我可以看到。

0

我們需要修改oauth2client.tool有點

您可以指定端口像以下內容,然後每一件事都會很好地工作。

gflags.DEFINE_multi_int('auth_host_port', [8080, 8090, 9000],..... 
) 
相關問題