2013-03-14 24 views
5

के बाद सर्वर पक्ष पर G + उपयोगकर्ताओं को प्रमाणीकरण करना, मैं Sign in with Google बटन सेट अप करने का प्रयास कर रहा हूं जो लोगों को मेरी वेबसाइट पर चीज़ों को खरीदने की अनुमति देगा।क्लाइंट-साइड लॉगिन

क्लाइंट-साइड प्रमाणीकरण बहुत सरल दिखता है, लेकिन मैं यह समझने के लिए संघर्ष कर रहा हूं कि सर्वर-साइड प्रमाणीकरण कैसे काम करता है। example code में वे क्लाइंट-साइड "कोड" पैरामीटर को सर्वर पर पास करते हैं, जहां इसे एक्सेस टोकन के लिए व्यापार किया जा सकता है, जिसका उपयोग तब उपयोगकर्ता के दोस्तों की सूची देखने के लिए किया जा सकता है।

लेकिन मैं उपयोगकर्ता के दोस्तों की सूची देखना नहीं चाहता हूं। मैं बस यह सुनिश्चित करना चाहता हूं कि ग्राहक वास्तव में वे होने का दावा करते हैं।

टोकन को पुनर्प्राप्त करने के बाद, नमूना कोड सत्र में टोकन डालता है, और यह सत्यापित करने के लिए टोकन की उपस्थिति का उपयोग करता है कि उपयोगकर्ता प्रमाणीकृत है। क्या यह सही/सुरक्षित है? क्या (नहीं) मेरा सर्वर टोकन को फिर से सत्यापित कर सकता है (कैसे?) जब खरीदारी करने का समय हो? क्या मुझे लगातार हर अनुरोध पर Google के साथ टोकन दोबारा सत्यापित करना चाहिए? (उम्मीद है कि नहीं?)

+0

मैंने एक संबंधित प्रश्न पोस्ट किया, क्योंकि मुझे लगता है कि फेसबुक एपीआई के साथ ऐसा करने का मानक तरीका हस्ताक्षर_रेक्वेस्ट पैरामीटर का उपयोग करना है, लेकिन ऐसा लगता है कि Google के बराबर नहीं है। http://stackoverflow.com/questions/15395142/does-google-javascript-api-have-an-equivalent-to-facebooks-signed-request –

उत्तर

2

खरीद करने से पहले आप क्या करना चाहते हैं, यह सत्यापित करना है कि उपयोगकर्ता को यह सत्यापित करने के लिए कि आप क्लाइंट से उपयोगकर्ता आईडी को सुरक्षित रूप से पास कर रहे हैं और उपयोगकर्ता आईडी के विरुद्ध सत्यापित कर रहे हैं संग्रहीत क्रेडेंशियल्स के लिए। यह रीप्ले हमलों के खिलाफ अतिरिक्त सुरक्षा प्रदान करता है जहां एक हमलावर अपने सत्र को अपहृत करके आपकी साइट के उपयोगकर्ता होने का नाटक कर रहा है और उपयोगकर्ता से भुगतान स्वीकार करने से पहले सबसे प्रासंगिक जांच है।

मैं धोखाधड़ी के खिलाफ सुरक्षा के लिए एक तंत्र के रूप में अकेले उपयोगकर्ता सत्यापन पर भरोसा नहीं करता। आपको Google Commerce platform जैसे सुरक्षित भुगतान प्रणाली का उपयोग करना चाहिए और the best practices for commerce का पालन करना चाहिए।

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

निम्नलिखित चरणों का खाता खोलने के बाद प्रयोक्ता आईडी सत्यापन के अलावा में लिया जाता है:

  • सत्यापित करें ग्राहक जो आप इसे होने की उम्मीद है। यह आपके कोटा का उपयोग करके हमलावर की तरफ से प्रभावी ढंग से अनुरोध करने के लिए आपके ऐप में जाली जाली पहुंच टोकन के विरुद्ध आपको सुरक्षित करता है।
  • सत्यापित करें कि खाता आपके आवेदन द्वारा बनाया गया था, यह protects you and your users against cross-site request forgery उन मामलों में जहां उपयोगकर्ता की ओर से अतिरिक्त खाते बनाए जाते हैं।

अपने लिंक किए गए पोस्ट में उल्लेख किया है, the Google+ quickstarts में नमूना कोड पर्याप्त कैसे खाते प्राधिकरण के लिए प्रोग्रामिंग भाषाओं की एक किस्म में इन जांच करने के लिए भी होना चाहिए।

HTML/JS ग्राहक के भीतर, निम्नलिखित कोड से पता चलता है जहां userId (मूल्य, के रूप में विशेष स्ट्रिंग "मुझे" के खिलाफ) कनेक्ट विधि से गुजर गूगल + userId को सत्यापित करने के लिए लिया गया है:

var request = gapi.client.plus.people.get({'userId' : 'me'}); 
    request.execute(function(profile) { 
     $('#profile').empty(); 
     if (profile.error) { 
     $('#profile').append(profile.error); 
     return; 
     } 
     helper.connectServer(profile.id); 
     $('#profile').append(
      $('<p><img src=\"' + profile.image.url + '\"></p>')); 
     $('#profile').append(
      $('<p>Hello ' + profile.displayName + '!<br />Tagline: ' + 
      profile.tagline + '<br />About: ' + profile.aboutMe + '</p>')); 
     if (profile.cover && profile.coverPhoto) { 
     $('#profile').append(
      $('<p><img src=\"' + profile.cover.coverPhoto.url + '\"></p>')); 
     } 
    }); 

... और निम्न कोड Google+ आईडी को पारित किया गया दिखाता है।

connectServer: function(gplusId) { 
    console.log(this.authResult.code); 
    $.ajax({ 
    type: 'POST', 
    url: window.location.href + '/connect?state={{ STATE }}&gplus_id=' + 
     gplusId, 
    contentType: 'application/octet-stream; charset=utf-8', 
    success: function(result) { 
     console.log(result); 
     helper.people(); 
    }, 
    processData: false, 
    data: this.authResult.code 
    }); 
} 

प्रासंगिक कोड जावा नमूने में इन चेकों प्रदर्शन इस प्रकार है:

 // Check that the token is valid. 
     Oauth2 oauth2 = new Oauth2.Builder(
      TRANSPORT, JSON_FACTORY, credential).build(); 
     Tokeninfo tokenInfo = oauth2.tokeninfo() 
      .setAccessToken(credential.getAccessToken()).execute(); 
     // If there was an error in the token info, abort. 
     if (tokenInfo.containsKey("error")) { 
     response.status(401); 
     return GSON.toJson(tokenInfo.get("error").toString()); 
     } 
     // Make sure the token we got is for the intended user. 
     if (!tokenInfo.getUserId().equals(gPlusId)) { 
     response.status(401); 
     return GSON.toJson("Token's user ID doesn't match given user ID."); 
     } 
     // Make sure the token we got is for our app. 
     if (!tokenInfo.getIssuedTo().equals(CLIENT_ID)) { 
     response.status(401); 
     return GSON.toJson("Token's client ID does not match app's."); 
     } 
     // Store the token in the session for later use. 
     request.session().attribute("token", tokenResponse.toString()); 
     return GSON.toJson("Successfully connected user."); 
    } catch (TokenResponseException e) { 
     response.status(500); 
     return GSON.toJson("Failed to upgrade the authorization code."); 
    } catch (IOException e) { 
     response.status(500); 
     return GSON.toJson("Failed to read token data from Google. " + 
      e.getMessage()); 
    } 

नमूने में, ClientID Google API कंसोल से आया है और आपके आवेदन के लिए अलग हो जाएगा।

+0

1) "उपयोगकर्ता आईडी पास करना" का अर्थ है "कोड" पैरामीटर? या उपयोगकर्ता आईडी? 2) "संग्रहीत क्रेडेंशियल के खिलाफ इसे सत्यापित करना" नमूना कोड क्रेडेंशियल स्टोर नहीं करता है। क्या संग्रहीत किया जाना चाहिए, बिल्कुल? कितनी देर के लिए? (डेटाबेस? सत्र?) अधिक दार्शनिक रूप से, कोड नमूने ऐसा नहीं लगता है जो आप सुझाव दे रहे हैं। क्या वे? जावा नमूना (कहें) की कौन सी रेखाएं आप क्या कह रहे हैं? –

+0

1) नमूना के HTML/JS क्लाइंट (index.html) की कनेक्ट विधि में, आप देखेंगे कि Google+ आईडी को GET पैरामीटर के रूप में पास किया गया है और टोकन जानकारी का उपयोग करके सत्यापित किया गया है। 2) नमूने * सत्र भंडारण का उपयोग कर उपयोगकर्ता के क्रेडेंशियल्स को संग्रहीत करने के संचालन * अनुकरण * संग्रहीत एक्सेस/रीफ्रेश टोकन का उपयोग करके प्राधिकरण स्थिति को फिर से बनाएं। रीफ्रेश टोकन की समयसीमा समाप्त नहीं होती है, इसलिए जब तक कोई उपयोगकर्ता अपने खाते को डिस्कनेक्ट नहीं करता तब तक इसे सुरक्षित रूप से तब तक जारी रखा जाना चाहिए। एक्सेस टोकन 3600 सेकेंड के बाद समाप्त हो जाता है, इसलिए इसे समाप्त होने पर ही अपडेट किया जाना चाहिए। लाइन्स 153-183 जावा नमूने में चेक कर रहे हैं। – class

+0

एक अंतिम टिप्पणी, यदि आप टोकन और क्रेडेंशियल्स को कैसे बनाए रखा जाए, इसका एक और व्यापक उदाहरण देखना चाहते हैं, तो फोटोहंट नमूने बेहतर प्रदर्शन करेंगे। SaveTokenForUser को यहां देखें: https://github.com/googleplus/gplus-photohunt-server-java/blob/master/src/com/google/plus/samples/photohunt/ConnectServlet.java – class

संबंधित मुद्दे