사용자 액세스 토큰에서 애플리케이션 ID 가져 오기 (또는 토큰에 대한 소스 애플리케이션 확인)
대답이있는 이 질문을 찾았 지만 그 이후로 페이스 북은 토큰 형식을 변경했으며 이제 다음과 같습니다.
AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD
요컨대, 당신은 그것으로부터 아무것도 추론 할 수 없습니다. 또한 토큰 을 붙여 넣으면 찾고있는 정보를 표시 하는 액세스 토큰 디버거를 찾았 습니다. 이것은 훌륭하지만 프로그래밍 방식으로 수행하는 데 도움이되지 않습니다.
요점은 누군가 사용자에 대한 토큰을 받으면이를 사용하여 그래프에 액세스 할 수 있다는 것입니다. 이것이 제가 애플리케이션에서하는 일입니다. 사람들이 제 애플리케이션에서 발행 한 토큰을 전달하고 있는지 확인하고 싶습니다. 그리고 다른 것이 아닙니다.
내 신청 흐름은 다음과 같습니다.
- Facebook에서 액세스 토큰을 가져옵니다 ( 여기에 설명 된 방식으로 서버 측 Flow. (iPhone 및 Android도 사용되지만 올바르게 기억하면 비슷한 흐름이 있음))
[device] <-> [facebook ] - 해당 액세스 토큰을 사용하면 장치가
[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 엔드 포인트가 실패합니다.
관련 페이스 북 문서 :
액세스 토큰 검사 : https://developers.facebook.com/docs/facebook-login/login-flow-for-web-no-jssdk/#checktoken
앱 토큰 : https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens
이를 확인하는 문서화 된 방법은 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.
'Program Club' 카테고리의 다른 글
| SQL Server 데이터베이스의 모든 스키마 목록을 가져 오는 방법 (0) | 2020.12.12 |
|---|---|
| 줄 번호를 입력하지 않고 gdb를 사용하여 줄을 건너 뛸 수 있습니까? (0) | 2020.12.12 |
| 특정 그룹의 모든 사용자를 나열하는 쿼리 (0) | 2020.12.12 |
| Linux : 분산 / 수집 IO (readv, writev)와 fread가있는 대용량 버퍼를 사용하는 경우 (0) | 2020.12.12 |
| Python Scipy의 2- 표본 Kolmogorov-Smirnov 테스트 (0) | 2020.12.12 |
