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.
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 –