2013-03-14 50 views
5

Tôi đang cố gắng thiết lập nút Sign in with Google cho phép mọi người mua hàng trên trang web của tôi.Xác thực người dùng G + ở phía máy chủ, sau khi đăng nhập phía máy khách

Xác thực phía máy khách trông khá đơn giản nhưng tôi đang cố gắng hiểu cách xác thực phía máy chủ hoạt động. Trong số example code, chúng chuyển thông số "mã" phía máy khách đến máy chủ, nơi nó có thể được giao dịch cho mã thông báo truy cập, sau đó có thể được sử dụng để xem danh sách bạn bè của người dùng.

Nhưng tôi không muốn xem danh sách bạn bè của người dùng. Tôi chỉ muốn chắc chắn rằng khách hàng thực sự là người mà họ yêu cầu.

Sau khi truy xuất mã thông báo, mã mẫu sẽ đặt mã thông báo trong phiên và dường như sử dụng sự hiện diện của mã thông báo để xác minh rằng người dùng được xác thực. Điều đó có đúng không? Nên (n't) máy chủ của tôi xác minh lại mã thông báo bằng cách nào đó (như thế nào?) Khi đến lúc mua hàng? Tôi có nên liên tục xác minh lại mã thông báo với Google theo mọi yêu cầu không? (Hy vọng là không?)

+0

Tôi đăng một câu hỏi liên quan, bởi vì tôi nghĩ cách tiêu chuẩn để làm điều này với API Facebook là sử dụng tham số signed_request, nhưng có vẻ như Google không có tương đương. http://stackoverflow.com/questions/15395142/does-google-javascript-api-have-an-equivalent-to-facebooks-signed-request –

Trả lời

2

Những gì bạn có thể làm trước khi thực hiện mua hàng là xác minh người dùng là người bạn mong đợi bằng cách chuyển an toàn id người dùng từ máy khách đến máy chủ của bạn và xác minh nó với id người dùng cho thông tin đăng nhập được lưu trữ. Điều này cung cấp thêm sự bảo vệ chống lại các cuộc tấn công phát lại khi kẻ tấn công giả vờ là người dùng trang web của bạn bằng cách chiếm đoạt phiên của họ và là séc có liên quan nhất để thực hiện trước khi chấp nhận thanh toán từ người dùng.

Tôi sẽ không chỉ dựa vào xác thực người dùng làm cơ chế bảo vệ chống gian lận. Bạn nên sử dụng hệ thống thanh toán an toàn như Google Commerce platform và theo dõi the best practices for commerce.

Lưu ý, điểm cuối OAuth2 v2 nên được sử dụng để kiểm tra mã thông báo của bạn mỗi khi thông tin xác thực được lưu trong bộ nhớ cache được khởi tạo. Việc kiểm tra mọi yêu cầu có vẻ hơi quá mức vì bạn nên sử dụng thông tin đăng nhập được lưu trong bộ nhớ cache đã được xác thực và lưu trữ phía máy chủ. Tối đa, bạn có thể thực hiện kiểm tra khi bạn cập nhật mã thông báo truy cập nhưng nếu bạn tin cậy mã thông báo làm mới, bạn nên đủ an toàn nếu bạn thực hiện kiểm tra khi tạo tài khoản và đặt mã thông báo làm mới đó.

Các bước sau đây được lấy ngoài việc xác nhận người dùng id khi tạo tài khoản:

  • Xác minh khách hàng là người bạn mong đợi nó được. Điều này bảo vệ bạn khỏi mã thông báo truy cập giả mạo được chuyển tới ứng dụng của bạn để thực hiện yêu cầu hiệu quả thay mặt cho kẻ tấn công bằng cách sử dụng hạn mức của bạn.
  • Xác minh rằng tài khoản đã được tạo bởi ứng dụng của bạn, protects you and your users against cross-site request forgery này trong trường hợp tài khoản bổ sung được tạo thay mặt cho người dùng.

Như đã đề cập trong bài đăng được liên kết của bạn, mã mẫu trong the Google+ quickstarts phải chứng minh đầy đủ cách thực hiện các kiểm tra này bằng nhiều ngôn ngữ lập trình khác nhau để ủy quyền tài khoản.

Trong JS client/HTML, mã sau đây cho thấy nơi userId (giá trị, như trái ngược với chuỗi đặc biệt "tôi") được lấy ra để thông qua các phương pháp kết nối để xác minh userId Google+:

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

... và mã sau đây hiển thị id Google+ đang được chuyển.

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

Mã liên quan thực hiện các kiểm tra trong mẫu Java là như sau:

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

Trong mẫu, ClientID đến từ bảng điều khiển API của Google và sẽ khác biệt cho ứng dụng của bạn.

+0

1) "chuyển id người dùng" bạn có nghĩa là thông số "mã"? Hoặc ID người dùng? 2) "xác minh nó dựa vào thông tin đăng nhập được lưu trữ" mã mẫu không lưu trữ bằng chứng xác thực. Những gì cần được lưu trữ, chính xác? Trong bao lâu? (Cơ sở dữ liệu? Phiên?) Thêm về mặt triết học, các mẫu mã dường như không làm những gì bạn đang đề xuất. Họ có? Những dòng (ví dụ) mẫu Java làm những gì bạn đang nói? –

+0

1) Trong phương thức kết nối của máy khách HTML/JS của mẫu (index.html), bạn sẽ nhận thấy rằng id Google+ được chuyển thành tham số GET và được xác minh bằng thông tin mã thông báo. 2) Các mẫu * mô phỏng * hoạt động lưu trữ thông tin đăng nhập của người dùng bằng cách sử dụng bộ nhớ phiên và tạo lại trạng thái ủy quyền bằng cách sử dụng mã thông báo truy cập/làm mới được lưu trữ. Mã thông báo làm mới không hết hạn vì vậy mã này sẽ được lưu giữ an toàn trừ khi người dùng ngắt kết nối tài khoản của họ. Mã thông báo truy cập sẽ hết hạn sau 3600 giây nên mã thông báo sẽ chỉ được cập nhật khi hết hạn. Các dòng 153-183 đang thực hiện các kiểm tra trong mẫu Java. – class

+0

Một bình luận cuối cùng, nếu bạn muốn xem một ví dụ toàn diện hơn về cách các mã thông báo và các thông tin cần được duy trì, các mẫu PhotoHunt sẽ chứng minh tốt hơn điều đó. Xem saveTokenForUser tại đây: https://github.com/googleplus/gplus-photohunt-server-java/blob/master/src/com/google/plus/samples/photohunt/ConnectServlet.java – class

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