2010-11-13 35 views
15

Tôi đang cố gắng thiết lập ứng dụng Facebook (iframe) của mình để sử dụng OAuth để xác thực. Tôi đã sử dụng số python-sdk từ Facebook, nhưng tôi chưa thực sự hài lòng với kết quả.Đăng nhập OAuth trên Facebook cho ứng dụng canvas khung nội tuyến hiển thị hình ảnh logo và chú thích Chuyển đến Facebook.com thay vì đăng nhập

Vấn đề là khi tôi chuyển hướng người dùng mà không bao giờ truy cập ứng dụng của tôi đến trang đăng nhập, iframe tôi diplays một trang trung gian xấu xí, chẳng hạn như một sau:

The page I'm getting

Nếu người dùng nhấp chuột trên liên kết "Truy cập vào Facebook.com", sau đó cô được chuyển hướng đến trang "Yêu cầu quyền" chuẩn.

Standard Request for Permission page

Có cách nào để tránh những trang đầu tiên và dẫn người dùng thẳng đến thứ hai?

Sự cố này xảy ra trên lần truy cập đầu tiên cho người dùng chưa cấp bất kỳ quyền nào cho ứng dụng của tôi.

Mã đăng nhập được dựa trên ví dụ OAuth trong Python SDK:

class LoginHandler(BaseHandler): 
    def get(self): 
     verification_code = self.request.get("code") 
     args = dict(client_id=FACEBOOK_APP_ID, redirect_uri=self.request.path_url) 
     if self.request.get("code"): 
      args["client_secret"] = FACEBOOK_APP_SECRET 
      args["code"] = self.request.get("code") 
      raw_response = urllib.urlopen(
       "https://graph.facebook.com/oauth/access_token?" + 
       urllib.urlencode(args)).read() 
      logging.debug("access_token raw response " + raw_response) 
      response = cgi.parse_qs(raw_response) 
      access_token = response["access_token"][-1] 

      # Download the user profile and cache a local instance of the 
      # basic profile info 
      graph = facebook.GraphAPI(access_token) 
      profile = graph.get_object("me") 

      user = User.get_by_key_name(profile["id"]) 
      if not user: 
       user = User(key_name=str(profile["id"]), 
           id=str(profile["id"]), 
           name=profile["name"], 
           firstname=profile["first_name"], 
           profile_url=profile["link"], 
           access_token=access_token) 
       user.put() 
      elif user.access_token != access_token: 
       # we already know this user, but we need to update 
       user.access_token = access_token 
       user.put() 

      set_cookie(self.response, "fb_user", str(profile["id"]), 
         expires=time.time() + 30 * 86400) 

      self.response.headers["P3P"] = 'CP="IDC CURa ADMa OUR IND PHY ONL COM STA"' 
      self.redirect("/") 
     else: 
      self.redirect(
       "https://graph.facebook.com/oauth/authorize?" + 
       urllib.urlencode(args)) 
+0

Trang đầu tiên có hiển thị nếu bạn thực sự đã đăng nhập hay không đến Facebook? Theo kinh nghiệm của tôi, hành vi này rất khác nhau tùy thuộc vào việc người dùng của bạn có đăng nhập vào Facebook hay không và nếu người dùng của bạn đã chấp nhận đơn đăng ký của bạn hay chưa. –

+0

Trang hiển thị cho đến khi người dùng chấp nhận chấp nhận đơn đăng ký của tôi, bất kể anh ta đang đăng nhập hay chưa. – abahgat

Trả lời

10

Sự cố là do mã Facebook sử dụng để thoát khỏi iframe. Một lỗi đã được nộp trên bugzilla của Facebook: http://bugs.developers.facebook.net/show_bug.cgi?id=11326

Giải pháp duy nhất được biết đến vấn đề này là để làm chuyển hướng đầu tiên https://graph.facebook.com/oauth/authorize? từ phía khách hàng (ví dụ: Via JavaScript), sử dụng

<script type='text/javascript'> 
top.location.href="https://graph.facebook.com/oauth/authorize?....... 
</script> 

Điều này có thể được kích hoạt khi người dùng nhấp vào một số phần tử (ví dụ: nút đăng nhập) hoặc bất cứ khi nào một trang cụ thể được truy cập (chỉ cần bao gồm trang đó trong đầu HTML).

+0

Chuyển hướng được xử lý như thế nào? Tôi không thể chuyển hướng đến apps.facebook.com/myapp vì facebook chỉ cho phép chuyển hướng đến URL trang web của tôi. – shmichael

+0

Nó được thực hiện thông qua JavaScript (và đó là những gì tôi không thích giải pháp này). – abahgat

+0

cảm ơn nó tiết kiệm thời gian của tôi :) – Xenon

0

Trang đầu tiên là một lỗi. Bạn hoàn toàn có thể tránh được trang đó. Vấn đề có thể liên quan đến cách bạn đang thực hiện chuyển hướng đến trang đăng nhập ngay từ đầu. Không có mẫu mã, đó thực sự là câu trả lời hay nhất tôi có thể đưa ra.

+0

Vâng, đó là tốt để nghe, ít nhất. Và tôi đã cập nhật câu hỏi của mình để bao gồm mã tôi đang sử dụng. Cảm ơn! – abahgat

1

Điều này xảy ra, rõ ràng là do lỗi ở phía Facebook ... Tôi đã tìm thấy giải pháp này.

<script type="text/javascript"> 
    top.location.href = '<?php echo $loginUrl ?>'; 
</script> 

$loginUrl = your URL 

thể làm việc theo cách này:

<script type="text/javascript"> 
    top.location.href = 'http://www.yourappUrl.com'; 
</script> 

luôn luôn sử dụng mã này trong thẻ script ...

1

có, top.location.href nên làm các trick. Nếu bạn gặp sự cố khi ứng dụng chia nhỏ iframe, hãy đảm bảo bạn sử dụng url trang PAGE trong chuyển hướng của bạn, thay cho url canvas (trong cài đặt ứng dụng của bạn)

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