2010-05-14 43 views
5

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.

Trả lời

0

Tôi có cá nhân không làm việc với OAuth, nhưng một vài điều tôi nhận thấy rằng có thể (hoặc không thể) giúp đỡ:

  1. Lỗi 401 là khả năng một lỗi HTTP 401, có nghĩa là các Url xác thực hợp lệ nhưng bắt buộc. Điều này rõ ràng được giải thích bởi nỗ lực OAuth không thành công, nhưng cũng có thể là điều quan trọng để chuyển hướng người dùng không đăng nhập vào một trang khác.

  2. Lỗi xảy ra khi bạn gán biến nguồn cấp dữ liệu của mình. Tham số auth_token có được cho là tên người dùng không?

3.Bạn đang sử dụng dòng.

gdata.gauth.AeLoad(users.get_current_user().user_id()) 

thường xuyên. Mặc dù nó có thể không liên quan đến các vấn đề auth của bạn, bạn có lẽ sẽ tốt hơn khi thực hiện truy vấn này một lần và lưu trữ nó trong một biến. Sau đó, khi bạn cần nó một lần nữa, truy cập nó theo cách đó. Nó sẽ cải thiện tốc độ của ứng dụng của bạn.

Một lần nữa, tôi xin lỗi vì tôi không có trải nghiệm OAuth cụ thể. Tôi chỉ cố gắng để quét và tìm thấy một số điều có thể châm ngòi bạn vào con đường bên phải.

3

Tôi có một con trăn làm việc App App Engine có sử dụng OpenID, và OAuth để có được danh bạ google của bạn:

http://github.com/sje397/Chess

Nó đang chạy tại địa chỉ:

http://your-move.appspot.com

Lưu ý rằng Aeoid không cần thiết nữa, vì App Engine có hỗ trợ built-in OpenID.

+0

Aeoid (hoặc lib openid khác) có thể cần thiết cho OAuth + OpenID combo. – iamgopal

+0

@iamgopal - bạn đã đọc câu trả lời của tôi chưa? – sje397

1

Tôi vừa phát hiện ra lãng phí một vài giờ, bạn cũng nhận được 401 nếu URL không chính xác.

Trong ví dụ của tôi, tôi đã làm

.../buzz/v1/activities/@me/@self**?&**alt=json 

Thay vì

.../buzz/v1/activities/@me/@self**?**alt=json 
Các vấn đề liên quan