Tôi đang cố gắng hoàn thành hệ thống phân công câu chuyện cho tờ báo trường học của mình trong Google App Engine. Nó sẽ theo dõi thời hạn cho các nhà văn, cho phép các nhà văn để nhận câu chuyện, và đưa ra một cái nhìn "trong nháy mắt" của những câu chuyện tuần. Đối tác của tôi và tôi đang cố gắng tích hợp nó hoàn toàn với báo chí cài đặt Google Apps của chúng tôi. Ồ, và chúng tôi phải sử dụng Oauth 3 chân vì chúng tôi không có Google Apps Premier.Oauth + Aeoid + Python + Google App Engine + Tài liệu Google
Trong nỗ lực đó, tôi tình cờ gặp Aeoid và có thể làm theo hướng dẫn để thực hiện công việc đăng nhập được liên kết. Nó rất tuyệt!
Nơi tôi gặp sự cố đang sử dụng Oauth để nhận danh sách tài liệu google của người dùng. Tôi có một trang thử nghiệm được thiết lập tại đây: mustrun.cornellsun.com/test. Nó cho tôi lỗi - Tôi đã sao chép chúng ở cuối thư này. Tôi không biết liệu điều này có liên quan đến bí mật của người tiêu dùng hay không (tôi có nên sử dụng khóa tôi nhận được từ thị trường google không? Hoặc tôi có nên sử dụng khóa mà tôi nhận được từ trang quản lý tên miền không?). Hiện tại, tôi đang sử dụng khóa mà tôi nhận được từ trang quản lý tên miền
Cũng làm phức tạp điều này là miền appspot thực tế là mustrun2sun [] .appspot [quá mới không thể đăng nhiều liên kết] .com, nhưng Tôi thiết lập nó trong các ứng dụng của google để chỉ những người dùng từ miền của tôi mới có thể đăng nhập và cũng để ứng dụng được triển khai trên miền của tôi. (ứng dụng được triển khai dưới dạng must[]run[].corn[]ellsun[].[]com
& mọi thứ liên quan đến nó như vậy, ngay cả trong điều quản lý tên miền.)
Tôi đang sử dụng các lớp GDClient 2.0 nên tôi khá chắc chắn rằng mọi thứ sẽ hoạt động như được lên kế hoạch ... 'không sử dụng các công cụ dịch vụ cũ hoặc bất cứ thứ gì. Tôi đã sử dụng htt[]p:/[]/k[]ing[]yo-bachi.blog[]spot.c[]om/2010/05/gaego[]ogleoauth.ht[]ml
như một chút mẫu cho điệu nhảy Oauth của tôi vì các ví dụ của Google đã lỗi thời & sử dụng thư viện Google dữ liệu cũ 1.0 - tôi nghĩ vậy.
Các lỗi mà tôi nhận được khi tôi đi đến trang thử nghiệm của tôi là
Traceback (most recent call last):
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 511, in __call__
handler.get(*groups)
File "/base/data/home/apps/mustrun2sun/1.341947133742569880/main.py", line 170, in get
feed = client.GetDocList(auth_token=gdata.gauth.AeLoad(users.get_current_user().user_id())) #auth_token=TOKEN
File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/docs/client.py", line 141, in get_doclist
auth_token=auth_token, **kwargs)
File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/client.py", line 635, in get_feed
**kwargs)
File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/client.py", line 308, in request
response, Unauthorized)
Unauthorized: Unauthorized - Server responded with: 401, <HTML>
<HEAD>
<TITLE>Token invalid - Invalid AuthSub token.</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Token invalid - Invalid AuthSub token.</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
Ngoài ra, vì đây là cứng w/o bất kỳ mã nguồn, dưới đây là các mã có liên quan:
import gdata.auth
import gdata.gauth
import gdata.docs.client
import gdata.docs.data
import gdata.docs.service
import gdata.alt.appengine
from aeoid import middleware, users
class GetOauthToken(webapp.RequestHandler):
def get(self):
user_id = users.get_current_user().user_id()
saved_request_token = gdata.gauth.AeLoad("tmp_"+user_id)
gdata.gauth.AeDelete ("tmp_" + user_id)
request_token = gdata.gauth.AuthorizeRequestToken(saved_request_token, self.request.uri)
#upgrade the token
access_token = client.GetAccessToken(request_token)
#save the upgraded token
gdata.gauth.AeSave(access_token, user_id)
self.redirect('/test')
class Test(webapp.RequestHandler):
def get(self):
TOKEN = gdata.gauth.AeLoad(users.get_current_user().user_id())
if TOKEN:
client = gdata.docs.client.DocsClient(source=SETTINGS['APP_NAME'])
client.auth_token = gdata.gauth.AeLoad(users.get_current_user().user_id()) #could try to put back as TOKEN?
self.response.out.write('moo baby')
client.ssl = True
feed = client.GetDocList(auth_token=gdata.gauth.AeLoad(users.get_current_user().user_id())) #auth_token=TOKEN
self.response.out.write(feed)
self.response.out.write('moo boobob')
self.response.headers['Content-Type'] = 'text/plain'
for entry in feed.entry:
self.response.out.writeln(entry.title.text)
else:
# Get unauthorized request token
gdata.gauth.AeDelete(users.get_current_user().user_id())
client = gdata.docs.client.DocsClient(source=SETTINGS['APP_NAME'])
client.ssl = True # Force communication through HTTPS
oauth_callback_url = ('http://%s/get_oauth_token' %
self.request.host)
request_token = client.GetOAuthToken(
SETTINGS['SCOPES'], oauth_callback_url, SETTINGS['CONSUMER_KEY'],
consumer_secret=SETTINGS['CONSUMER_SECRET'])
gdata.gauth.AeSave(request_token, "tmp_"+users.get_current_user().user_id())
# Authorize request token
domain = None#'cornellsun.com'
self.redirect(str(request_token.generate_authorization_url(google_apps_domain=domain)))
Tôi đã tìm kiếm cao và thấp trên web để có câu trả lời & Tôi chưa thể tìm thấy câu trả lời.
Aeoid (hoặc lib openid khác) có thể cần thiết cho OAuth + OpenID combo. – iamgopal
@iamgopal - bạn đã đọc câu trả lời của tôi chưa? – sje397