সাফারি ২ য় পক্ষের কুকি ইফতারে ট্রিক আর কাজ করছে না?


137

সুতরাং এটি "সাফারিতে কাজ করার জন্য আমি তৃতীয় পক্ষের কুকিজ কীভাবে পাব" প্রশ্নটির অষ্টাদশ প্রতিশোধ is তবে আমি আবার জিজ্ঞাসা করছি কারণ আমি মনে করি যে খেলার ক্ষেত্রটি পরিবর্তিত হয়েছে, সম্ভবত ফেব্রুয়ারী ২০১২ এর পরে। তৃতীয় স্থান অর্জনের মানক কৌশলগুলির মধ্যে একটি সাফারিতে পার্টির কুকিগুলি নিম্নরূপ ছিল: কোনও লুকানো আইফ্রেমে পোস্ট করার জন্য কিছু জাভাস্ক্রিপ্ট ব্যবহার করুন। এটি (অভ্যস্ত) সাফারিটিকে এই ভাবনায় প্ররোচিত করেছিল যে ব্যবহারকারী তৃতীয় পক্ষের সামগ্রীর সাথে ইন্টারেক্ট করেছেন এবং তারপরে কুকিজ সেট করার অনুমতি দিন।

আমি মনে করি যে এই লুপোলটি হালকা কেলেঙ্কারির প্রেক্ষিতে বন্ধ হয়ে গিয়েছিল যেখানে প্রকাশ পেয়েছিল যে গুগল তার বিজ্ঞাপনগুলি দিয়ে সেই কৌশলটি ব্যবহার করছে। খুব কমপক্ষে, এই কৌশলটি ব্যবহার করার সময় আমি সাফারিটিতে কুকি সেট করতে পুরোপুরি অক্ষম হয়েছি। আমি কিছু এলোমেলো পোস্টে পোস্টিং সন্ধান করেছি যাতে দাবি করা হয়েছিল যে অ্যাপল লুফোলটি বন্ধ করতে কাজ করছে তবে আমি কোনও অফিসিয়াল শব্দ পাই নি।

ফ্যালব্যাক হিসাবে আমি এমনকি মূল তৃতীয় পক্ষের ফ্রেমটিকে আবার ডিজাইনিং করার চেষ্টা করেছি যাতে সামগ্রীটি লোড হওয়ার আগে আপনাকে একটি বোতামে ক্লিক করতে হয়েছিল তবে এমনকি সাফারির শীতল ঠান্ডা হৃদয়কে গলানোর জন্য সরাসরি যোগাযোগের সেই স্তরটিও যথেষ্ট ছিল না।

সুতরাং কেউ কি নিশ্চিতভাবেই জানে যে সাফারি সত্যিই এই ফাঁকটি বন্ধ করে দিয়েছে? যদি তা হয়, তবে কি অন্য কাজের ক্ষেত্রগুলি রয়েছে (প্রতিটি অনুরোধে ম্যানুয়ালি একটি সেশন আইডি সহ)?


21
তৃতীয় পক্ষের আইফ্রেমে যে কুকিগুলির প্রয়োজন তা ব্যবহার করা অবশ্যই কোনও সংজ্ঞা দ্বারা সুরক্ষা আক্রমণ নয়! আমরা একটি ওয়েবশপ চালনা করি যা বিভিন্ন ডোমেইনের প্রচুর পরিমাণে একটি আইফ্রেমে ব্যবহৃত হয়, এবং সাফারির সাথে শেষ পর্যন্ত সমস্ত ধরণের সমস্যা রয়েছে, তাই আমি এই (বৈধ) প্রশ্নের উত্তরের জন্যও খুব আগ্রহী।
এমসচা

14
খুব সুন্দর যে যারা ফেসবুক অ্যাপ্লিকেশনগুলি তৈরি করে তাদের সাফারিটির সাথে এই সমস্যাটি রয়েছে। ফেসবুক অ্যাপ্লিকেশনগুলি একটি আইফ্রেমে এবং সংজ্ঞা অনুসারে চালিত হয়, সমস্ত তৃতীয় পক্ষ থেকে আসে। এ কারণেই ফেসবুক অ্যাপ্লিকেশনগুলিতে সাফারির জন্য সমর্থন কিছুটা দোষযুক্ত: আপনি কুকি ব্যবহার করতে পারবেন না।
জিএস হারলে

আমি সাফারি 5.1.7 এ এই সমস্যাটি পুনরুত্পাদন করতে পারি না। এটি আমার ফেসবুক অ্যাপ্লিকেশন থেকে কুকিকে ডিফল্ট "কোনও তৃতীয় পক্ষের কুকিজ" সেটিংসের সাথে iframe গ্রহণ করে। তবে একই সেটিংস সহ ক্রোম 19.0.1084.46 কুকি অবরোধ করে।
এভজেনি শ্যাডনেভ

4
ক্রোম 19+ এর সাথে (কৃতজ্ঞতার সাথে) অ-ডিফল্ট "তৃতীয় পক্ষের কুকিজ এবং সাইট ডেটা ব্লক করুন" বিকল্পটি চেক করা হয়েছে / এমনকি কঠোর / সাফারির ডিফল্ট "তৃতীয় পক্ষ এবং বিজ্ঞাপনদাতাদের কুকিগুলি ব্লক করুন" সেটিংসের চেয়েও কঠোর। ক্রোমে, আপনি যদি তৃতীয় পক্ষের ডোমেনটিতে যান এবং কুকিজ সেট করে থাকেন তবে সেগুলি আইফ্রেমে স্থানান্তরিত হবে না। ব্যবহারকারীকে অবশ্যই তার ক্রোম সুরক্ষা সেটিংসে আপনার ডোমেনের জন্য একটি "ব্যতিক্রম" যুক্ত করতে হবে।
অ্যারন জিব্রাল্টার

ফেব্রুয়ারী 2012 এর অর্থ কী? সাফারিতে কোনও প্রযুক্তিগত পরিবর্তন আছে বা আইন পরিবর্তন হচ্ছে?
তরল

উত্তর:


51

কেবল এখানে একটি সাধারণ কাজের সমাধানটি ছেড়ে দিতে চেয়েছিলেন যার ব্যবহারকারীর ইন্টারঅ্যাকশন প্রয়োজন হয় না

আমি তৈরি একটি পোস্টে যেমন বলেছি :

মূলত আপনাকে যা করতে হবে তা হ'ল আপনার পৃষ্ঠাকে শীর্ষে স্থান লোড করা, সেশন তৈরি করুন এবং এটি ফেইসবুকে পুনর্নির্দেশ করুন।

এই কোডটি আপনার শীর্ষে যুক্ত করুন index.phpএবং $page_urlআপনার অ্যাপ্লিকেশন চূড়ান্ত ট্যাব / অ্যাপ্লিকেশন URL এ সেট করুন এবং আপনি দেখতে পাবেন যে আপনার অ্যাপ্লিকেশন কোনও সমস্যা ছাড়াই কাজ করবে।

<?php
    // START SAFARI SESSION FIX
    session_start();
    $page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
    if (isset($_GET["start_session"]))
        die(header("Location:" . $page_url));

    if (!isset($_GET["sid"]))
        die(header("Location:?sid=" . session_id()));
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid):
?>
   <script>
        top.window.location="?start_session=true";
    </script>
<?php
    endif;
    // END SAFARI SESSION FIX
?>

দ্রষ্টব্য: এটি ফেসবুকের জন্য তৈরি হয়েছিল, তবে এটি অন্য যে কোনও অনুরূপ পরিস্থিতিতে কাজ করবে।


20-ডিসেম্বর-2012 সম্পাদনা করুন - স্বাক্ষরিত অনুরোধ রক্ষণ করা:

উপরের কোডটি অনুরোধ পোস্টের ডেটা বজায় রাখে না এবং আপনার আবেদন স্বাক্ষরিত অনুরোধের উপর নির্ভর করে যদি নীচের কোডটি চেষ্টা করে নি:

দ্রষ্টব্য: এটি এখনও সঠিকভাবে পরীক্ষা করা হচ্ছে এবং এটি প্রথম সংস্করণের চেয়ে কম স্থিতিশীল হতে পারে। আপনার নিজের ঝুঁকিতে / প্রতিক্রিয়া ব্যবহার প্রশংসা করা হয়

( সমাধানের উন্নতি করতে এখানে আমাকে সঠিক দিকের দিকে নির্দেশ করার জন্য সিব্রোকে ধন্যবাদ )

// Start Session Fix
session_start();
$page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
if (isset($_GET["start_session"]))
    die(header("Location:" . $page_url));
$sid = session_id();
if (!isset($_GET["sid"]))
{
    if(isset($_POST["signed_request"]))
       $_SESSION["signed_request"] = $_POST["signed_request"];
    die(header("Location:?sid=" . $sid));
}
if (empty($sid) || $_GET["sid"] != $sid)
    die('<script>top.window.location="?start_session=true";</script>');
// End Session Fix

আপনাকে ধন্যবাদ, একটি
কবজির

তাই এটি মূলত কয়েকটা পুনর্নির্দেশের সাথে কাজ করে, তাই না?
অ্যারন জিব্রাল্টার

1
@ হুগোদারহঙ্গ্রিজে আপনাকে স্বাগতম, আমি কেবল একটি নতুন সংস্করণ যুক্ত করেছি, আপনার অ্যাপ্লিকেশনগুলিতে স্বাক্ষরিত অনুরোধটি বজায় রাখার দরকার থাকলে এটি নির্দ্বিধায় দেখতে পারেন।
ডায়োগো রামিনহোস

1
@ সিব্রো যে বিষয়টি উল্লেখ করার জন্য আপনাকে অনেক ধন্যবাদ! আপনি ঠিক বলেছেন, এটি কাজ করে, যেহেতু দ্বিতীয় অনুরোধের মাধ্যমে ব্যবহারকারীর ইতিমধ্যে একটি অধিবেশন শুরু হয়েছে! আমি অনুমান করি যে "সবচেয়ে খারাপ অন্ধ সে যিনি দেখতে চান না"।
ডায়োগো রামিনহোস

1
@ হোয়াইটগল আপনি কি 1 এবং 2 প্রদর্শিত একটি পরীক্ষার কেস সরবরাহ করতে পারেন?
গজুস

35

আপনি বলেছিলেন যে আপনার ব্যবহারকারীরা সামগ্রী লোড হওয়ার আগে একটি বোতামে ক্লিক করতে রাজি ছিলেন। আমার সমাধানটি ছিল একটি বোতাম একটি নতুন ব্রাউজার উইন্ডো খোলার। এই উইন্ডোটি আমার ডোমেনের জন্য একটি কুকি সেট করে, ওপেনারকে রিফ্রেশ করে এবং তারপর বন্ধ করে দেয়।

সুতরাং আপনার মূল স্ক্রিপ্টটি দেখতে পারে:

<?php if(count($_COOKIE) > 0): ?>
<!--Main Content Stuff-->
<?php else: ?>
<a href="/safari_cookie_fix.php" target="_blank">Click here to load content</a>
<?php endif ?>

তারপরে সাফারি_কুকি_ফিক্স.এফপি দেখে মনে হচ্ছে:

<?php
setcookie("safari_test", "1");
?>
<html>
    <head>
        <title>Safari Fix</title>
        <script type="text/javascript" src="/libraries/prototype.min.js"></script>
    </head>
    <body>
    <script type="text/javascript">
    document.observe('dom:loaded', function(){
        window.opener.location.reload();
        window.close();
    })
    </script>
    This window should close automatically
    </body>
</html>

আমি এমন কিছু ভাবছিলাম। নির্দোষভাবে কাজ করে। অনুমতি ডায়ালগ সহ আমি এটি লোড করি। ধন্যবাদ!
vwoelm

দেখে মনে হচ্ছে এটি সাফারির সেটিংসের চারপাশেও কাজ করছে এবং এটি সাধারণ জ্ঞান হয়ে গেলে অন্যান্য "সমাধানগুলি" এর মতোই আঁকড়ে উঠবে। আমি পুরোপুরি একটি পৃথক সমাধানের সন্ধান করছি, কারণ এটি যথাযথভাবে স্পষ্ট হয়ে উঠছে যে তৃতীয় পক্ষের কুকিজগুলি এখন উপযুক্ত উপায়ে ব্যবহৃত হলেও শয়তান।
লোকালপিসিগুয়ে

1
এই সমাধানটি আমার পক্ষে কাজ করেছে, তবে কি পপআপটি প্রয়োজনীয়? আপনি কি নিজের আইফ্রেমে সাফারি পৃষ্ঠায় পুনর্নির্দেশ করতে পারবেন, কুকি সেট করতে পারবেন, আবার পুনর্নির্দেশ শিরোলেখ দিয়ে খেলায় ফিরে যেতে পারবেন? অথবা আপনার কী পপআপ দরকার যাতে ব্যবহারকারীর সার্ভারের সাথে সরাসরি যোগাযোগের কোনও ফর্ম থাকে?
অ্যান্টনি হেস্টিংস

এটি ভাল কাজ করেছে; ভাগ্যক্রমে, এটিকে আরম্ভ করার জন্য একটি বোতাম চাপানো আমার অ্যাপ্লিকেশনটিতে কোনও বড় বিষয় ছিল না।
littlered

@ লোকালপিসিগুই আমি এতটা নিশ্চিত নই যে এটি অন্যান্য সমাধানগুলির মতো অক্ষরিত হয়ে উঠবে কারণ এর জন্য প্রয়োজন যে কোনও ব্যবহারকারী পপআপকে অবরুদ্ধ না করার জন্য পৃষ্ঠাটিতে আসলে ক্লিক / ইন্টারঅ্যাক্ট করতে পারে। সাফারিটি এই সমাধানটি নিয়ে এসেছে বলে মনে হচ্ছে এটি কার্যকরভাবে কাজ করবে: বিজ্ঞাপনদাতারা গোপনে ক্রস-ডোমেন কুকি সেট করতে সক্ষম হবেন না এবং এম্বেড করা অ্যাপ্লিকেশনগুলির জন্য কোনও কুকি সেট করতে সক্ষম হওয়ার আগে কোনও ব্যবহারকারীকে ইন্টারঅ্যাক্ট করতে হবে।
অ্যারন জিব্রাল্টার

15

আমি সাফারিটিকে একটি .htaccess দিয়ে চালিত করেছি:

#http://www.w3.org/P3P/validator.html
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID CUR ADM DEV OUR BUS\""
Header set Set-Cookie "test_cookie=1"
</IfModule>

এবং এটি আমার জন্য কাজ করাও বন্ধ করে দিয়েছে। আমার সমস্ত অ্যাপ্লিকেশনগুলি সাফারিতে সেশনটি হারাচ্ছে এবং ফেসবুকের বাইরে চলে যাচ্ছে। যেহেতু আমি এই অ্যাপ্লিকেশনগুলি ঠিক করার তাগিদে রয়েছি, আমি বর্তমানে একটি সমাধান খুঁজছি আমি আপনাকে পোস্ট রাখতে হবে।

সম্পাদনা (2012-04-06): আপেল আপেল এটি 5.1.4 দিয়ে "স্থির" করেছে। আমি নিশ্চিত এটি গুগল-জিনিসের প্রতিক্রিয়া: "এর কুকি নীতি প্রয়োগের ক্ষেত্রে একটি সমস্যা বিদ্যমান ছিল। সাফারিতে" ব্লক কুকিজ "পছন্দটি ডিফল্ট সেটিংসে সেট করা থাকলে তৃতীয় পক্ষের ওয়েবসাইটগুলি কুকিজ সেট করতে পারে" তৃতীয় পক্ষ এবং বিজ্ঞাপনদাতাদের থেকে "। Http://support.apple.com/kb/HT5190


1
স্পষ্টতই অ্যাপল এটি 5.1.4 দিয়ে "স্থির" করেছে। আমি নিশ্চিত এটি গুগল-জিনিসের প্রতিক্রিয়া: "এর কুকি নীতি প্রয়োগের ক্ষেত্রে একটি সমস্যা বিদ্যমান ছিল। সাফারিতে" ব্লক কুকিজ "পছন্দটি ডিফল্ট সেটিংসে সেট করা থাকলে তৃতীয় পক্ষের ওয়েবসাইটগুলি কুকিজ সেট করতে পারে" তৃতীয় পক্ষের এবং বিজ্ঞাপনদাতাদের থেকে "। support.apple.com/kb/HT5190
vwoelm

1
সুতরাং আমি মনে করি ভোয়েলমের এই মন্তব্যটি আমি যে উত্তরটির সন্ধান করছিলাম তার নিকটতম। প্রথম এবং সর্বাগ্রে, আমি নিশ্চিত হতে চেয়েছিলাম যে অ্যাপল স্পষ্টতই লুপফোলটি বন্ধ করে দিয়েছে এবং অ্যাপল সমর্থন নিবন্ধের উল্লেখ কেবল এটিই। আমার প্রশ্নের দ্বিতীয় অংশটি যদিও এখনও সম্পর্কিত। কাজের ক্ষেত্রগুলির জন্য বিকল্পগুলির সীমাটি কী। স্পষ্টতই, আমরা GET / POST প্যারাম হিসাবে সেশন আইডিগুলি এনকোড করতে পারি তবে অন্যান্য বিকল্পগুলি কী। স্থানীয় স্টোরেজ কি এই প্রসঙ্গে কাজ করে? ফ্ল্যাশ কুকিজ?
জিএস হারলে

@ ভোয়েল্ম: এটিই আমি উত্তর খুঁজছিলাম (তবে আশা করি না)। যদি আপনি কোনও মন্তব্যের পরিবর্তে কোনও উত্তরে এটি রাখেন, আমি আপনাকে অনুগ্রহ বরাদ্দ করব।
এমসচা

3
@gshurley আমি মনে করি GET / POST প্যারামের মাধ্যমে সেশন আইডি প্রেরণাই একমাত্র বিকল্প। এটি অনিরাপদ, তবে তারপরে আবার ফেসবুক আমাদেরকে যাইহোক SSL ছাড়াই ক্যানভাস অ্যাপ্লিকেশন সরবরাহ করতে বাধ্য করে। আর তাছাড়া ফেসবুক অ্যাপ হ্যাক করে আপনি কী পাবেন? আমরা অ্যাপলের করুণায় রয়েছি এবং তারা বর্তমানে নিষ্ঠুর মোডে আছে।
হেকিভিন্ত্রান

14

আপনার রুবে অন রেলস নিয়ন্ত্রকটিতে আপনি ব্যবহার করতে পারেন:

private

before_filter :safari_cookie_fix

def safari_cookie_fix
  user_agent = UserAgent.parse(request.user_agent) # Uses useragent gem!
  if user_agent.browser == 'Safari' # we apply the fix..
    return if session[:safari_cookie_fixed] # it is already fixed.. continue
    if params[:safari_cookie_fix].present? # we should be top window and able to set cookies.. so fix the issue :)
      session[:safari_cookie_fixed] = true
      redirect_to params[:return_to]
    else
      # Redirect the top frame to your server..
      render :text => "<script>alert('start redirect');top.window.location='?safari_cookie_fix=true&return_to=#{set_your_return_url}';</script>"
    end
  end
end

সাফারিতে সেশনগুলির সাথে কি একই রকম সমস্যা আছে?
কারাগারের শুরু

আপনি set_your_return_url কে অনুরোধ করুন.ইনভিতে ['HTTP_REFERER'] এ প্রতিস্থাপন করতে পারেন কারণ আমরা একটি আইফ্রেমে ভিতরে
রয়েছি :

আমি এই সমাধানটি চেষ্টা করেছি, এবং একমাত্র সমস্যা হ'ল আমি পিতা বা মাতা iframe url এ ফিরে আসতে পারি না। পিতামাতার iframe এর ইউআরএল পাওয়ার জন্য কি রেলগুলিতে কোনও পদ্ধতি আছে? ধন্যবাদ
আদর্শ

এতে আমার সময় লেগেছে তবে শেষ পর্যন্ত আমি বুঝতে পেরেছি যে সহজতম উপায় (টিএমও) হ'ল এটিকে রেল অ্যাপ্লিকেশনটির পুনঃনির্দেশ url এ কোয়েরি-স্ট্রিং প্যারামিটার হিসাবে যুক্ত করা। নোংরা এবং পরিষ্কার।
গায়ালোনি

1
এই উত্তরটি একটি উন্মুক্ত পুনর্নির্দেশকারী তৈরি করে, যা একটি সাধারণ সুরক্ষা সমস্যা। বিপজ্জনক কোডটি হ'ল redirect_to params[:return_to]। পুনঃনির্দেশের জন্য সেই পরমকে নিরাপদ জায়গাগুলির একটি শ্বেত তালিকার বিরুদ্ধে পরীক্ষা করা দরকার। দেখুন owasp.org/index.php/...
phylae

13

আমার নির্দিষ্ট পরিস্থিতির জন্য আমি উইন্ডো.পস্টম্যাসেজ () ব্যবহার করে এবং যেকোন ব্যবহারকারীর মিথস্ক্রিয়া দূর করে সমস্যার সমাধান করেছি। মনে রাখবেন এটি কেবল তখনই কাজ করবে যদি আপনি কোনওভাবে প্যারেন্ট উইন্ডোতে জেএস চালাতে পারেন। হয় এটির দ্বারা আপনার ডোমেন থেকে একটি জেএস অন্তর্ভুক্ত করা হয়েছে, অথবা যদি আপনার উত্সটিতে সরাসরি অ্যাক্সেস থাকে।

আইফ্রেমে (ডোমেন-বি) আমি কুকির উপস্থিতি যাচাই করি এবং এটি সেট না করা থাকলে পিতামাতার (ডোমেন-এ) একটি পোস্টমেসেজ প্রেরণ করব। যেমন;

if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1
    && document.cookie.indexOf("safari_cookie_fix") < 0) {
    window.parent.postMessage(JSON.stringify({ event: "safariCookieFix", data: {} }));
}

তারপরে প্যারেন্ট উইন্ডোতে (ডোমেন-এ) ইভেন্টটি শুনুন।

if (typeof window.addEventListener !== "undefined") {
    window.addEventListener("message", messageReceived, false);
}

function messageReceived (e) {
    var data;

    if (e.origin !== "http://www.domain-b.com") {
        return;
    }

    try {
        data = JSON.parse(e.data);
    }
    catch (err) {
        return;
    }

    if (typeof data !== "object" || typeof data.event !== "string" || typeof data.data === "undefined") {
        return;
    }

    if (data.event === "safariCookieFix") {
        window.location.href = e.origin + "/safari/cookiefix"; // Or whatever your url is
        return;
    }
}

অবশেষে আপনার সার্ভারে (http://www.domain-b.com/safari/cookiefix) আপনি কুকি সেট করেছেন এবং ব্যবহারকারী যেদিকে এসেছে সেদিকে ফিরে যেতে হবে। উদাহরণের নীচে ASP.NET MVC ব্যবহার করা হচ্ছে

public class SafariController : Controller
{
    [HttpGet]
    public ActionResult CookieFix()
    {
        Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "1"));

        return Redirect(Request.UrlReferrer != null ? Request.UrlReferrer.OriginalString : "http://www.domain-a.com/");
    }

}

আপনি পোস্টমেসেজে আপনার কল দিয়ে সিনট্যাক্স ত্রুটি পাচ্ছেন না?
আকসৌমতা

সিনট্যাক্স ত্রুটিটি ঠিক "*"করতে দ্বিতীয় প্যারামিটার যুক্ত করা দরকারPostMessage
মাইকেল বাল্ড্রি

আমি এই উত্তর আরও upvotes দিতে পারে আশা করি। প্রকৃতপক্ষে এই সমস্যাটির সমাধান করার সহজতম এবং সঠিক উপায় most পোষ্টটির জন্য আপনাকে ধন্যবাদ!
অ্যারোনপি

9

আমারও একই সমস্যা ছিল এবং আজ আমি একটি স্থিতি খুঁজে পেয়েছি যা আমার পক্ষে ভাল কাজ করে। যদি ব্যবহারকারী এজেন্ট থাকে Safariএবং কোনও কুকিজ সেট না করা থাকে, তবে আমি ব্যবহারকারীকে OAuth ডায়ালগে পুনর্নির্দেশ করব:

<?php if ( ! count($_COOKIE) > 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')) { ?>
<script type="text/javascript">
    window.top.location.href = 'https://www.facebook.com/dialog/oauth/?client_id=APP_ID&redirect_uri=MY_TAB_URL&scope=SCOPE';
</script>
<?php } ?>

প্রমাণীকরণ এবং অনুমতি চাওয়ার পরে ওআউথ ডায়ালগটি আমার ইউআরআই-এর উপরে শীর্ষে স্থানান্তরিত হবে। সুতরাং কুকি সেট করা সম্ভব। আমাদের সমস্ত ক্যানভাস এবং পৃষ্ঠা ট্যাব অ্যাপের জন্য আমি ইতিমধ্যে নিম্নলিখিত স্ক্রিপ্টটি অন্তর্ভুক্ত করেছি:

<script type="text/javascript">
    if (top.location.href==location.href) top.location.href = 'MY_TAB_URL';
</script>

সুতরাং ব্যবহারকারীকে ইতিমধ্যে সেট করে একটি বৈধ কুকি সহ ফেসবুক পৃষ্ঠা ট্যাবে পুনঃনির্দেশিত করা হবে এবং স্বাক্ষরিত অনুরোধটি আবার পোস্ট করা হবে।


এই উপর দুর্দান্ত কাজ। আমি ব্যবহারকারী এজেন্ট চেক আপডেট করেছিলাম তা নিশ্চিত করার জন্য যে ক্রোমের ব্যবহারকারী এজেন্ট স্ট্রিংয়ের মধ্যেও ক্রিম সাফারি রয়েছে তাই না। আপনার ডোমেনের পৃষ্ঠাতে পুনর্নির্দেশ, প্রয়োজনীয় কুকিজ সেট করা / সেশন শুরু করা এবং তারপরে অ্যাপস.ফেসবুক.কম এ আপনার অ্যাপে পুনঃনির্দেশিত করা কবজির মতো কাজ করেছে। নির্বোধ মনে হয়, কিন্তু ভাল কাজ করে। টিপসের জন্য ধন্যবাদ সাসাচা!
মাইক 14

7

পরিশেষে আমি পিএইচপিতে কুকিজগুলি সেট করছি বলে যেহেতু কিছুটা সামান্য সামঞ্জস্য করার সাথে সাথে সাসচা সরবরাহ করেছিলেন তার সাথে আমি একই ধরণের সমাধানের জন্য গেলাম:

// excecute this code if user has not authorized the application yet
// $facebook object must have been created before

$accessToken = $_COOKIE['access_token']

if ( empty($accessToken) && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {

    $accessToken = $facebook->getAccessToken();
    $redirectUri = 'https://URL_WHERE_APP_IS_LOCATED?access_token=' . $accessToken;

} else {

    $redirectUri = 'https://apps.facebook.com/APP_NAMESPACE/';

}

// generate link to auth dialog
$linkToOauthDialog = $facebook->getLoginUrl(
    array(
        'scope'         =>  SCOPE_PARAMS,
        'redirect_uri'  =>  $redirectUri
    )
);

echo '<script>window.top.location.href="' . $linkToOauthDialog . '";</script>';

এটি যা করে তা ব্রাউজার সাফারি হওয়ার সময় কুকি পাওয়া যায় কিনা তা যাচাই করা হয়। পরের ধাপে, আমরা অ্যাপ্লিকেশন ডোমেনে আছি, যার অর্থ ইউআরআই URL_WHERE_APP_IS_LOCATED উপরে দেওয়া আছে।

if (isset($_GET['accessToken'])) {

    // cookie has a lifetime of only 10 seconds, so that after
    // authorization it will disappear
    setcookie("access_token", $_GET['accessToken'], 10); 

} else {

  // depending on your application specific requirements
  // redirect, call or execute authorization code again
  // with the cookie now set, this should return FB Graph results

}

সুতরাং অ্যাপ্লিকেশন ডোমেনে পুনঃনির্দেশিত হওয়ার পরে, একটি কুকি স্পষ্টভাবে সেট করা আছে, এবং আমি ব্যবহারকারীকে অনুমোদনের প্রক্রিয়াতে পুনর্নির্দেশ করি।

আমার ক্ষেত্রে (যেহেতু আমি কেকপিএইচপি ব্যবহার করছি তবে এটি অন্য যে কোনও এমভিসি কাঠামোর সাথে ঠিকঠাক কাজ করা উচিত) আমি আবার লগইন ক্রিয়াকে কল করছি যেখানে এফবি অনুমোদনটি অন্য সময় কার্যকর করা হয়, এবং এবার বিদ্যমান কুকির কারণে এটি সফল হয়।

একবার অ্যাপ্লিকেশনটি অনুমোদিত করার পরে, সাফারি (5.1.6) এর সাথে অ্যাপ্লিকেশনটি ব্যবহার করতে আমার আর কোনও সমস্যা হয়নি

আশা করি যে কেউ সাহায্য করতে পারে।


1
এটি আমার জন্য কাজ করেছে !! ধন্যবাদ !! .. সাফারি 5.1.7 এর সাথে আমার এই সমস্যাটি ছিল ... এখন এটি সমাধান হয়েছে!
খালিজার

5

আইওএস চলমান ডিভাইসে আমার এই সমস্যা হয়েছিল had আমি একটি দোকান তৈরি করেছি যা একটি সাধারণ ওয়েবসাইটে একটি আইফ্রেমে ব্যবহার করে এম্বেডযোগ্য। যাইহোক, প্রতিটি পেজ লোডে ব্যবহারকারী একটি নতুন সেশননিড পেয়েছিল, ফলে ব্যবহারকারীরা প্রক্রিয়াটির অর্ধেক অংশ আটকে যায় কারণ কিছু মান সেশনে উপস্থিত ছিল না।

আমি এই পৃষ্ঠায় প্রদত্ত কয়েকটি সমাধানের চেষ্টা করেছি, তবে পপআপগুলি কোনও আইপ্যাডে খুব ভাল কাজ করে না এবং আমার সর্বাধিক স্বচ্ছ সমাধান প্রয়োজন।

আমি এটি পুনর্নির্দেশ ব্যবহার করে সমাধান করেছি। আমার সাইট এম্বেড করা ওয়েবসাইটটি অবশ্যই প্রথমে ব্যবহারকারীকে আমার সাইটে পুনর্নির্দেশ করতে হবে, সুতরাং শীর্ষে ফ্রেমে আমার সাইটটিতে ইউআরএল রয়েছে, যেখানে আমি একটি কুকি সেট করেছি এবং ব্যবহারকারীকে আমার সাইটের এম্বেড করা ওয়েবসাইটের যথাযথ পৃষ্ঠায় পুনর্নির্দেশ করব, এটি পাস হয়েছে ইউআরএল মাধ্যমে।

পিএইচপি কোড উদাহরণ

রিমোট ওয়েবসাইট ব্যবহারকারীকে পুনঃনির্দেশ করে

http://clientname.example.com/init.php?redir=http://www.domain.com/shop/frame

init.php

<?php
// set a cookie for a year
setcookie('initialized','1',time() + 3600 * 24 * 365, '/', '.domain.com', false, false);
header('location: ' . $_GET['redir']);
die;

ব্যবহারকারী http://www.domain.com/shop/frameযেখানে আমার সাইট এম্বেড করা আছে সেখানে সেশনগুলি যেমনটি করা উচিত তেমন সংরক্ষণ এবং কুকিজ খাওয়া শেষ করে eating

আশা করি এটি কাউকে সাহায্য করবে।


3

আমাকে আমার ফিক্সটি এএসপি.নেট এমভিসি 4 এ ভাগ করতে দিন PH পিএইচপি-র সঠিক উত্তরের মতো মূল ধারণা। পরবর্তী কোডটি স্ক্রিপ্ট বিভাগের নিকটে শিরোনামের প্রধান লেআউটে যুক্ত হয়েছে:

@if (Request.Browser.Browser=="Safari")
{
    string pageUrl = Request.Url.GetLeftPart(UriPartial.Path);
    if (Request.Params["safarifix"] != null && Request.Params["safarifix"] == "doSafariFix")
    {
        Session["IsActiveSession"] = true;
        Response.Redirect(pageUrl);
        Response.End();
    }
        else if(Session["IsActiveSession"]==null)
    {
        <script>top.window.location = "?safarifix=doSafariFix";</script>
    }
}

3

এই সমাধানটি কিছু ক্ষেত্রে প্রযোজ্য - যদি সম্ভব হয়:

যদি iframe সামগ্রী পৃষ্ঠাটি iframeযুক্ত পৃষ্ঠার একটি সাবডোমেন ব্যবহার করে, কুকি আর অবরুদ্ধ থাকে না।


এটি দরকারী তথ্য - ঠিক আমি যা খুঁজছিলাম। যদিও আমি নিশ্চিত যে বেশিরভাগ লোকেরা চারপাশে ডোমেনগুলি পরিবর্তন করতে পারে না, আমি এটিই করতে যাচ্ছি। আমি যে সাইটটি এম্বেড করছি তাতে একটি <mycompany> তৈরি করুন <<< থিম্পর্প্যানি> com কম ডোমেনের জন্য আমার আইপি এবং আমার পক্ষের একটি ভিহোস্টের মানচিত্র এবং আইফ্রেমে সেই URL টি ব্যবহার করুন use জটিল, তবে বুলেটপ্রুফ হওয়া উচিত।
শ্রুতি সাফারি

1
আপনি সাবডোমেনের সাথে https ব্যবহার করতে পারলে এটি জটিল হয়ে উঠতে পারে, যেহেতু সাবডোমেন সার্ভারের সাথে ম্যাচ করার জন্য একটি এসএসএল শংসাপত্রের প্রয়োজন হবে।
রজার হলিবার্টন

1

গুগল আসলে বিড়ালটিকে ব্যাগ থেকে বের করে দেয় let তারা ট্র্যাকিং কুকিজ অ্যাক্সেস করার জন্য এটি কিছুক্ষণ ব্যবহার করছিল। এটি প্রায় অবিলম্বে অ্যাপল = fixed দ্বারা ঠিক করা হয়েছিল

আসল ওয়াল স্ট্রিট জার্নাল পোস্ট


আমি গুগল জিনিসটি সম্পর্কে জানি, তবে আমি অ্যাপল সম্পর্কে আসলে এটিকে "ফিক্সিং" করতে (এবং অর্ধেক ইন্টারনেট ভাঙার) কিছুই দেখিনি। আপনার কি কোনও বিবরণ আছে?
মিশচা

1

এখানে আমি ব্যবহার করি এমন কিছু কোড। আমি দেখতে পেলাম যে আমি যদি আমার সাইট থেকে কোনও কুকি সেট করি তবে কুকিজগুলি তখন থেকে জাদুকরভাবে আইফ্রেমে কাজ করে।

http://developsocialapps.com/foundations-of-a-facebook-app-framework/

 if (isset($_GET['setdefaultcookie'])) {
        // top level page, set default cookie then redirect back to canvas page
        setcookie ('default',"1",0,"/");
        $url = substr($_SERVER['REQUEST_URI'],strrpos($_SERVER['REQUEST_URI'],"/")+1);
        $url = str_replace("setdefaultcookie","defaultcookieset",$url);
        $url = $facebookapp->getCanvasUrl($url);
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    } else if ((!isset($_COOKIE['default'])) && (!isset($_GET['defaultcookieset']))) {
        // no default cookie, so we need to redirect to top level and set
        $url = $_SERVER['REQUEST_URI'];
        if (strpos($url,"?") === false) $url .= "?";
        else $url .= "&";
        $url .= "setdefaultcookie=1";
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    }

1

অন্যরা কী পোস্ট করেছে তার পিএইচপি-তে সামান্য সরল সংস্করণ:

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
    print '<script>top.window.location="https://example.com/?start_session=true";</script>';
    exit();
}

if (isset($_GET['start_session'])) {
    header("Location: https://apps.facebook.com/YOUR_APP_ID/");
    exit();
}

1

আমি এর সঠিক উত্তরটি পেয়েছি, অ্যালান নামক একটি লোককে ধন্যবাদ, যা এখানে সমস্ত কৃতিত্বের দাবিদার। ( http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/ )

তার সমাধানটি সহজ এবং সহজেই বোঝা যায়।

Iframe কন্টেন্ট সার্ভারে (ডোমেন 2), মূল ডোমেন স্তরে স্টার্টেসিওন.এফপি নামে একটি ফাইল যুক্ত করুন যা এতে রয়েছে:

<?php
// startsession.php
session_start();
$_SESSION['ensure_session'] = true;
die(header('location: '.$_GET['return']));

এখন শীর্ষ স্তরের ওয়েবসাইটে যদি আইফ্রেমে (ডোমেন 1) রয়েছে, তবে আইফ্রেমে থাকা পৃষ্ঠায় কলটি দেখতে পাওয়া উচিত:

<a href="https://domain2/startsession.php?return=http://domain1/pageWithiFrame.html">page with iFrame</a>

এবং এটাই! সরল :)

এটি কাজ করার কারণ হ'ল আপনি ব্রাউজারটি কোনও তৃতীয় পক্ষের ইউআরএলকে পরিচালনা করছেন এবং এইভাবে আইফ্রেমের মধ্যে সামগ্রীটি দেখানোর আগে এটি বিশ্বাস করতে বলছেন।


0

আমি সংশোধিত (লিঙ্কটিতে স্বাক্ষরিত_পরিমিত প্যারাম যুক্ত) ব্যবহার করেছি হোয়াইটগলের কৌশল এবং এটি সাফারিটির পক্ষে ঠিক কাজ করেছে, তবে আইআই সেই ক্ষেত্রে পৃষ্ঠাটি ক্রমাগত রিফ্রেশ করছে। সুতরাং সাফারি এবং ইন্টারনেট এক্সপ্লোরারের জন্য আমার সমাধানটি হ'ল:

$fbapplink = 'https://apps.facebook.com/[appnamespace]/';
$isms = stripos($_SERVER['HTTP_USER_AGENT'], 'msie') !== false;

// safari fix
if(! $isms  && !isset($_SESSION['signed_request'])) {

    if (isset($_GET["start_session"])) {
        $_SESSION['signed_request'] = $_GET['signed_request'];
        die(header("Location:" . $fbapplink ));

    }
    if (!isset($_GET["sid"])) {
        die(header("Location:?sid=" . session_id() . '&signed_request='.$_REQUEST['signed_request']));
    }
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid) {
    ?>
    <script>
        top.window.location="?start_session=true";
    </script>
    <?php
    exit;
    }
}

// IE fix
header('P3P: CP="CAO PSA OUR"');
header('P3P: CP="HONK"');


.. later in the code

$sr = $_REQUEST['signed_request'];
if($sr) {
        $_SESSION['signed_request'] = $sr;
} else {
        $sr = $_SESSION['signed_request'];
}

0

আমিও এই সমস্যায় ভুগছি, তবে শেষ পর্যন্ত সমাধানটি পেয়েছি, প্রথমদিকে সরাসরি পপআপের মতো ব্রাউজারে iframe ইউআরএল লোড করুন তবে কেবল আইফ্রেমের অভ্যন্তরে সেশন মানগুলি অ্যাক্সেস করুন।


-1

আমি সম্প্রতি সাফারিতে একই বিষয়টি হিট করেছি। আমি যে সমাধানটি বের করেছিলাম তা স্থানীয় স্টোরেজ এইচটিএমএল 5 এপিআইয়ের উপর ভিত্তি করে। লোকাল স্টোরেজ ব্যবহার করে আপনি কুকিজ অনুকরণ করতে পারেন।

বিশদ সহ এখানে আমার ব্লগ পোস্টটি: http://log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html


Weabrchive থেকে স্ন্যাপশট: web.archive.org/web/20121124020234/http://log.scalemotion.com/…
podvzbzdnul

-2

আমি এর থেকে মুক্তি পাওয়ার সিদ্ধান্ত নিয়েছি $_SESSION ভেরিয়েবলটি একসাথে মুছে ফেলার এবং সেশনটি নকল করার জন্য মেমক্যাসের চারপাশে একটি মোড়ক লিখেছি।

পরীক্ষা করে দেখুন https://github.com/manpreetssethi/utils/blob/master/Session_manager.php

ব্যবহারের ক্ষেত্রে: যে মুহুর্তে কোনও অ্যাপ্লিকেশনটিতে কোনও ব্যবহারকারী অবতরণ করবেন, সেশন_ম্যানেজারটি ব্যবহার করে স্বাক্ষরিত অনুরোধটি সংরক্ষণ করুন এবং যেহেতু এটি ক্যাশে রয়েছে, আপনি এখন থেকে কোনও পৃষ্ঠায় এটি অ্যাক্সেস করতে পারেন।

দ্রষ্টব্য: সাফারিটিতে ব্যক্তিগতভাবে ব্রাউজ করার সময় এটি কাজ করবে না যেহেতু সেশন_আইডি প্রতিবার পৃষ্ঠাটি পুনরায় লোড হয়ে যায়। (বোকা সাফারি)


-9

আপনি পি 3 পি নীতি হিসাবে শিরোনাম যুক্ত করে এই সমস্যাটি সমাধান করতে পারেন..সফারিতে আমার একই সমস্যা ছিল তাই ফাইলগুলির শীর্ষে শিরোনাম যুক্ত করার পরে আমার সমস্যার সমাধান হয়েছে।

<?php
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
?>

আপনি কি নিশ্চিত যে এটি (এখনও) সাফারিটির সর্বশেষতম সংস্করণটির সাথে কাজ করে? আমাদের কাছে আই 3 এর জন্য কয়েক বছর ধরে পি 3 পি শিরোলেখ রয়েছে তবে সাফারি এখনও ভেঙে গেছে।
মিশচা

2
আপনার সমস্ত কুকিজ সাফ করার চেষ্টা করুন এবং আবার পরীক্ষা করুন। আপনার ব্রাউজারটিতে ইতিমধ্যে আপনার আইফ্রেমেড সাইটের জন্য কুকিজ থাকলে সমস্যাটি নিজেকে দেখাবে না।
rmarscher

হুঁ, আমি P3P শিরোনামগুলি কাজ করতে পারি না। তারা এখনও IE এ কাজ!
শেঠ ব্রাউন

2
এটি কাজ করত। তবে সাফারিটির সাম্প্রতিকতম সংস্করণে এটি হয় না। আপনার ক্যাশে সাফ করুন এবং আবার চেষ্টা করুন ....
মন্ত্রীর

2
আমি বলতে চাই যে এই সমাধানটি কাজ করে। আপনি সাফারিতে সমস্ত কুকি মুছে ফেলার বিষয়টি নিশ্চিত করুন। এবং তারপরে এটি চেষ্টা করুন।
dnuske
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.