2014-01-18 5 views
0

Я не уверен, как это сделать, поэтому я просто объясню, что я пытаюсь сделать.Аутентификация пользователя через логин facebook на сервере Java

Я создал REST API для своего мобильного приложения, на стороне клиента пользователь будет входить в систему с помощью facebook, а затем будет делать запросы на мой собственный сервер REST с такими действиями, как загрузка изображений и обновление местоположения.

Когда я сделал это в PHP, пользователь отправил токен доступа + такие данные, как почта с каждым запросом, и я бы использовал токен доступа, чтобы проверить соответствие деталей, это была моя основная мера безопасности (вы, вероятно, можете догадаться, что я 'm не эксперт по безопасности)

В то время это казалось хорошей идеей, но с тех пор я переместил свой сервер на движок Google с помощью Java, поэтому мне было интересно, как я могу это сделать в java, и если это это хорошая идея вообще, или, может быть, я должен придерживаться другого подхода?

Любые ответы будут приветствоваться!

+0

Вы ищете новое решение, а не просто портируете PHP-код на Java? – madebydavid

+0

Мне было интересно, правильно ли это сделать, и если да, то как это сделать в Java, так как у Facebook нет SDK для Java –

ответ

1

Когда мне нужно было реализовать это несколько лет назад, я попробовал два основных подхода.

Простой подход, но не очень хорошо масштабируется: используется RestFB и инициировал использование DefaultFacebookClient с использованием токена доступа, а затем сравнил информацию об этом клиенте с именем пользователя, которое мой клиент отправил вместе с токеном. Причина, по которой это не масштабируется, - это требование HTTP или HTTPS к Facebook, что может занять несколько секунд. Это убивает производительность, если у вас много пользователей, регистрирующихся одновременно.

Более сложный подход использовал примеры, представленные ptarjan. Решающая часть я использовал это (не помню, является ли она изменилась по сравнению с версии ptarjan в):

public static SignedRequestResponse parse_signed_request(String input, String secret, int max_age) { 
     String[] split = input.split("[.]", 2); 
     SignedRequestResponse response = new SignedRequestResponse(); 
     response.setStatus(Status.Failure); 

     String encoded_sig = split[0]; 
     String encoded_envelope = split[1]; 
     JSONParser parser = new JSONParser(); 
     Map envelope; 
     try { 
      envelope = (Map) parser.parse(new String(base64_url_decode(encoded_envelope))); 
     } catch (Exception ex) { 
      response.addError("ParsingError"); 
      return response; 
     } 

     response.setEnvelope(envelope); 

     String algorithm = (String) envelope.get("algorithm"); 

     if (!algorithm.equals("HMAC-SHA256")) { 
      response.addError("UnsupportedAlgorithm"); 
      return response; // instant fail 
     } 

     byte[] key = secret.getBytes(); 
     SecretKey hmacKey = new SecretKeySpec(key, "HMACSHA256"); 
     Mac mac = null; 
     try { 
      mac = Mac.getInstance("HMACSHA256"); 
      mac.init(hmacKey); 
     } catch (Exception e) { 
      response.addError("DecryptionError"); 
      return response; // instant fail 
     } 

     byte[] digest = mac.doFinal(encoded_envelope.getBytes()); 
     try { 

      if (!Arrays.equals(base64_url_decode(encoded_sig), digest)) { 
       response.addError("InvalidSignature"); 
       return response; // instant fail 
      } 
     } catch (Exception ex) { 
      response.addError("InvalidSignature"); 
      return response; // instant fail 
     } 

     if (((Long) envelope.get("issued_at")) < System.currentTimeMillis()/1000 - max_age) { 
      response.addError("Expired"); 
      response.setStatus(Status.PartialSuccess); 
      return response; // partial fail 
     } 

     response.setStatus(Status.Success); 
     return response; 
    } 
} 

секрет переменным является секретным ключом приложения.

+0

Как получить подписанный запрос в мобильном приложении? – madebydavid

+0

Что происходит с токеном, не так ли? Если это не так, посмотрите, помогает ли этот пост: http://stackoverflow.com/questions/14456829/provide-secure-facebook-authentication-with-my-server?rq=1 –

+0

Я думаю, Facebook только POSTs подписанный запрос к приложениям холста или страницы. RestFB lib звучит так, как будто это поможет OP tho. – madebydavid

Смежные вопросы