뒤끝 패러데이션 로그인 오류가 발생해서 문의 드립니다.

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.11.0
  • 프로젝트명 : Defence servival
  • 스테이터스 코드 :
  • 에러 코드 : 401 /BadUnauthorizedException /bad bad accessToken, 잘못된 bad accessToken 입니다
    BackendAppleLogin:AppleLogin(Action`1)
    LoadingManager:Update()
  • 에러 메시지 :

현재 프로젝트에서 패러데이션을 통한 애플 로그인을 실행할 경우 아래와 같은 오류 메시지가 출력됩니다.

401 /BadUnauthorizedException /bad bad accessToken, 잘못된 bad accessToken 입니다
BackendAppleLogin:AppleLogin(Action`1)

해당 오류 해결을 위해 Backend.BMember.RefreshTheBackendToken(); 을 사용해서 토큰을 갱신하는 경우 로컬에 저장된 로그인 데이터가 사라지는 경우가 발생합니다.

어떻게 해결해야되는지 알 수있을까요?

아래는 작성한 코드 입니다.

// 로그인/ 자동로그인시 로그인 타입에 따라 함수 실행
public static void ExternalLogin(int logintype, Action ac_Success = null, Action ac_Fail = null)
    {
        Debug.Log("External Login");
        Login_Kind = logintype;
        ac_LoginSuccess += ac_Success;
        ac_LoginFail += ac_Fail;
        switch (Cur_LoginSDK)
        {
            case E_LoginSDK.BackEnd:
                switch (logintype.Get_FederationType())
                {
                    case FederationType.Google:
                        AuthorizeFederation.Instance.GPGSLogin(ac_BackendLoginSuccess);
                        break;
                    case FederationType.Facebook:
                        break;
                    case FederationType.Apple:
                        BackendAppleLogin.Instance.AppleLogin(ac_BackendLoginSuccess);
                        break;
                }
                break;
        }
    }

// 애플 로그인
public void AppleLogin(Action<BackendReturnObject> ac_backendsuccess)
    {
        // 애플 토큰이 없을 경우
        if (string.IsNullOrEmpty(UserManager.UserData.D_Local_user.Apple_Token))
        {
            var loginArgs = new AppleAuthLoginArgs(AppleAuth.Enums.LoginOptions.IncludeEmail | AppleAuth.Enums.LoginOptions.IncludeFullName);

            appleAuthManager.LoginWithAppleId(
                loginArgs,
                credential =>
                {
                    var appleIdCredential = credential as IAppleIDCredential;
                    if (appleIdCredential != null)
                    {
                        var userId = appleIdCredential.User;
                        var email = appleIdCredential.Email;
                        var fullName = appleIdCredential.FullName;
                        var identityToken = Encoding.UTF8.GetString(appleIdCredential.IdentityToken);
                        var authorizationCode = Encoding.UTF8.GetString(appleIdCredential.AuthorizationCode);
                        Debug.Log("Apple Signin Success");

                        // 생성한 토큰 로컬{UserManager.UserData.D_Local_user.Apple_Token}에 저장
                        SaveData.Json_Save(SaveData.DataKind.AppleToken, identityToken);

                        var bro = Backend.BMember.AuthorizeFederation(identityToken, FederationType.Apple, "siwa");
                        ac_backendsuccess?.Invoke(bro);
                    }
                },
                error =>
                {
                   // Debug.Log("Apple Signin Error");
                });
        }
        else
        {
            // 토큰이 있을 경우 해당 토큰을 사용해서 로그인 실행
            var bro = Backend.BMember.AuthorizeFederation(UserManager.UserData.D_Local_user.Apple_Token, FederationType.Apple, "siwa");

            if (!bro.IsSuccess())
            {
                Debug.Log($"login erroer");


                if (bro.IsBadAccessTokenError())
                {
                    Debug.Log("access token is finsh ");

                    var bro2 = Backend.BMember.RefreshTheBackendToken();

                    if (bro2.GetMessage() == "bad refreshToken")
                    {
                        Debug.Log("loaind orther tarken");
                    }

                    ac_backendsuccess?.Invoke(bro2);

                }
            }
            else
            {
                Debug.Log("token login success");

                ac_backendsuccess?.Invoke(bro);
            }
        }

안녕하세요 개발자님,
확인 시 로그인 과정에서 발생한 에러 메시지는 'bad bad accessToken, 잘못된 bad accessToken 입니다'로
뒤끝의 엑세스 토큰이 아닌, 애플의 JWT 정보가 잘못되어 발생하는 에러로 확인됩니다.

뒤끝의 액세스 토큰 관련 에러는 다음과 같습니다.

로그인 함수 호출 시 Access Token이 올바르지 않거나 만료된 경우
에러코드 : 401
에러메시지 : bad accessToken, 잘못된 accessToken 입니다

로그인 외 기능 호출 시 Access Token이 올바르지 않거나 만료된 경우 발생하는 에러
에러코드 : 401
에러메시지 : bad bad,accessToken,잘못된,accessToken,입니다, 잘못된 bad,accessToken,잘못된,accessToken,입니다 입니다

해당 상황에서 뒤끝의 토큰갱신을 하는 것은 무의미하며,
애플로부터 새로운 인증 토큰을 받아서 로그인을 시도해주어야 합니다.

안녕하세요.
먼저 답변주셔서 감사합니다.
다만 로그인시 이미 로컬(UserManager.UserData.D_Local_user.Apple_Token)에 apple 토큰을 저장되어진 상태에서 var bro = Backend.BMember.AuthorizeFederation(UserManager.UserData.D_Local_user.Apple_Token, FederationType.Apple, “siwa”); 을 사용해서 페러데이션로그인을 실행할 경우에도 401 에러가 발생하였습니다.

추가로 위 같은 경우 당일 로그인을 할 경우 에러가 발생되지 않고 잘 되지만 일정 시간이 지나면 해당오류가 발생되는 것으로 확인되었습니다.

혹시 해당 부분에는 어떻게 해결 해야 하나오?

애플 토큰에도 유효기간이 적용되어있기에 로컬에 저장된 토큰을 통한 로그인 방식은 권장하지 않습니다.

애플 로그인 시 애플 서버에서 새로운 토큰을 받아와 로그인을 하도록 하는 것을 권장하며
자동 로그인이 필요한 경우는 뒤끝의 토큰로그인 방식을 권장드립니다. (뒤끝 토큰로그인 실패 시에는 새로운 애플로그인이 진행되도록 구성)

var bro = Backend.BMember.LoginWithTheBackendToken();
에서 실패가 뜰 경우 로컬에 저장된 애플 토큰 로그인을 실행하고,
bro = Backend.BMember.AuthorizeFederation(UserManager.UserData.D_Local_user.Apple_Token, FederationType.Apple, “siwa”);
에서 만약 결과가 fasle로 나올 경우

var loginArgs = new AppleAuthLoginArgs(AppleAuth.Enums.LoginOptions.IncludeEmail | AppleAuth.Enums.LoginOptions.IncludeFullName);

        appleAuthManager.LoginWithAppleId(
            loginArgs,
            credential =>
            {
                var appleIdCredential = credential as IAppleIDCredential;
                if (appleIdCredential != null)
                {
                    var userId = appleIdCredential.User;
                    var email = appleIdCredential.Email;
                    var fullName = appleIdCredential.FullName;
                    var identityToken = Encoding.UTF8.GetString(appleIdCredential.IdentityToken);
                    var authorizationCode = Encoding.UTF8.GetString(appleIdCredential.AuthorizationCode);
                    // 토큰 저장
                    / SaveData.Json_Save(SaveData.DataKind.AppleToken, identityToken);

                    var bro = Backend.BMember.AuthorizeFederation(identityToken, FederationType.Apple, "siwa");
                    ac_backendsuccess?.Invoke(bro);
                }
            },
            error =>
            {
                // Debug.Log("Apple Signin Error");
            });

를 실행시키면 되는 걸까요?

측 애플 로그인 할 경우 코드가 아래와 같이 작성되는데 맞을 까요?
public void AppleLogin(Action ac_backendsuccess)
{
Debug.Log($“apple torken : {UserManager.UserData.D_Local_user.Apple_Token}”);

    // 애플 첫 로그인
    if (string.IsNullOrEmpty(UserManager.UserData.D_Local_user.Apple_Token))
    {
        AppleTokenLogin(ac_backendsuccess);
    }
    else
    {
        var bro = Backend.BMember.LoginWithTheBackendToken();

        // 뒤끝 토큰 로그인 성공
        if (bro.IsSuccess())
        {
            ac_backendsuccess?.Invoke(bro);
            return;
        }
        else
        {
            // 뒤끝 토큰 로그인 실패하는 경우 애플 토큰 로그인 실행
            bro = Backend.BMember.AuthorizeFederation(UserManager.UserData.D_Local_user.Apple_Token, FederationType.Apple, "siwa");

            // 애플 토큰로그인 성공
            if (bro.IsSuccess())
            {
                ac_backendsuccess?.Invoke(bro);
                return;
            }
            else
            {
                // 애플 토큰 로그인 실패하는 경우 애플 토큰 새로 생성 후 로그인 진행
                AppleTokenLogin(ac_backendsuccess);
                return;
            }
        }
    }
}

public void AppleTokenLogin(Action<BackendReturnObject> ac_backendsuccess)
{
    var loginArgs = new AppleAuthLoginArgs(AppleAuth.Enums.LoginOptions.IncludeEmail | AppleAuth.Enums.LoginOptions.IncludeFullName);

    appleAuthManager.LoginWithAppleId(
        loginArgs,
        credential =>
        {
            var appleIdCredential = credential as IAppleIDCredential;
            if (appleIdCredential != null)
            {
                var userId = appleIdCredential.User;
                var email = appleIdCredential.Email;
                var fullName = appleIdCredential.FullName;
                var identityToken = Encoding.UTF8.GetString(appleIdCredential.IdentityToken);
                var authorizationCode = Encoding.UTF8.GetString(appleIdCredential.AuthorizationCode);
                // 토큰 저장
                / SaveData.Json_Save(SaveData.DataKind.AppleToken, identityToken);

                var bro = Backend.BMember.AuthorizeFederation(identityToken, FederationType.Apple, "siwa");
                ac_backendsuccess?.Invoke(bro);
            }
        },
        error =>
        {
            // Debug.Log("Apple Signin Error");
        });
}

애플 토큰의 유효기간은 약 24시간(뒤끝 액세스토큰 유효기간과 동일)으로
뒤끝 토큰 로그인에 액세스토큰 에러가 발생해 실패한다면 로컬에 저장된 애플 토큰 또한 사용이 불가할 가능성이 큽니다.

로컬 저장 및 로컬 저장 토큰을 이용하지 마시고, 애플 로그인은 매번 새로 진행하는 방법으로 이용해 주세요.

말씀 주신 방법으로 코드를 작성하면

 public void AppleLogin(Action<BackendReturnObject> ac_backendsuccess)
    {
       // 애플 첫 로그인
        if (string.IsNullOrEmpty(UserManager.UserData.D_Local_user.Apple_Token))
        {
            AppleTokenLogin(ac_backendsuccess);
        }
        else
        {
            // 뒤끝 토큰 로그인 실행
            var bro = Backend.BMember.LoginWithTheBackendToken();

            Debug.Log($"뒤끝 토큰 로그인 성공 여부 : {bro}");

            // 뒤끝 토큰 로그인 성공
            if (bro.IsSuccess())
            {
                Debug.Log($"뒤끝 토큰 로그인 성공");
                ac_backendsuccess?.Invoke(bro);
                return;
            }
            else
            {
                Debug.Log($"새로운 애플 토큰 받아서 로그인 실행");
                // 애플 토큰 로그인 실패하는 경우 애플 토큰 새로 생성 후 로그인 진행
                AppleTokenLogin(ac_backendsuccess);
                return;
            }
        }
    }

위와 같이 작성 되는데 제가 이해한게 맞을까요?

아래 코드와 같이 적용하여 주시면 감사하겠습니다.

 public void AppleLogin(Action<BackendReturnObject> ac_backendsuccess)
    {
            // 뒤끝 토큰 로그인 실행
            var bro = Backend.BMember.LoginWithTheBackendToken();

            Debug.Log($"뒤끝 토큰 로그인 성공 여부 : {bro}");

            // 뒤끝 토큰 로그인 성공
            if (bro.IsSuccess())
            {
                Debug.Log($"뒤끝 토큰 로그인 성공");
                ac_backendsuccess?.Invoke(bro);
                return;
            }
            else
            {
                Debug.Log($"새로운 애플 토큰 받아서 로그인 실행");
                // 애플 토큰 로그인 실패하는 경우 애플 토큰 새로 생성 후 로그인 진행
                AppleTokenLogin(ac_backendsuccess);
                return;
            }
    }