에저 삽질 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);
                    }

}

 

 

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

 

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

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

 

블로그 이미지

MVP kaki104

* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

티스토리 툴바