Страницы

четверг, 29 мая 2014 г.

Just Try To Hack Me

Именно так выглядит SSID моей беспроводной сети. Но здесь не об этом. Приложение, упомянутое в предыдущем посте неожиданно для меня стало пользоваться спросом в определенных кругах в качестве примера авторизации с помощью OAuth 2.0. Разобравшись в том, как все работает на клиенте, заинтересовавшиеся разработчики решили на этом не останавливаться и обозначили свой интерес к серверной части. Для того, чтобы упростить понимание, я решил выложить исходники на GitHub, о чем сообщаю уважаемым читателям моего блога настоящим постом.


А вот собственно и сам "серверный код":
var sheetId = '1dgq89vY-tyliK112aSUeUCUZP4fvc8PE0hRr_U0j0Ws';

function doGet(e) {
  if (!e.parameters.token) {
    return ContentService.createTextOutput(JSON.stringify({error: 'Get out!'})).setMimeType(ContentService.MimeType.JSON);
  }
  var sh = SpreadsheetApp.openById(sheetId).getSheets()[0], 
      data = sh.getDataRange().getValues(),   
      user = getUser_(e.parameters.token), 
      res = user.name ? data : data.map(function(arr) { return arr.slice(3); });
  return ContentService.createTextOutput(JSON.stringify(res)).setMimeType(ContentService.MimeType.JSON);
}

function doPost(e) {
  if (!e.parameters.token) {
    return ContentService.createTextOutput(JSON.stringify({error: 'Get out!'})).setMimeType(ContentService.MimeType.JSON);
  }
  var user = getUser_(e.parameters.token);
  if (!user.name) {
    return ContentService.createTextOutput(JSON.stringify({error: 'Get out!'})).setMimeType(ContentService.MimeType.JSON);
  }  
  var sh = SpreadsheetApp.openById(sheetId).getSheets()[0], 
      data = JSON.parse(e.postData.contents), 
      values = [new Date(), user.name, user.link, data['for'], data['sum']];
  sh.getRange(sh.getLastRow() + 1, 1, 1, 5).setValues([values]);
  return ContentService.createTextOutput(JSON.stringify(sh.getDataRange().getValues())).setMimeType(ContentService.MimeType.JSON);
}

function getUser_(token) {  
  var res = UrlFetchApp.fetch('https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=' + token, 
                           {muteHttpExceptions: true});
  return JSON.parse(res); 
}

Хочу еще раз подчеркнуть, что я писал его что называется "just for fun" и разумеется не принимал во внимание никакие вопросы безопасности.

Предлагаю уважаемому читателю попробовать это чудо-приложение поломать. Некоторые товарищи уже предложили свои варианты, жду успешной реализации.

У кого получится - тот молодец :).