Program Club

사용자 액세스 토큰에서 애플리케이션 ID 가져 오기 (또는 토큰에 대한 소스 애플리케이션 확인)

proclub 2020. 12. 12. 11:39
반응형

사용자 액세스 토큰에서 애플리케이션 ID 가져 오기 (또는 토큰에 대한 소스 애플리케이션 확인)


대답이있는 질문을 찾았 지만 그 이후로 페이스 북은 토큰 형식을 변경했으며 이제 다음과 같습니다.

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD

요컨대, 당신은 그것으로부터 아무것도 추론 할 수 없습니다. 또한 토큰 을 붙여 넣으면 찾고있는 정보를 표시 하는 액세스 토큰 디버거를 찾았 습니다. 이것은 훌륭하지만 프로그래밍 방식으로 수행하는 데 도움이되지 않습니다.

요점은 누군가 사용자에 대한 토큰을 받으면이를 사용하여 그래프에 액세스 할 수 있다는 것입니다. 이것이 제가 애플리케이션에서하는 일입니다. 사람들이 제 애플리케이션에서 발행 한 토큰을 전달하고 있는지 확인하고 싶습니다. 그리고 다른 것이 아닙니다.

내 신청 흐름은 다음과 같습니다.

  1. Facebook에서 액세스 토큰을 가져옵니다 ( 여기에 설명 된 방식으로 서버 측 Flow. (iPhone 및 Android도 사용되지만 올바르게 기억하면 비슷한 흐름이 있음))
    [device] <-> [facebook ]
  2. 해당 액세스 토큰을 사용하면 장치가
    [device] <-> [Jonathan의 응용 프로그램]
    토큰을 사용하여 내 응용 프로그램 서버에 액세스합니다. 내 서버에서 액세스 토큰을 사용자에게 연결하고이를 사용하여 내 응용 프로그램의 해당 사용자에게 권한을 부여합니다. (페이스 북 연결을 사용하여 사용자 인증)


내 응용 프로그램은 보안이 유지되고 Facebook에 관계없이 액세스 권한도 인증됩니다. 이 흐름에서 확인한 약한 링크는 내가받은 액세스 토큰이 내 애플리케이션에 대해 서명되었는지 확인할 수 없다는 것입니다. 오프라인 사용을 위해 토큰을 캐시하기 때문에 마음에 들지 않습니다. 100 % 확신하고 싶습니다. 내 권한이있는 내 애플리케이션 용입니다.

그래서 내가 얻은 토큰이 내 응용 프로그램과 관련이 있음을 인증하는 (가장 좋은) 방법은 무엇입니까 (사용자와 관련하여 토큰을 사용하여 / me에 액세스 하고이 토큰이 어떤 사용자인지 확인합니다)

토큰을 해독 할 필요가 없습니다 (AES의 일종 인 것 같습니다). 토큰이 내 애플리케이션 ID와 일치한다고 알려주는 엔드 포인트를 찾고 있습니다.

(편집 : 중요한 경우 C # SDK 사용 ..하지만 해당 정보를 제공하는 그래프 / 나머지 호출도 마찬가지로 좋습니다. :))


https://graph.facebook.com/app/?access_token=[user_access_token]

그러면이 토큰이 생성 된 앱이 반환되며 앱의 ID와 비교할 수 있습니다.


액세스 토큰을 검사하기위한 공식 그래프 엔드 포인트는 다음과 같습니다.

GET graph.facebook.com/debug_token?
      input_token=[user_access_token]&
      access_token=[app_token_or_admin_token]

응답 예 :

{
    "data": {
        "app_id": 138483919580948, 
        "application": "Social Cafe", 
        "expires_at": 1352419328, 
        "is_valid": true, 
        "issued_at": 1347235328, 
        "metadata": {
            "sso": "iphone-safari"
        }, 
        "scopes": [
            "email", 
            "publish_actions"
        ], 
        "user_id": 1207059
    }
}

app_token_or_admin_token Graph API 호출을 사용하여 얻을 수 있습니다.

GET graph.facebook.com/oauth/access_token?
     client_id={app-id}
    &client_secret={app-secret}
    &grant_type=client_credentials

user_access_token이 app_token_or_admin_token을 생성 한 앱에 속하지 않으면 debug_token 엔드 포인트가 실패합니다.

관련 페이스 북 문서 :


이를 확인하는 문서화 된 방법은 appsecret_proof.

GET graph.facebook.com/v2.5/me?access_token=[TOKEN]&appsecret_proof=[PROOF]

This verifies not only that it is a valid token, but also that the token belongs to the app. It also gets you user data in one go.

You can derive PROOF above in C# using this (from here):

public static string ComputeHmacSha256Hash(string valueToHash, string key)
{
    byte[] keyBytes = Encoding.ASCII.GetBytes(key); 
    byte[] valueBytes = Encoding.ASCII.GetBytes(valueToHash);
    byte[] tokenBytes = new HMACSHA256(keyBytes).ComputeHash(valueBytes);
    valueBytes = null;
    keyBytes = null; 

    StringBuilder token = new StringBuilder();
    foreach (byte b in tokenBytes)
    {
        token.AppendFormat("{0:x2}", b);
    }
    tokenBytes = null; 

    return token.ToString();
}

ComputeHmacSha256Hash(accessToken, appSecret);

Why not to use official way of doing things? Here's the request from FB's own video about security.

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

Response: "data": { "app_id": {token-app-id}, "user_id": {token-user-id}, ... }

Link to an official video: https://www.facebook.com/FacebookforDevelopers/videos/10152795636318553/

I made a screenshot so that time is visible, and you can find more info if you are interested.

Facebook video screenshot

참고URL : https://stackoverflow.com/questions/8141037/get-application-id-from-user-access-token-or-verify-the-source-application-for

반응형