3

나는 내 웹 사이트에 로그인하기위한 옵션으로 Facebook을 사용하고 있으며, 대신 Facebook을 대신하여 Graph API 요청을하고있다. 필자는 10 월 1 일 이전에 최신 oAuth를 사용하기 위해 새로운 JavaScript SDK와 PHP SDK 모두로 업그레이드 할 예정입니다.

PHP SDK는 이제 BaseFacebook 초록으로 제공되며 PHP $_SESSION에 의존하는 Facebook 클래스 구현 예가 있습니다. $_SESSION을 사용하는 꽤 복잡한 다중 서버 웹 사이트를 운영합니다. 기본 파일 기반 세션을 사용할 수 없으며 데이터베이스 기반 세션은 성능상의 이유로 좋지 않습니다. 나는 그것을 취소 않다면, 로그 아웃되지해야 Memcached가에 하나의 사용자로 원하는 확실하지 않음 등

콘크리트 class 각 방문자에 대해 다음 4 개 필드 지속 할 필요가있다 : state, code, access_token, user_id을. 이들 모두가 순수한 $ _SESSION 기반 일 필요는없는 것 같습니다. 이 CSRF 방지를위한 단지 1 시간 소용로는 클라이언트 측 쿠키에 저장 될 수있는 것처럼 내가 예를 들어

  • ... 정말 어디로 가야 할 필요가 무엇을 결정하기 위해 노력 중이 야의 state 데이터 보인다.
  • 인증 code은 실제로 지속성이 필요합니까 아니면 한 번만 사용됩니까?
  • user_idaccess_token을 내 users MySQL 데이터베이스에 저장할 수 있습니까? 그렇다면 fbsr_ 쿠키를 사용하여 페이스 북의 공식 사용자가 누구인지를 어떻게 식별 할 수 있습니까?

로그 아웃 한 사용자의 모든 페이지 요청이 아니라 필요할 때만 액세스 할 수 있다는 것이 확실한 한 데이터베이스에 일부 항목을 저장하게되어 기쁩니다.

기본적으로 : $ _SESSIONs을 사용하지 않고 FB 사용자를 인증하는 것이 가능합니까? 여기서 "세션"은 서버 측 데이터를 링크하는 모든 방문자 (로그인 여부)에 대해 PHP로 설정된 쿠키를 의미합니다.

답변

3

정확도는 statecode이며 초기 인증 중 한 번 사용하기 때문에 다른 페이지에 유지할 필요가 없습니다.

사용자 ID는 데이터베이스에 저장할 수 있으며 종종 영구 입력으로 처리됩니다. Access_token은 데이터베이스에 저장할 수 있지만 물론 영구적 인 값이 아니며 자주 새로 고쳐야합니다. 하지만 그것은 세션이나 쿠키를 사용하는 것을 피하는 방법 일 수 있습니다. 사용자를 식별 할 수있는 다른 방법이 있으면 db에서 토큰을 가져올 수 있습니다.

어쨌든 cookie (un) 신뢰성의 이유로 어쨌든 페이스 북 앱용 PHP 세션을 사용한다는 생각은 결코 미쳐 본 적이 없습니다. 대부분의 Facebook 예제가 채워진 세션에 대한 의존도를 피하는 것에 대한 아이디어는 http://www.braintilt.com/fbcookies.php을 참조하십시오. 물론 쿠키에 불리한 점이 없다면 직접 설정할 수도 있고 GET/POST 메서드를 사용하여 사용자 식별자를 전파 할 수도 있습니다.

+0

링크가 작동하지 않습니다. – AndreKR

2

내가 알고있는 바에 따르면 code은 인증 중에 한 번만 사용되므로 저장할 필요가 없습니다.
은 필요한 경우 사용자 정보 용 그래프 API를 호출하는 데 도움이되므로 저장할 수도 있지만 2 시간 정도만 유효하다는 점에 유의해야합니다. 그 후에 getLoginUrl()을 사용하여 다시 인증해야합니다.
user_id을 분명히 저장할 수 있습니다. Facebook 사용자 ID이며 변경되지 않습니다. 그러나 user_id를 얻으려면 페이스 북에서 보내는 signed_request을 구문 분석해야합니다. 또는 getUser() 번으로 직접 전화 할 수 있습니다.
getUser()이 null을 반환하면 사용자가 Facebook에 의해 인증되지 않았 음을 알게되고 getLoginUrl()에서 반환 된 URL로 사용자를 리디렉션하여 사용자가 Facebook으로 인증되도록 할 수 있습니다. 인증 후에는 getUser()을 호출하여 user_id를 가져옵니다.
getUser()user_id을 반환하면 사용자가 Facebook을 인증 받았다는 것을 알고 있습니다.
페이스 북이 실제로 PHP SDK documentation을 개선 했으므로 시간이 많이 걸릴 것입니다.
마지막으로이 모든 것을 세션에 저장할 수 있지만 db에 user_id를 저장하는 것이 좋습니다. 나는 세션을 사용하여 access_token을 저장하고 항상 getUser()를 호출하여 방문자의 상태를 알리는 것이 좋습니다.
희망을 찾으셨습니까?
편집 : 동일한 질문을 두 번 게시했습니다.

+0

투표가 왜 불완전한가요? –

4

PHP SDK에서 Facebook.php 파일을 약간 변경했습니다. 모든 기능을 $ _SESSION 대신 쿠키로 작업하도록 변경했습니다.

// $_SESSION[$session_var_name] = $value; 
setcookie($session_var_name, $value, time() + 3600, '/'); 

및 주석으로 session_start 코드 :

//if (!session_id()) { 
// session_start(); 
// } 

이 간단한 솔루션이며, 그것은 완벽하게 작동합니다.

+0

이것은 최신 PHP SGD에서 작동합니까? – Maurice

0

Facebook PHP SDK (v3.0으로 시작)는 Facebook API와 상호 작용하는 데 사용되는 Facebook 클래스와 추상 클래스 BaseFacebook의 두 부분으로 나뉩니다. Facebook 클래스는이 추상 클래스를 확장합니다. BaseFacebook 추상 클래스는 Facebook 용 코어 oAuth API를 구현하여 새로운 Facebook 객체를 인스턴스화 할 때 사용되는 모든 public facing 함수를 제공합니다.

세션 처리 관련 함수는 Facebook 클래스에 구현 된 추상 함수입니다. 구현해야하는 네 가지 함수가 있습니다.

/** 
* Stores the given ($key, $value) pair, so that future calls to 
* getPersistentData($key) return $value. This call may be in another request. 
* 
* @param string $key 
* @param array $value 
* 
* @return void 
*/ 
abstract protected function setPersistentData($key, $value); 

/** 
* Get the data for $key, persisted by BaseFacebook::setPersistentData() 
* 
* @param string $key The key of the data to retrieve 
* @param boolean $default The default value to return if $key is not found 
* 
* @return mixed 
*/ 
abstract protected function getPersistentData($key, $default = false); 

/** 
* Clear the data with $key from the persistent storage 
* 
* @param string $key 
* @return void 
*/ 
abstract protected function clearPersistentData($key); 

/** 
* Clear all data from the persistent storage 
* 
* @return void 
*/ 
abstract protected function clearAllPersistentData(); 

이러한 클래스는 세션에서 사용하는 영구 데이터를 가져오고, 설정하고 지우는 데 사용됩니다. Facebook 클래스의 기본값은 PHP $_SESSION 변수를 사용하여이 데이터를 저장합니다. 자신의 클래스에서 BaseFacebook을 확장하는 이러한 함수를 구현하면 원하는 유형의 세션 처리로 변경할 수 있습니다.

BaseFacebook에는 'state', 'code', 'access_token'및 'user_id'와 같이 보존 된 데이터에 저장된 키가 4 개 있습니다.

'state'는 oAuth 요청의 인증에서 현재 상태를 결정하는 데 사용됩니다. '코드'가 검색된 후에는 사용되지 않습니다.

'code'는 Facebook에서 'access_token'을 검색하는 데 사용됩니다. 'access_token'이 검색된 후에는 사용되지 않습니다.

'access_token'은 Facebook oAuth API에 대한 후속 요청에서 사용됩니다. 나는 그것이 단지 약 2 시간 동안 좋다고 믿는다.

'user_id'는 사용자의 Facebook ID입니다. 이 값은 해당 사용자에게 고유하며 영구적입니다. 무기한으로 저장할 수 있습니다.

이 정보는 현재 버전의 SDK (v3.2.2)에서 유효합니다.

Facebook PHP oAuth 로그인 흐름에 대한 자세한 내용은 the Facebook developer page을 참조하십시오.