Microsoft MVP성태의 닷넷 이야기
닷넷: 2201. C# - Facebook 연동 / 사용자 탈퇴 처리 방법 [링크 복사], [링크+제목 복사],
조회: 6717
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 7개 있습니다.)
.NET Framework: 193. 페이스북(Facebook) 계정으로 로그인하는 C# 웹 사이트 제작
; https://www.sysnet.pe.kr/2/0/953

.NET Framework: 198. 윈도우 응용 프로그램에 Facebook 로그인 연동
; https://www.sysnet.pe.kr/2/0/970

.NET Framework: 245. ASP.NET 서버 측 코드에서 페이스북 계정 연동하는 방법
; https://www.sysnet.pe.kr/2/0/1143

개발 환경 구성: 313. Nuget Facebook 라이브러리를 이용해 ASP.NET 웹 폼과 로그인 연동하는 방법
; https://www.sysnet.pe.kr/2/0/11182

개발 환경 구성: 436. 페이스북 HTTPS 인증을 localhost에서 테스트하는 방법
; https://www.sysnet.pe.kr/2/0/11855

개발 환경 구성: 482. Facebook OAuth 처리 시 상태 정보 전달 방법과 "유효한 OAuth 리디렉션 URI" 설정 규칙
; https://www.sysnet.pe.kr/2/0/12189

닷넷: 2201. C# - Facebook 연동 / 사용자 탈퇴 처리 방법
; https://www.sysnet.pe.kr/2/0/13526




C# - Facebook 연동 / 사용자 탈퇴 처리 방법

제 웹 사이트처럼 페이스북 연동을 해서 사용자 가입을 하면, 탈퇴는 어떻게 할 수 있을까요? ^^ 이런 경우, 사용자는 페이스북 계정 관리 페이지에 접속해,

페이스북 - 내가 사용 중인 어플리케이션 설정 페이지
; https://www.facebook.com/settings?tab=applications

자신이 가입한 서비스 목록에서 선택해 탈퇴를 할 수 있습니다. 그런 경우, 페이스북 측은 당연히 해당 계정이 서비스 이용을 해제했다는 알림을 해야만 그 서비스 측에서는 해당 계정에 대한 정보를 삭제할 수 있습니다.

이를 위해 제공하는 설정이 바로 "승인 취소" - "콜백 URL 승인 취소" 링크입니다.

facebook_user_withdraw_2.png

Visual Studio의 경우라면, 개발 과정에서는 Dev Tunnels를 이용해 로컬 PC에 응용 프로그램을 실행한 다음 "콜백 URL 승인 취소"에 "https://[생략].asse.devtunnels.ms/" 경로를 입력해 두는 식으로 테스트할 수 있습니다.

실제로 해보면, 사용자가 서비스 이용 중지를 하는 경우 페이스북 측에서는 아래와 같은 형식의 요청이 날아옵니다.

Accept: */*
Host: localhost:5153
User-Agent: facebookexternalua
Accept-Encoding: deflate, gzip
Content-Type: application/x-www-form-urlencoded
Content-Length: 163

signed_request=okeW...[생략]...MjR9

signed_request의 형식은 facebook에서 공개하고 있어,

Signed Requests
; https://developers.facebook.com/docs/reference/login/signed-request/
; https://developers.facebook.com/docs/games/build/legacy-web-games/get-started/login#parsingsr

저대로 디코딩을 할 수 있지만, ^^ 당연히 여러분이 사용 중인 언어에 해당하는 예제가 이미 웹에는 있을 것입니다.

How to get the facebook signed request in c#
; https://stackoverflow.com/questions/19046207/how-to-get-the-facebook-signed-request-in-c-sharp

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("_", "/");
}

위의 과정을 거쳐 signed_request를 해독하면 이런 결과가 나옵니다.

{"user_id":"520333434958903","algorithm":"HMAC-SHA256","issued_at":1705146378}

바로 저 "user_id"를 기준으로 서비스에 등록된 사용자 데이터를 삭제할 수 있습니다.




참고로, 사용자 계정 해제에 이와 유사한 메뉴가 하나 더 있습니다.

facebook_user_withdraw_1.png

위의 화면처럼, "사용자 데이터 삭제"이기 때문에 "데이터 삭제 콜백 URL"로 선택하고 주소를 등록하면 그쪽으로 콜백이 있을 것 같은데, 실제로 테스트를 해보면 아무런 요청도 없습니다.

공식 문서에 보면,

데이터 삭제 요청 콜백
; https://developers.facebook.com/docs/development/create-an-app/app-dashboard/data-deletion-callback/

데이터 삭제 콜백은 앱 사용자가 앱을 삭제하거나 Facebook 계정 설정에서 앱과 공유하는 데이터(예: 이메일 주소)에 대한 액세스 권한을 삭제할 때마다 호출됩니다.


아마도, 스마트폰의 앱과 연동하는 유형에서 해당 앱을 삭제하는 것만으로 콜백을 전달하는 걸로 보입니다. 나중에 이런 앱을 만들어 테스트해 보면 알 수 있겠지요. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 1/14/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13817정성태11/14/20241232Linux: 106. eBPF / bpf2go - (BPF_MAP_TYPE_HASH) Map을 이용한 전역 변수 구현
13816정성태11/14/20241269닷넷: 2312. C#, C++ - Windows / Linux 환경의 Thread Name 설정파일 다운로드1
13815정성태11/13/20241161Linux: 105. eBPF - bpf2go에서 전역 변수 설정 방법
13814정성태11/13/20241244닷넷: 2311. C# - Windows / Linux 환경에서 Native Thread ID 가져오기파일 다운로드1
13813정성태11/12/20241137닷넷: 2310. .NET의 Rune 타입과 emoji 표현파일 다운로드1
13812정성태11/11/2024990오류 유형: 933. Active Directory - The forest functional level is not supported.
13811정성태11/11/20241051Linux: 104. Linux - COLUMNS 환경변수가 언제나 80으로 설정되는 환경
13810정성태11/10/20241206Linux: 103. eBPF (bpf2go) - Tracepoint를 이용한 트레이스 (BPF_PROG_TYPE_TRACEPOINT)
13809정성태11/10/20241241Windows: 271. 윈도우 서버 2025 마이그레이션
13808정성태11/9/20241339오류 유형: 932. Linux - 커널 업그레이드 후 "error: bad shim signature" 오류 발생
13807정성태11/9/20241480Linux: 102. Linux - 커널 이미지 파일 서명 (Ubuntu 환경)
13806정성태11/8/20241321Windows: 270. 어댑터 상세 정보(Network Connection Details) 창의 내용이 비어 있는 경우
13805정성태11/8/20241203오류 유형: 931. Active Directory의 adprep 또는 복제가 안 되는 경우
13804정성태11/7/20241283Linux: 101. eBPF 함수의 인자를 다루는 방법
13803정성태11/7/20241497닷넷: 2309. C# - .NET Core에서 바뀐 DateTime.Ticks의 정밀도
13802정성태11/6/20241700Windows: 269. GetSystemTimeAsFileTime과 GetSystemTimePreciseAsFileTime의 차이점파일 다운로드1
13801정성태11/5/20241616Linux: 100. eBPF의 2가지 방식 - libbcc와 libbpf(CO-RE)
13800정성태11/3/20241942닷넷: 2308. C# - ICU 라이브러리를 활용한 문자열의 대소문자 변환 [2]파일 다운로드1
13799정성태11/2/20241593개발 환경 구성: 732. 모바일 웹 브라우저에서 유니코드 문자가 표시되지 않는 경우
13798정성태11/2/20241643개발 환경 구성: 731. 유니코드 - 출력 예시 및 폰트 찾기
13797정성태11/1/20241769C/C++: 185. C++ - 문자열의 대소문자를 변환하는 transform + std::tolower/toupper 방식의 문제점파일 다운로드1
13796정성태10/31/20241621C/C++: 184. C++ - ICU dll을 이용하는 예제 코드 (Windows)파일 다운로드1
13795정성태10/31/20241586Windows: 268. Windows - 리눅스 환경처럼 공백으로 끝나는 프롬프트 만들기
13794정성태10/30/20241702닷넷: 2307. C# - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
13793정성태10/28/20241649C/C++: 183. C++ - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
13792정성태10/27/20241460Linux: 99. Linux - 프로세스의 실행 파일 경로 확인
1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...