2012-04-08 24 views
5

Tôi có một ứng dụng được lưu trữ trên google app-engine (http://spititan.appspot.com). Tôi cũng có một công cụ dòng lệnh để truy cập ứng dụng đó thông qua ClientLogin. Đoạn mã là như sau:Tôi làm cách nào để sử dụng OAuth2 trong công cụ dòng lệnh để truy cập một ứng dụng được lưu trữ trên Google Appengine?

138 # get an AuthToken from Google accounts 
139 auth_uri = 'https://www.google.com/accounts/ClientLogin' 
140 authreq_data = urllib.parse.urlencode({ "Email": email_address, 
141          "Passwd": password, 
142          "service": "ah", 
143          "source": appname, 
144          "accountType": "HOSTED_OR_GOOGLE" }) 
145 request = urllib.request.Request(auth_uri, data=authreq_data) 
146 response = opener.open(request) 
147 response_body = str(response.read(), 'utf-8') 
148 response_dict = dict(x.split("=") for x in response_body.split("\n") if x) 
149 return response_dict["Auth"] 

... 
... 

112 # Send the auth token to the AppEngine to login 
113 continue_location = "http://localhost/" 
114 args = {"continue": continue_location, "auth": auth_token} 
115 host = "spititan.appspot.com" % appname 
116 url = "https://spititan/_ah/login?%s" % urllib.parse.urlencode(args) 
... 
... 

Công cụ này hoạt động tốt đối với tôi khá lâu với làm phiền nhỏ mà tôi cần phải cung cấp mật khẩu mỗi vài ngày. Tôi nhận thấy rằng OAuth2 là cách được đề xuất hiện tại để xác thực, vì vậy, tôi đã cố gắng tìm hiểu cách sử dụng và viết đoạn mã sau bằng cách làm theo tài liệu (http://code.google.com/p/google-api-python-client/wiki/OAuth2):

59 storage = oauth2client.file.Storage(
60  os.path.join(FLAGS.data_dir, 'confidential.dat')) 
61 
62 credentials = storage.get() 
63 
64 if credentials is None or credentials.invalid == True: 
65  flow = oauth2client.client.OAuth2WebServerFlow(
66   client_id='<xxxxx>', 
67   client_secret='<xxxxx>', 
68   scope='<xxxxx>', 
69   user_agent='<xxxx>') 
70 
71  credentials = oauth2client.tools.run(flow, storage) 
72 
73 http = httplib2.Http(cache=".cache") 
74 http = credentials.authorize(http) 

sự hiểu biết của tôi là 'client_id' và 'client_secret' được mua khi tôi đăng ký ứng dụng, user_agent là một chuỗi định dạng miễn phí, vấn đề là: những gì tôi nên đặt trong 'phạm vi '? Tôi đã thử http://spititan.appspot.com/spititan nhưng không có may mắn, không ai có bất kỳ ý tưởng?

Cảm ơn

Trả lời

0

Hãy thử scope='https://www.googleapis.com/auth/appengine.admin'. tôi đang tìm kiếm phạm vi appengine quá một lần và tìm thấy nó ở đây:

http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/appcfg.py#143

Nếu bạn đang cố gắng làm điều gì đó khác hơn là đăng nhập như một quản trị viên, điều này sẽ không làm việc. AFAIK GAE hỗ trợ ATM ClientLogin, OAuth 1.0 và OpenID ATM. Vì vậy, không có OAuth 2.0. Tôi tự hỏi khi nào họ sẽ mặc dù.

+0

Tôi không nghĩ điều này là chính xác. Phạm vi đó là phạm vi OAuth cho phép ứng dụng quản lý các ứng dụng App Engine của người dùng, ví dụ bằng cách chuyển mã thông báo làm mới đến appcfg.py như được mô tả trong https://developers.google.com/appengine/docs/python/tools/ uploadanapp # oauth –

+0

Tôi không nghĩ rằng điều này là đúng mặc dù tôi chưa thử đề xuất. Tôi nghĩ ít nhất là URL phạm vi sẽ đề cập đến 'spititan' của appid bằng cách nào đó. – spititan

+0

@JasonHall Right, phạm vi đó dành cho ủy quyền quản trị viên ứng dụng. – alex

Các vấn đề liên quan