성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] How Much Memory Do You Need in 2024...
[정성태] 특권을 조회하는 whoami 명령어 c:\temp> who...
[정성태] 커널 디버깅에서 특정 프로세스의 Token 정보 조회 //...
[정성태] What has case distinction but is ne...
[정성태] 대소문자 '변환'과 함께 따라오는 문제가 바로 대소문자 구분 없...
[정성태] Reverse-engineering what a "short" ...
[정성태] 윈도우의 경우, 스레드 관련 자원을 완전히 회수하기 위해 Thr...
[지현명] Android쪽에서 activity 접근 할때 아래꺼 적어 놓고...
[지현명] Maui.Android에서 폴더 관련 내용 정리 잘 되어 있네요...
[정성태] @정한솔 언급하신 사항이 맞습니다. (C# 13부터) 중간에 i...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C# - Facebook 연동 / 사용자 탈퇴 처리 방법</h1> <p> 제 웹 사이트처럼 페이스북 연동을 해서 사용자 가입을 하면, 탈퇴는 어떻게 할 수 있을까요? ^^ 이런 경우, 사용자는 페이스북 계정 관리 페이지에 접속해,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 페이스북 - 내가 사용 중인 어플리케이션 설정 페이지 ; <a target='tab' href='https://www.facebook.com/settings?tab=applications'>https://www.facebook.com/settings?tab=applications</a> </pre> <br /> 자신이 가입한 서비스 목록에서 선택해 탈퇴를 할 수 있습니다. 그런 경우, 페이스북 측은 당연히 해당 계정이 서비스 이용을 해제했다는 알림을 해야만 그 서비스 측에서는 해당 계정에 대한 정보를 삭제할 수 있습니다.<br /> <br /> 이를 위해 제공하는 설정이 바로 "승인 취소" - "콜백 URL 승인 취소" 링크입니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='facebook_user_withdraw_2.png' src='/SysWebRes/bbs/facebook_user_withdraw_2.png' /><br /> <br /> Visual Studio의 경우라면, 개발 과정에서는 <a target='tab' href='https://www.sysnet.pe.kr/2/0/13218'>Dev Tunnels</a>를 이용해 로컬 PC에 응용 프로그램을 실행한 다음 "콜백 URL 승인 취소"에 "https://[생략].asse.devtunnels.ms/" 경로를 입력해 두는 식으로 테스트할 수 있습니다.<br /> <br /> 실제로 해보면, 사용자가 서비스 이용 중지를 하는 경우 페이스북 측에서는 아래와 같은 형식의 요청이 날아옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Accept: */* Host: localhost:5153 User-Agent: facebookexternalua Accept-Encoding: deflate, gzip Content-Type: application/x-www-form-urlencoded Content-Length: 163 <span style='color: blue; font-weight: bold'>signed_request=okeW...[생략]...MjR9</span> </pre> <br /> signed_request의 형식은 facebook에서 공개하고 있어,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Signed Requests ; <a target='tab' href='https://developers.facebook.com/docs/reference/login/signed-request/'>https://developers.facebook.com/docs/reference/login/signed-request/</a> ; <a target='tab' href='https://developers.facebook.com/docs/games/build/legacy-web-games/get-started/login#parsingsr'>https://developers.facebook.com/docs/games/build/legacy-web-games/get-started/login#parsingsr</a> </pre> <br /> 저대로 디코딩을 할 수 있지만, ^^ 당연히 여러분이 사용 중인 언어에 해당하는 예제가 이미 웹에는 있을 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > How to get the facebook signed request in c# ; <a target='tab' href='https://stackoverflow.com/questions/19046207/how-to-get-the-facebook-signed-request-in-c-sharp'>https://stackoverflow.com/questions/19046207/how-to-get-the-facebook-signed-request-in-c-sharp</a> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > string appSecret = "[...app_secret...]"; string signedRequest = Request.Form["signed_request"]; string data = DecodeSignedRequest(signedRequest, appSecret); public static string DecodeSignedRequest(string signed_request, string app_secret) { try { if (signed_request.Contains(".")) { string[] split = signed_request.Split('.'); string signatureRaw = FixBase64String(split[0]); string dataRaw = FixBase64String(split[1]); // the decoded signature byte[] signature = Convert.FromBase64String(signatureRaw); byte[] dataBuffer = Convert.FromBase64String(dataRaw); // JSON object string data = Encoding.UTF8.GetString(dataBuffer); byte[] appSecretBytes = Encoding.UTF8.GetBytes(app_secret); System.Security.Cryptography.HMAC hmac = new System.Security.Cryptography.HMACSHA256(appSecretBytes); byte[] expectedHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(split[1])); if (expectedHash.SequenceEqual(signature)) { return data; } } } catch { // error } return ""; } private static string FixBase64String(string str) { while (str.Length % 4 != 0) { str = str.PadRight(str.Length + 1, '='); } return str.Replace("-", "+").Replace("_", "/"); } </pre> <br /> 위의 과정을 거쳐 signed_request를 해독하면 이런 결과가 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > {<span style='color: blue; font-weight: bold'>"user_id":"520333434958903"</span>,"algorithm":"HMAC-SHA256","issued_at":1705146378} </pre> <br /> 바로 저 "user_id"를 기준으로 서비스에 등록된 사용자 데이터를 삭제할 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 사용자 계정 해제에 이와 유사한 메뉴가 하나 더 있습니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='facebook_user_withdraw_1.png' src='/SysWebRes/bbs/facebook_user_withdraw_1.png' /><br /> <br /> 위의 화면처럼, "사용자 데이터 삭제"이기 때문에 "데이터 삭제 콜백 URL"로 선택하고 주소를 등록하면 그쪽으로 콜백이 있을 것 같은데, 실제로 테스트를 해보면 아무런 요청도 없습니다.<br /> <br /> 공식 문서에 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 데이터 삭제 요청 콜백 ; <a target='tab' href='https://developers.facebook.com/docs/development/create-an-app/app-dashboard/data-deletion-callback/'>https://developers.facebook.com/docs/development/create-an-app/app-dashboard/data-deletion-callback/</a> </pre> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> 데이터 삭제 콜백은 앱 사용자가 앱을 삭제하거나 Facebook 계정 설정에서 앱과 공유하는 데이터(예: 이메일 주소)에 대한 액세스 권한을 삭제할 때마다 호출됩니다.<br /> </div><br /> <br /> 아마도, 스마트폰의 앱과 연동하는 유형에서 해당 앱을 삭제하는 것만으로 콜백을 전달하는 걸로 보입니다. 나중에 이런 앱을 만들어 테스트해 보면 알 수 있겠지요. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
4986
(왼쪽의 숫자를 입력해야 합니다.)