티스토리 뷰

반응형

에저 삽질 3탄!! 이번엔 푸쉬 노티피케이션을 구현하다가, 시작된 인증 서비스 구현 편이다. 지난번 포스트까지만 해도 괜찬았는데..후후후

 

 

1. 문제의 발생

기본 인증 방법 중에 Microsoft Account(Live ID)를 이용한 인증을 구현하고 테스트 까지 완료.

음 이정도면 할만하네..라고 생각하며 다음 과정까지 작업

 

여기서 내 앱은 원드라이브를 이용하기 때문에 기본적으로 Microsoft Account 인증을 한번 받음, 그리고, 매번 앱이 시작될 때마다 인증과정을 거친 후에 서비스를 인증하도록 변경함

 

서비스 인증을 할 때

 

 

_user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, true);

 

 

이렇게 입력해서, SSO 사용을 하도록 변경하고, Windows 8.1 store app을 실행 했을 때는 바로 인증이 완료됨, 그런데 Windows Phone 8.1 rt에서 문제 발생

 

 

이런 로그인 화면이 앱을 시작 할 때 마다 떠서 로그인을 해주어야 한다는 것!!

 

이런걸 어떻게 쓰란 말이냐.. 나 같아도 매번 로그인 해야하는 앱은 쓰기 싫은데..쿨럭..으흠

 

 

2. 사용자 정의 인증 구현하기

 

우선 이런 내용을 종인님에게 물어보니,

 

"아 모바일 서비스 인증 때문에 그런거에요? 전 저런것 때문에 그냥 자체인증 써서 잘 모르는 듯요 ㅋ"

 

라는 친절한 답변을 날려주었다. 그래서 이때부터 사용자 정의 인증 구현하기 시작

 

 

일단 매우 친절하게 되어 있는 서버단 서비스 구현에 대한 포스트이다.

 

Get started with custom authentication

http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-get-started-custom-authentication/

 

내용 중

 

config.SetIsHosted(true);

 

를 입력해서 로컬 호스트에서 테스트 할 때 사용하라고 하는 옵션은 추가하지 않아도, 로컬에서 테스트 할 수 있다.

이 글은 꼭 읽어야한다. 그런데, 서버단에서 하는 내용만 있고, 클라이언트 단에서 어떻게 하라는 이야기는 없다는 것이 함정이다;;

 

 

클라이언트 구현에 대해서 검색을 해봤는데 좀 지난 내용만 존재하고 최신 내용은 찾지를 못했다. 검색 기술이 떨어지는 가보다;;

 

그럼 어떻게 구성해야하는지 하나하나 살펴 보자

 

 

3. API Settings -> Redirect URLs : Clear

 

이전 Microsoft Account 인증 때문에 입력해 놓았단, Redirect URLs를 지워준다. 설정하지 않은 사람은 여기 들어올 필요도 없다. 기본이 빈값이니;;

 

 

 

4. Client AuthenticateAsync

 

** HttpMethod : System.Net.Http.HttpMethod

 

        public async Task AuthenticateAsync()
        {
            int retryCount = 0;

            while (_user == null)
            {
                string message;
                try
                {
                    var login = new JObject
                    {
                        {"username", "*login user name input*"},
                        {"password", "*login user password input*"}
                    };

                    JToken result =
                        await App.MobileService.InvokeApiAsync("CustomLogin", login, HttpMethod.Post, null);

                    _user = new MobileServiceUser(result["user"]["userId"].ToString())
                    {
                        MobileServiceAuthenticationToken = result["authenticationToken"].ToString()
                    };

                    App.MobileService.CurrentUser = _user;
                    message = string.Format("You are now signed in - {0}", _user.UserId);
                }
                catch (InvalidOperationException ioe)
                {
                    switch (ioe.Message)
                    {
                        case "Invalid username or password":
                            message = ioe.Message;
                            break;
                        default:
                            message = "You must log in. Login Required";
                            break;
                    }
                    retryCount++;
                }
                catch (Exception ex)
                {
                    message = ex.Message;
                }

                Debug.WriteLine(message);

 

                if (retryCount > 1)
                {
                    await EtcHelper.Instance.MsgBoxAsync("Service login fail. exit app");
                    Application.Current.Exit();
                }
            }
        }

 

 

5. Client CustomRegistration

 

public async Task RegistrationAsync()

{

                    //사용자 등록
                    var newUser = new Dictionary<string, string>
                    {
                        {"username", "*registration user name input*"},
                        {"password", "*registration user password input*"},
                    };


                    string json = JsonConvert.SerializeObject(newUser);
                    var content = new StringContent(json);
                    content.Headers.ContentLength = json.Length;
                    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                    try
                    {
                        HttpResponseMessage result = await App.MobileService.InvokeApiAsync("CustomRegistration", content, HttpMethod.Post, null, null);
                        if (!result.IsSuccessStatusCode)
                        {
                            //error
                        }
                    }
                    catch (InvalidOperationException ex)
                    {
                        Debug.WriteLine(ex.Message);
                    }

}

 

 

짜잔!!!!! 기본 골격은 이렇다. 물론 내 서비스에서 사용하는 사용자 정보는 좀 복잡한 내용을 가지고 있어서, 기본 셈플에서 제공하는 모델 형태를 사용해서, 사용자 등록을 하는 코드로 살짝 변경했다.

 

사용자 인증 후에 서비스 호출까지 정상적으로 잘 동작한다.. 문제는 이제 다시 푸쉬 노티피케이션을 해야한다는 것이다;;

푸쉬에서 삽질하면 다시 포스팅 하도록 하겠다.

 

반응형
댓글