2013-03-14 27 views
5

Kullanıcıların web sitemde bir şeyler satın almalarına olanak tanıyan bir Sign in with Google10 düğümü kurmaya çalışıyorum.İstemci tarafında oturum açtıktan sonra sunucu tarafında G + kullanıcılarının kimliğini doğrulamak

İstemci tarafı kimlik doğrulaması oldukça basit görünüyor, ancak sunucu tarafı kimlik doğrulamanın nasıl çalıştığını anlamaya çalışıyorum. example code'da, istemci tarafındaki "kod" parametresini sunucuya geçirir, burada erişim belirteci için işlem yapılabilir ve bu da kullanıcının arkadaşlarının listesini görmek için kullanılabilir.

Ancak, kullanıcının arkadaşlarının listesini görmek istemiyorum. Sadece müşterinin aslında iddia ettikleri kişi olduğundan emin olmak istiyorum.

Belirteç alındıktan sonra, örnek kod oturumda belirteci atar ve kullanıcının kimliğinin doğrulandığını doğrulamak için belirtecin varlığını kullanır gibi görünür. Bu doğru mu güvenli mi? Sunucum, satın alma zamanı geldiğinde nasıl bir şekilde (nasıl?) Jetonu yeniden doğrulamalı mı? Her istekte Google’ı sürekli olarak jetonla tekrar doğrulamalı mıyım? (Umarım değil mi?)

+0

İlgili bir soru yayınladım çünkü Facebook API'yla bunu yapmanın standart yolu, signed_request parametresini kullanmaktır, ancak Google'ın bir karşılığı olmadığı anlaşılıyor. http://stackoverflow.com/questions/15395142/does-google-javascript-api-have-an-equivalent-to-facebooks-signed-request –

cevap

2

Bir satın alma işlemi gerçekleştirmeden önce yapmak isteyebileceğiniz kişi, kullanıcı kimliğini istemciden sunucunuza güvenli bir şekilde geçirerek ve kullanıcı kimliğine göre doğrulayarak kullanıcının kimliklerini beklediğini doğrulamaktır. kayıtlı kimlik bilgileri için. Bu, bir saldırganın oturumunu ele geçirerek sitenizin kullanıcısı gibi davrandığını ve kullanıcının ödeme yapmadan önce yapması gereken en uygun çeke sahip olduğu tekrar saldırılarına karşı ek koruma sağlar.

Sadece kullanıcı doğrulama işlemine dolandırıcılıktan korunma mekanizması olarak güvenmem. Google Commerce platform gibi güvenli bir ödeme sistemi kullanmalı ve the best practices for commerce'u takip etmelisiniz.

Bir hatırlatma olarak, önbelleğe alınmış kimlik bilgileri her başlatıldığında belirtecinizi kontrol etmek için OAuth2 v2 uç noktası kullanılmalıdır. Her isteğin kontrol edilmesi biraz aşırı görünüyor çünkü sunucu tarafında zaten doğrulanmış ve depolanmış olan önbelleğe alınmış kimlik bilgilerini kullanmanız gerekir. En çok, bir erişim belirtecini güncellediğinizde kontrolleri gerçekleştirebilirsiniz, ancak yenileme kodunuza güveniyorsanız, hesabı oluşturduğunuzda ve bu yenileme kodunu belirlerken çekleri gerçekleştirirseniz, yeterince güvenli olmanız gerekir.

Aşağıdaki adımlar hesap oluşturduktan sonra kullanıcı kimliği doğrulama ek olarak alınır:

  • istemcisi olmasını bekliyoruz kim olduğundan emin olun. Bu, kota kullanarak saldırgan adına etkili bir şekilde istek oluşturmak için uygulamanıza geçirilen sahte erişim jetonlarına karşı sizi korur.
  • Bir kullanıcı adına ek hesapların oluşturulduğu durumlarda, hesabınızın bu uygulama tarafından oluşturulduğunu doğrulayın, bu protects you and your users against cross-site request forgery.

Bağlantınıza gönderilen postada belirtildiği gibi, the Google+ quickstarts'daki örnek kod, bu denetimleri, hesap yetkilendirmesi için çeşitli programlama dillerinde nasıl gerçekleştireceğini yeterince göstermelidir. HTML/JS istemcisi içinde

, aşağıdaki kod gösterir nerede userId (değer, özel dize "Bana" aksine) Google+ userId doğrulamak için bağlantı yöntemine geçmek için alınır:

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>')); 
     } 
    }); 

... ve aşağıdaki kod, geçirilen Google+ kimliğini gösterir.aşağıdaki gibi Java numunede Bu kontrolleri gerçekleştiren

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 
    }); 
} 

ilgili kodudur:

örneklerde
 // 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 konsolundan geldi ve uygulamanız için ayrı olacaktır.

+0

1) "kullanıcı kimliğini geçirme" "kod" parametresini mi kastediyorsunuz? Ya da kullanıcı kimliği? 2) "depolanmış kimlik bilgilerine karşı doğrulama", örnek kod kimlik bilgilerini saklamıyor. Tam olarak ne saklanmalı? Ne kadar süreliğine? Daha fazla felsefi olarak, kod örnekleri yaptığımı önerdiğin şeyi yapmıyor gibi görünüyor. Onlar mı? Java örneğinin hangi satırlarını söylediğinizi yapar? –

+0

1) Örneğin HTML/JS istemcisinin (index.html) bağlantı yönteminde, Google+ kimliğinin bir GET parametresi olarak geçirildiğini ve jeton bilgisini kullanarak doğrulandığını fark edeceksiniz. 2) Örnekler * oturumu saklamak suretiyle kullanıcının kimlik bilgilerinin saklanması işlemini gerçekleştirir ve saklanan erişim/yenileme belirtecini kullanarak yetkilendirme durumunu yeniden oluşturur. Yenileme jetonunun süresi dolmaz, bu nedenle bir kullanıcı hesabını kesmedikçe güvenli bir şekilde devam ettirilmelidir. Erişim belirteci 3600 saniyeden sonra sona erer, bu nedenle yalnızca süresi dolduğunda güncellenmelidir. Satırlar 153-183, Java örneğindeki kontrolleri gerçekleştiriyor. – class

+0

Son bir yorum, belirteçleri ve kimlik bilgilerinin nasıl kalıcı olması gerektiğine dair daha kapsamlı bir örnek görmek isterseniz, PhotoHunt örnekleri bunu daha iyi gösterecektir. Burada SaveTokenForUser adresine bakın: https://github.com/googleplus/gplus-photohunt-server-java/blob/master/src/com/google/plus/samples/photohunt/ConnectServlet.java – class

İlgili konular