facebook - सवर - मेरा फेसबुक नहीं खुल रहा




फेसबुक कॉलबैक यूआरएल वापस करने के लिए '#_=_' जोड़ता है (12)

अगर आप यूआरएल से शेष "#" को हटाना चाहते हैं

$(window).on('load', function(e){
  if (window.location.hash == '#_=_') {
    window.location.hash = ''; // for older browsers, leaves a # behind
    history.pushState('', document.title, window.location.pathname); // nice and clean
    e.preventDefault(); // no page reload
  }
})

फेसबुक कॉलबैक ने #_=_ हैश अंडरस्कोर को रिटर्न यूआरएल में जोड़ना शुरू कर दिया है

क्या किसी को पता है क्यों? उपाय क्या है?


आप फेसबुक कॉलबैक के लिए redirect_uri पैरामीटर पर अपना खुद का हैश भी निर्दिष्ट कर सकते हैं, जो कुछ परिस्थितियों में उपयोगी हो सकता है जैसे /api/account/callback#home । जब आपको वापस रीडायरेक्ट किया जाता है, तो कम से कम एक हैश होगा जो ज्ञात मार्ग से मेल खाती है यदि आप backbone.js या इसी तरह का उपयोग कर रहे हैं (jquery मोबाइल के बारे में सुनिश्चित नहीं है)।


कोणीय 2 (आरसी 5) और हैश-आधारित मार्गों का उपयोग करके, मैं यह करता हूं:

const appRoutes: Routes = [
  ...
  {path: '_', redirectTo: '/facebookLoginSuccess'},
  ...
]

तथा

export const routing = RouterModule.forRoot(appRoutes, { useHash: true });

जहां तक ​​मैं समझता हूं, मार्ग में = वर्ण वैकल्पिक मार्ग पैरामीटर परिभाषा के हिस्से के रूप में व्याख्या किया जाता है ( https://angular.io/docs/ts/latest/guide/router.html#!#optional-route-parameters ), इसलिए मार्ग मिलान में शामिल नहीं है।


कोणीय और कोणीय यूई राउटर के साथ, आप इसे ठीक कर सकते हैं

    app.config(function ($stateProvider, $urlRouterProvider, $locationProvider) {

      // Make a trailing slash optional for all routes
      // - Note: You'll need to specify all urls with a trailing slash if you use this method.
      $urlRouterProvider.rule(function ($injector, $location) {
        /***
        Angular misbehaves when the URL contains a "#_=_" hash.

        From Facebook:
          Change in Session Redirect Behavior
          This week, we started adding a fragment #_=_ to the redirect_uri when this field is left blank.
          Please ensure that your app can handle this behavior.

        Fix:
          http://.com/questions/7131909/facebook-callback-appends-to-return-url#answer-7297873
        ***/
        if ($location.hash() === '_=_'){
          $location.hash(null);
        }

        var path = $location.url();

        // check to see if the path already has a slash where it should be
        if (path[path.length - 1] === '/' || path.indexOf('/?') > -1) {
          return;
        }
        else if (path.indexOf('?') > -1) {
          $location.replace().path(path.replace('?', '/?'));
        }
        else {
          $location.replace().path(path + '/');
        }
      });

      // etc ...
    });
});

प्रमुख परेशान, खासकर उन ऐप्स के लिए जो यूआरआई को पार्स करते हैं और सिर्फ $ _GET नहीं पढ़ते हैं ... यहां हैक मैंने एक साथ फेंक दिया है ... आनंद लें!

<html xmlns:fb='http://www.facebook.com/2008/fbml'>
<head>
        <script type="text/javascript">
        // Get rid of the Facebook residue hash in the URI
        // Must be done in JS cuz hash only exists client-side
        // IE and Chrome version of the hack
        if (String(window.location.hash).substring(0,1) == "#") {
                window.location.hash = "";
                window.location.href=window.location.href.slice(0, -1);
                }
        // Firefox version of the hack
        if (String(location.hash).substring(0,1) == "#") {
                location.hash = "";
                location.href=location.href.substring(0,location.href.length-3);
                }
        </script>
</head>
<body>
URI should be clean
</body>
</html>

फेसबुक एक फ्रेम का उपयोग करता है और इसके अंदर सब कुछ AJAX संचार का उपयोग कर कार्य करता है। इस मामले में सबसे बड़ी समस्या वर्तमान पृष्ठ स्थिति को संरक्षित कर रही है। जहां तक ​​मैं समझता हूं, फेसबुक ने अनुरूपित एंकरों का उपयोग करने का फैसला किया। इसका अर्थ यह है कि यदि आपने कहीं क्लिक किया है, तो वे आपके पृष्ठ के अंदर एक एंकर के रूप में अनुकरण करते हैं, और जब AJAX संचार शुरू होता है, तो वे आपके यूआरएल के एंकर बिट को भी बदल देते हैं।

यह समाधान सामान्य रूप से आपकी सहायता करता है जब आप पृष्ठ को पुनः लोड करने का प्रयास करते हैं (ENTER नहीं, F5 दबाएं), क्योंकि आपका ब्राउज़र फेसबुक सर्वर पर एंकर के साथ पूरा यूआरएल भेजता है। इसलिए फेसबुक नवीनतम स्थिति (जो आप देखते हैं) उठाता है और फिर आप वहां से जारी रखने में सक्षम होते हैं।

जब कॉलबैक #_=_ साथ वापस आता है तो इसका अर्थ यह है कि पृष्ठ इसे छोड़ने से पहले अपने मूल स्थिति में था। चूंकि इस एंकर को ब्राउज़र द्वारा पार्स किया गया है, इसलिए आपको इसकी चिंता करने की आवश्यकता नहीं है।


मेरे लिए काम करने वाला एक कामकाज (Backbone.js का उपयोग करके), फेसबुक पर पारित रीडायरेक्ट यूआरएल के अंत में "# /" जोड़ना था। फेसबुक उपलब्ध टुकड़े रखेगा, और अपना खुद का "_ = _" संलग्न नहीं करेगा।

वापसी पर, बैकबोन भाग # / "हटा देगा। AngularJS के लिए, "#!" जोड़ना वापसी यूआरएल काम करना चाहिए।

ध्यान दें कि मूल URL का खंड पहचानकर्ता अधिकांश ब्राउज़रों द्वारा पुनर्निर्देशन (HTTP स्थिति कोड 300, 301, 302 और 303 के माध्यम से) पर संरक्षित है, जब तक कि रीडायरेक्ट URL में एक खंड पहचानकर्ता भी न हो। ऐसा अनुशंसित व्यवहार प्रतीत होता है

यदि आप एक हैंडलर स्क्रिप्ट का उपयोग करते हैं जो उपयोगकर्ता को कहीं और रीडायरेक्ट करता है, तो आप रिक्त स्ट्रिंग के साथ खंड पहचानकर्ता को प्रतिस्थापित करने के लिए यहां रीडायरेक्ट URL पर "#" जोड़ सकते हैं।


मेरे लिए, मैं #_=_ छुटकारा पाने के लिए किसी अन्य पृष्ठ पर जावास्क्रिप्ट पुनर्निर्देशन करता हूं। नीचे विचारों को काम करना चाहिए। :)

function redirect($url){
    echo "<script>window.location.href='{$url}?{$_SERVER["QUERY_STRING"]}'</script>";        
}

मैं नहीं देखता कि यह समस्या फेसबुक AJAX से कैसे जुड़ी है। वास्तव में यह समस्या जावास्क्रिप्ट अक्षम के साथ भी होती है और पूरी तरह से आधारित लॉग इन को पुनर्निर्देशित करती है।

फेसबुक के साथ एक उदाहरण विनिमय:

1. GET <https://www.facebook.com/dialog/oauth?client_id=MY_APP_ID&scope=email&redirect_uri=MY_REDIRECT_URL> RESPONSE 302 Found Location: <https://www.facebook.com/connect/uiserver.php?[...]>  
2. GET <https://www.facebook.com/connect/uiserver.php?[...]> RESPONSE 302 Found MY_REDIRECT_URL?code=FB_CODE#_  
3. GET MY_REDIRECT_URL?code=FB_CODE#_  

मेरे लिए फ़ायरफ़ॉक्स के साथ ही होता है।


यदि आप हैशबैंग (/ #! /) यूआरएल, जैसे कोणीय के साथ जेएस फ्रेमवर्क का उपयोग कर रहे हैं तो यह एक गंभीर समस्या बन सकता है। दरअसल, कोणीय गैर-हैशबैंग टुकड़े वाले यूआरएल को अमान्य के रूप में मानेंगे और एक त्रुटि फेंक देंगे:

Error: Invalid url "http://example.com/#_=_", missing hash prefix "#!".

यदि आप ऐसा करने के बजाए ऐसे मामले में हैं (और अपने डोमेन रूट पर रीडायरेक्ट कर रहे हैं):

window.location.hash = ''; // goes to /#, which is no better

बस करें:

window.location.hash = '!'; // goes to /#!, which allows Angular to take care of the rest

हाल ही में एक बदलाव पेश किया गया था कि कैसे फेसबुक सत्र रीडायरेक्ट को संभालता है। घोषणा के लिए इस हफ्ते के ऑपरेशन डेवलपर लव ब्लॉग पोस्ट में "सत्र रीडायरेक्ट व्यवहार में परिवर्तन" देखें।


फेसबुक के प्लेटफ़ॉर्म अपडेट के माध्यम से:

सत्र रीडायरेक्ट व्यवहार में बदलें

इस सप्ताह, जब हमने इस क्षेत्र को खाली छोड़ दिया है, तो हमने redirect_uri पर एक टुकड़ा # ____ = ____ जोड़ना शुरू कर दिया था। कृपया सुनिश्चित करें कि आपका ऐप इस व्यवहार को संभाल सकता है।

इसे रोकने के लिए, अपने लॉगिन यूआरएल अनुरोध में redirect_uri सेट करें: (फेसबुक php-sdk का उपयोग करके)

$facebook->getLoginUrl(array('redirect_uri' => $_SERVER['SCRIPT_URI'],'scope' => 'user_about_me'));

अद्यतन करें

उपर्युक्त बिल्कुल ठीक है क्योंकि दस्तावेज इसे ठीक करने के लिए कहता है। हालांकि, फेसबुक का दस्तावेज समाधान काम नहीं करता है। कृपया फेसबुक प्लेटफार्म अपडेट ब्लॉग पोस्ट पर एक टिप्पणी छोड़ने पर विचार करें और बेहतर जवाब प्राप्त करने के लिए इस बग का पालन करें । तब तक, इस समस्या को हल करने के लिए अपने हेड टैग में निम्नलिखित जोड़ें:

<script type="text/javascript">
    if (window.location.hash && window.location.hash == '#_=_') {
        window.location.hash = '';
    }
</script>

या एक और विस्तृत विकल्प (धन्यवाद niftylettuce ):

<script type="text/javascript">
    if (window.location.hash && window.location.hash == '#_=_') {
        if (window.history && history.pushState) {
            window.history.pushState("", document.title, window.location.pathname);
        } else {
            // Prevent scrolling by storing the page's current scroll offset
            var scroll = {
                top: document.body.scrollTop,
                left: document.body.scrollLeft
            };
            window.location.hash = '';
            // Restore the scroll offset, should be flicker free
            document.body.scrollTop = scroll.top;
            document.body.scrollLeft = scroll.left;
        }
    }
</script>




returnurl