tools page obtener developers app aplicacion facebook facebook-c#-sdk oauth-2.0 facebook-oauth

facebook - page - Obtenga el ID de aplicación del token de acceso de usuario(o verifique la aplicación de origen para un token)



obtener access token facebook (4)

Encontré esta question , que tiene una respuesta, pero Facebook cambió el formato de token desde entonces, ahora es algo así como:

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD

En resumen, no puedes inferir nada de eso. También encontré el depurador de tokens de acceso , que muestra la información que estoy buscando si pega un token, lo cual es bueno, pero no me ayuda a hacerlo programáticamente.

El punto es que, si alguien obtiene un token para un usuario, puede usarlo para acceder al gráfico, que es lo que hago en mi aplicación: quiero estar seguro de que las personas estén reenviando el token que mi aplicación les envió, y no otro

Mi flujo de aplicaciones es:

  1. Obtenga el token de acceso de Facebook (nada especial, en la forma en que se describe here , Server-side Flow. (También iPhone y android y utilizado, pero tienen flujos similares si recuerdo correctamente))
    [dispositivo] <-> [facebook]
  2. Con ese token de acceso, el dispositivo accederá a mi servidor de aplicaciones con el token
    [dispositivo] <-> [Aplicación de Jonathan]
    En mi servidor adjunto el token de acceso al usuario y lo uso para otorgar permisos a ese usuario en mi aplicación. (usando facebook connect para autenticar usuarios)


Mi aplicación está segura, y el acceso hecho también está autenticado independientemente de Facebook, ¡PERO! en este flujo, el vínculo débil que identifiqué es que no puedo autenticar con certeza que el token de acceso que obtuve se firmó para mi aplicación: no me gusta porque guardo los tokens para uso fuera de línea, quiero estar 100% seguro son para mi aplicación, con mis permisos.

Entonces, ¿cuál será la (mejor) forma de autenticar que el token que recibí está relacionado con mi aplicación (por relación con el usuario, utilizo el token para acceder / me y ver para qué usuario es este token)

No necesito descifrar el token (supongo que es una especie de AES), solo estoy buscando un punto final que me diga que el token coincide con el ID de mi aplicación.

(EDITAR: Usando C # SDK, si es importante ... Pero una llamada de gráfico / descanso para dar esa información es igual de buena :))


¿Por qué no usar la forma oficial de hacer las cosas? Aquí está la solicitud del propio video de FB sobre seguridad.

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

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

Enlace a un video oficial: https://www.facebook.com/FacebookforDevelopers/videos/10152795636318553/

Hice una captura de pantalla para que el tiempo esté visible y puede encontrar más información si está interesado.


El punto final gráfico oficial para inspeccionar los tokens de acceso es:

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

Ejemplo de respuesta:

{ "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 se puede obtener usando la llamada Graph API:

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

El punto final debug_token fallará si ese user_access_token no pertenece a la aplicación que generó el app_token_or_admin_token.

Documentación relevante de Facebook:


Una forma documentada de garantizar esto es usar appsecret_proof .

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

Esto verifica no solo que es un token válido, sino también que el token pertenece a la aplicación. También obtiene los datos del usuario de una vez.

Puede derivar la PROOF anterior en C # usando esto (desde 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);