iPhone 앱에 대한 Facebook 액세스 토큰 서버 측 유효성 검사


112

서버와의 통신을 기반으로하는 iPhone 애플리케이션을 개발 중이며 Facebook 인증 메커니즘을 사용하고 싶습니다.

기본적으로 다음과 같이 작동해야한다고 생각합니다.

  1. 내 iPhone 앱에서 사용자는 이메일과 비밀번호를 사용하여 Facebook에 로그인합니다.
  2. 사용자는 관련 Facebook 애플리케이션에 대한 자신의 데이터에 대한 액세스를 허용합니다.
  3. 로그인에 성공하면 내 iPhone 앱이 액세스 토큰을받습니다.
  4. 내 서버와의 추가 통신에서 내 iPhone 애플리케이션은 수신 된 Facebook 액세스 토큰을 사용해야합니다 (예 : 쿼리에서).
  5. 내 서버가 액세스 토큰을 사용하여 iPhone 앱에서 쿼리를 받으면이 토큰이 유효한지 (그리고 누구에 대해) Facebook에 요청해야하며, 그렇다면 서버는 사용자가 Facebook으로 인증되었다고 가정해야합니다.

내 질문은 : 주어진 액세스 토큰이 유효한지 서버가 Facebook에 어떻게 요청해야합니까? 내 Facebook 앱에서 토큰이 유효한지 어떻게 든 확인해야한다고 생각합니다.

API를 그래프로 만들기 위해 많은 Facebook 쿼리를 시도했지만 예상대로 작동하지 않았습니다. 몇 가지 예를 들어 주시겠습니까?


5
사용자가 FB에서 앱에서 로그 아웃하지 않은 경우 인증 토큰을 서버로 보낼 수 있습니다 (ssl 희망). 그래프 API를 통한 "/ me"의 간단한 쿼리가 성공하거나 실패합니까?
The Mad Gamer 2011 년

당신은 당신의 토큰이 유효한 :)이 아니라고 페이스 북에서 응답 메시지를 받게됩니다
장 뤽 고다르

1
나는 당신이하고있는 것과 매우 유사한 것을하려고 노력하고 있습니다. 이 질문을 답변으로 표시 한 적이 없습니다.이 질문이 작동하게 된 적이 있습니까?
tempy 2011

access_token이 만료되면 어떻게됩니까? 사용자에게 다시 로그인을 요청해야합니까? 내가 토큰이 만료 된 후 다시 유효성 검사를 다시하는 방법을 이해하려면
debianmaster

@debianmaster는 앱 아키텍처에 따라 다릅니다. "FB 토큰 없음-앱에 대한 액세스 권한 없음"을 예로 고려하는 경우 사용자를 로그 아웃하십시오. 그렇지 않으면 사용자가 로그인 상태를 유지하지만 Facebook에서받은 정보가 서버 / 클라이언트의 계정에서 분리되는 "연결 해제"논리를 고려할 수 있습니다.
Yevhen Dubinin

답변:


115

다음은 사용자 액세스 토큰이 앱에 속하는지 확인하는 데 사용할 수있는 2 단계 프로세스입니다.

1) 앱 액세스 토큰 생성

( https://developers.facebook.com/docs/howtos/login/login-as-app/ )

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&client_secret=YOUR_APP_SECRET
&grant_type=client_credentials

2) 사용자 액세스 토큰 디버그

( https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/ )

https://graph.facebook.com/debug_token?
input_token=INPUT_TOKEN
&access_token=ACCESS_TOKEN

여기서 INPUT_TOKEN은 확인하려는 사용자 액세스 토큰이고 ACCESS_TOKEN은 1 단계에서 얻은 앱 토큰입니다.

디버그 엔드 포인트는 기본적으로 토큰에 대한 모든 정보를 덤프하므로 다음과 같이 응답합니다.

{
    data: {
        app_id: YOUR_APP_ID,
        is_valid: true,
        metadata: {
            sso: "iphone-safari"
        },
        application: YOUR_APP_NAMESPACE,
        user_id: USER_ID,
        issued_at: 1366236791,
        expires_at: 1371420791,
        scopes: [ ]
    }
}

해당 토큰이 '내 앱'이 아닌 경우 오류 응답을 반환합니다.


13
Facebook에 따르면 이것이 토큰을 검사하는 올바른 방법입니다. 그러나 첫 번째 부분은 관리자 또는 앱 토큰 대신 앱 ID와 암호를 사용할 수 있으므로 선택 사항입니다.
Brandon Zacharie

@BrandonZacharie 마십시오 당신이, 난 그냥 앱 ID 및 암호를 사용하여 시도 어떻게보고 "input_token 매개 변수는 필수"나에게 오류를 준하지
조니 Z

@JohnnyZ 입력 토큰이 필요합니다. 액세스 토큰은 유연성이있는 곳입니다.
Brandon Zacharie 2014

8
@BrandonZacharie 맞습니다, 입력 및 액세스 토큰이 혼란 스러웠습니다. | APP_SECRET & access_token은 = APP_ID : 구분 기호로 파이프 매개 변수로이 전달 응용 프로그램 ID와 비밀 I을 사용하여
조니 Z


115

업데이트 : 이 답변은 앱에 속한 것으로 먼저 토큰을 확인하지 않기 때문에 안전하지 않은 것 같습니다. 다음과 같이 댓글, 원래 답변을 참조하십시오.

이미 액세스 토큰이 있다고 가정합니다. 이 경우 액세스 토큰을 검증하는 가장 간단한 방법은 다음 요청을 발행하는 것입니다.

https://graph.facebook.com/me?fields=id&access_token=@accesstoken

여기에서 @accesstoken을 보유한 액세스 토큰으로 바꿉니다. URL을 분석하고 각각에 대해 설명하겠습니다.

여기에서 액세스 토큰 소유자의 Facebook 사용자 ID를 JSON 문자열로 반환하는 그래프 API 요청을 발행합니다. 키워드 'me'는 현재 로그인 한 사용자 또는 액세스 토큰의 소유자를 나타냅니다. 이 요청의 경우 액세스 토큰은 필수 매개 변수입니다.

제공된 액세스 토큰이 유효하지 않거나 만료 된 경우 Facebook은 일종의 오류 메시지 만 반환합니다.

유효한 액세스 토큰의 경우 결과는 다음과 같습니다.

{
   "id": "ID_VALUE"
}

14
해당 사용자가 다른 앱에 속한 access_token을 제공하면 해당 요청이 성공하지 않을까요?
Yuriy Nemtsov

2
모든 유효한 사용자 액세스 토큰을 사용할 수 있습니다 (어떤 앱에 속해 있든 관계없이)
Robin

12
@Xiquid이 게시물은 액세스 토큰이 애플리케이션에 속하는지 확인하지 않으므로 문제에 대한 해결책이 아닙니다.
Kolyunya 2014

12
이 답변이 가장 많은 표를 얻은 이유를 이해할 수 없습니다! 분명히 올바른 솔루션이 아닙니다. 실제로 올바른 접근 방식은 "게 세바스찬"이 제안한 것입니다. debug_token 끝점은 토큰 자체에 대한 정보를 쿼리하는 데 사용되며 이러한 방식으로 토큰이 특정 앱 ID의 특정 사용자 ID에 속하는지 확인할 수 있습니다!
Alex Ntousias

4
네, 정답이 아닙니다. 이 방법으로 액세스 토큰을 확인하면 다른 사람이 다른 애플리케이션에서 액세스 토큰을 가져와이를 사용하여 인증 할 수 있습니다.
Jonathan

11

또 다른 해결책은 사용자 액세스 토큰에서 애플리케이션 ID 가져 오기 (또는 토큰에 대한 소스 애플리케이션 확인)에https://graph.facebook.com/app/?access_token=[user_access_token] 설명 된대로 사용하는 것 입니다.

이것은 문서화되지 않은 기능으로 보이지만 토큰이 생성 된 앱의 ID가 포함 된 JSON을 반환합니다. 토큰이 앱 용이 아닌 경우 400을 반환합니다.


다른 Facebook 비즈니스의 등급을 어떻게 얻을 수 있습니까? 이를 위해 무엇을해야합니까?
Maneesh Rao

6

최신 버전의 facebook (2.2)에서는 다음과 같이 할 수 있습니다.

https://developers.facebook.com/docs/graph-api/reference/v2.2/debug_token

샘플 출력 :

{
    "data": {
        "app_id": "THE APP ID", 
        "application": "APP NAME", 
        "expires_at": 1427245200, 
        "is_valid": true, 
        "scopes": [
        "public_profile", 
        "basic_info", 
        "read_stream", 
        "email", 
        "publish_actions", 
        "read_friendlists", 
        "user_birthday", 
        "user_hometown", 
        "user_location", 
        "user_likes", 
        "user_photos", 
        "user_videos", 
        "user_friends", 
        "user_posts"
        ], 
        "user_id": "THE USER ID"
    }
}

이것은 각 요청에서이 fb 엔드 포인트를 호출해야한다는 것을 의미합니까? 더 나은 방법이 없습니까?
Jdruwe

이것은 작동하지만 액세스 토큰이 필요합니다. 액세스 토큰은 'sebastian the crab'답변을 사용하여 생성하거나 단순히 appid | appsecret을 사용할 수 있습니다. Fore more Info developers.facebook.com/docs/facebook-login/…
krishnan

다음은 이것의 사용 예입니다. stackoverflow.com/a/16947027/32453
rogerdpack

2
private function facebookRequestMe($access_token)
{
    include_once "facebook.php";

    $facebook = new Facebook(array(
        "appId" => "your_application_id",
        "secret" => "your_application_secret"
    ));
    $facebook->setAccessToken($access_token);
    return $facebook->api("/me", "GET");
}

GitHub 에서 PHP 용 Facebook SDK를 다운로드 할 수 있습니다 .


1

사용자가 자신의 것으로 주장하는 Facebook UID를 전달했고 그것이 합법적인지 확인하려는 경우 액세스 토큰 (Robin Jome의 답변 구현)에 대해이를 확인하는 Python 함수입니다.

def verify_facebook_id(id, access_token):
    import requests
    import simplejson
    params = {'fields': 'id', 'access_token': access_token}
    text = requests.get("https://graph.facebook.com/me", params=params).text
    json = simplejson.loads(text)
    response_id = json["id"]
    return response_id == id

이 ... 토큰은 불행히도 "앱"생성 된 것을 확인하지 않습니다
rogerdpack

1

이것은 단 하나의 요청을 사용하여 사용자 토큰을 확인하는 유일한 보안 방법입니다.

https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app_id}|{app_secret}

기호 "|" 위의 URL은 OR로 사용되지 않지만 구분자로 사용되며 다른 필드를 채운 후에 있어야합니다.

응답은 다음과 같은 JSON입니다.

{
    data: {
        app_id: {app_id},
        application: {app_name},
        expires_at: {some_number},
        is_valid: {true|false}
        scopes: {array_of_permissions},
        user_id: {user_id}
    }
}

참조 : https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (위의 방법은이 섹션 하단에 언급 됨)


하나 개의 요청으로 다른 보안 방법이 있습니다 : stackoverflow.com/a/36555287/32453
rogerdpack

-1

액세스 토큰과 함께 Facebook은 오프셋 값인 "expires_in"매개 변수도 보냅니다. 이를 사용하여 액세스 토큰이 NSDate로 만료되는시기를 계산합니다. 그런 다음 요청을해야 할 때 현재 날짜와 만료 날짜를 비교하십시오.

또한 Facebook이 다시 보내는 상태 코드와 응답 문자열을 검사 해보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.