3월 중으로 오픈마루 서비스의 API 인증방식이 OAuth1.0을/도 지원합니다

안녕하세요. 오픈마루 오픈플랫폼팀의 정상일(humbroll)입니다.

현재 웹 서비스들의 사용자 데이터 흐름이 서비스중심에서 사용자중심으로 움직이려는 모습을 보이고 있으며, 이는 매우 고무적인 현상이라고 생각합니다.

이를 위해서는 여러 서비스들에 흩어져 있는 사용자의 중요한 데이터들을 주고 받을 수 있는 그 무언가가 필요합니다. 현재 그 것을 위해 각 서비스 벤더들은 나름의 인증방식을 제공하고 있지만, 각 서비스마다 정의하는 바가 조금씩 다르고, 이에 따라 개발이 어려운 것이 현실입니다. '표준'의 부재가 가장 큰 문제이죠. 이를 해결하기 위하여 서비스와 서비스간의 사용자의 데이터 통신을 위한 인증의 표준화를 목적으로 OAuth(Open protocol Authorization)가 제기되었습니다.

차후 OAuth의 공식 한국어 페이지를 운영할 계획입니다만,

(현재로서 OAuth를 이해하기 위해서는 OAuth공식페이지김승현님의 OAuth에 대한 블로그 포스팅 을 참고하시면 되겠습니다.)

이에, 3월 중으로


오픈마루 서비스의 API 인증방식이 OAuth1.0을/도 지원할 예정입니다.

앞으로 OpenAPI를 제공하는 많은 서비스들이 이 OAuth를 적용하여 진정한 의미의 '사용자 중심의 웹'이 실혔되었으면 하는 바람입니다.

OAuth의 공식 홈페이지에 가보시면 각 언어들에 대한 라이브러리를 제공하며, 프로바이더와 컨수머 샘플코드도 어렵지 않게 찾아볼 수 있습니다. Ruby의 경우 프로바이더와 컨수머 구현을 위해서 oauth-plugin이나 oauth4r 이 제공되고 있지만 실제 세팅을 좀 더 해야하기때문에, oauth4r 에 있는 소스코드를 적용하여 '돌아가는' 샘플 코드를 공유합니다.


프로바이더 소스코드 : oauth_provider.tar

컨수머 소스코드 : oauth_consumer.tar


rails버전이 2.0 이하일 경우는

  • gem update --system

로 rails환경 전체를 업데이트 하거나 이것이 여유치 않으실 경우는

하셔서 rails를 임베드하시기 바랍니다.

필요한 라이브러리를 설치합니다. oauth, ruby-hmac

  • gem install oauth
  • gem install ruby-hmac

OAuth 샘플코드 구동을 하기 위한 설명을 간단히 하겠습니다.

각 프로젝트에서 config/database.yml 에서 디비 설정을 하신 후

  • rake db:create && rake db:migrate

를 합니다. 한번 실행시켜 봅시다.

컨수머는 5000포트를, 프로바이더는 5001포트를 사용합니다.(코드를 직접 고치셔서 다른 포트로 사용해도 무방합니다.)

컨수머 프로젝트에서는

  • ruby script/server -p 5000

프로바이터 프로젝트에서는

  • ruby script/server -p 5001

합니다.


우선 컨수머사이트(5000포트를 쓰는)를 프로바이더사이트(5001포트를 쓰는)에 등록해야 합니다.

http://localhost:5001/ => http://localhost:5001/get_contacts/new 에 있는 텍스트필드에 http://localhost:5000/use_get_contacts/oauth/callback 입력(컨수머의 config/use_get_contacts.oauth.yml에서 수정 가능) 한 후 Registaer버튼 클릭=> 화면의  Consumer Key값과 Consumer Secret값을 컨수머프로젝트의 config/use_get_contacts.oauth.yml의  consumer_key,consumer_secret값으로 삽입 =>컨수머사이트(5000포트) 재시작 => http://localhost:5000/users 에서   New user 링크를 통해 사용자 등록=>Establish OAuth with provider @ http://localhost:5001/get_contacts/authorize  링크를 통해서http://localhost:5000/use_get_contacts/new 로 이동하여 Create 클릭

이 때부터 컨수머와 프로바이더 사이의 인증이 시작됩니다.

5001번사이트에 로그인이 안되어 있을 경우는 로그인을 하라고 하고, 로그인을 하면 컨수머사이트에서 프로바이더사이트에 있는 사용자의 데이터 접근을 허가할 것인지에 대해서 물어봅니다.


Yes클릭!


다시 컨수머사이트로 돌아올 것입니다. 이로서 모든 인증 과정이 끝나고 프로바이더의 이른바 Protected Resource에 접근할 수 있는 Access Token과 Access Secret을 받옵니다.

다음과 같이 access token을 받아왔습니다. (access secret도 역시 받은 상태입니다)


Successful, access_key(13831917959380963787) received


이상입니다.


back-end에서 이루어지는 인증절차는 OAuth1.0 Spec에 잘 나와 있지만 다음 그림을 보시면 더 쉽게 이해하실 수 있습니다.



샘플에 문제가 있으면 댓글 남겨주시기 바랍니다.

많은 서비스들이 사이좋게 서로의 프로바이더, 컨수머가 되어 더 낳은 '웹'이 되길 희망합니다. ^^/

이 글은 스프링노트에서 작성되었습니다.

p.s : me2day에서도 곧 oauth를 지원해 주시리라 믿습니다! -0-/
Posted by
자신의 프로그램에 목숨을 걸 수 있습니까

Agile 이야기라는 블로그에 오픈마루의 대학성 인턴 면접시에 했던 질문에 대한 글이 있었다.
과거에도 한번 읽어본적은 있었으나, 그것에 대한 구체적인 나의 대답은 길게 생각해보지 않은
passive한 태도를 취했지만, 머지 않아 입사면접을 치뤄야 할 나에게는
이제 더이상 지나칠 수가 없다. 그래서 진지하고 담담하게 나의 생각을 떠올려보았다.
2시간을 생각한건 아니지만, 나름 신중한 생각을 해보았다.
문제
리스트는 유한개의 원소가 정해진 순서로 들어가 있는 자료구조입니다. 리스트에 포함된 원소는 하나의 숫자일수도 있지만 또다른 리스트일수도 있습니다. 이렇게 리스트 속에 리스트가 들어 있는 것을 중첩 리스트(nested list)라고 합시다.

리스트를 격자괄호로 둘러싸고, 각 원소는 쉼표로 구분해 표기하도록 하죠. 다음은 중첩 리스트의 예입니다.

[1, 2, [3, 4, [5]], 6, [[7,8]]]

예를 들어, 이런 리스트가 주어져 있을 때, 그걸 평평하게 만들어주는 프로그램 F를 작성해야 합니다.

즉, 결과가 [1, 2, 3, 4, 5, 6, 7, 8]로 나오면 됩니다.

그 런데 몇 가지 조건이 더 주어집니다. 자신은 예컨대 2시간 후에 수술을 받아야 합니다. 그때 사용하는 수술 기계에 이 프로그램이 중요한 역할을 하게 됩니다. 자신이 직접 작성한 프로그램으로 수술을 받는 것입니다. 프로그램이 오작동하면 자신은 죽을 수도 있습니다.

이 프로그램이 정상작동한다는 것을 최대한 보장하기 위해 프로그래밍 전, 프로그래밍 중, 프로그래밍 후 각각의 시기에 어떤 일을 하시겠습니까? (프로그램 F를 작성하는 것이 이 오디션의 목표는 아닙니다 -- 따라서 오디션 중에 그 프로그램을 작성할 필요까지는 없습니다)

프로그래밍 전
    이 문제를 해결하기 위한 최적의 알고리즘이 무엇인가를 고민,결정
    직관적으로는 recursive call을 이용하는 것이 좋을 것처럼 보였다.
    하지만 입력의 데이터가 수만 혹은 수억이 될 수 있다는 가정이 있기
    때문에 고민해봐야할 문제이다. 만약 그 recursive의 깊이가 수억이
    된다면? hw 문제와 sw의 알고리즘상의 tradeoff가 생기게 되겠다.
    물론 hw상으로는 현존 최고의 퍼포먼스와 안전성을 제공한다는 가정
    을 두고, 발상의 전환으로 리스트에 있는 숫자리스트들은 int가 아닌
    char로 보고 charat을 통해 단순히 [ , ]를 제거하는 방법이 있겠다.
    여기까지, recursive가 아닌 단순한 char처리로서 구현하겠다고
    로직을 결정하였다.   
프로그래밍 중
    다음으로 고민해야 할 사항은? 테스팅, 예외처리.
    hw가 허용하는 범위 내에서 가장 큰 test data의 자동 생성 프로그램을
    만든다. testcode 작성후 테스트를 반복적으로 돌리며, 동시에
    어떤 예외가 발생할 것인가를 끊임없이 연구한다. 이 과정에서
    web2.0사이트의 집단지성을 적극 활용한다(ex>me2day)
프로그래밍 후
    이 시점이 1시간 50분정도가 지난 후라면...
    실질적으로 더이상 이성적인 사고는 불가능한 시기.
   
지금도 계속 찾아헤매고 있는 폭풍의 눈, "여유"라는 키워드,
    이것을 찾아보고 싶다. 평소에 많이 보지 않던 하늘을
    보고 많이 마시지 않던 쓴 커피를 마셔본다.

"목숨"에 대한 것은 극단적이리만큼 논리적인 과정을 거쳐야 하는 프로그래밍에 감성이란 바이러스를 무자비하게 투여한다.
아무튼, "자신의 프로그램에 목숨을 걸 수 있겠는가?" 란 질문에 대한
답은 여느 프로그래머와 마찬가지로 "아니요"라고 하겠다.
약 10분에 걸쳐 생각한 것을 글로 옮겼지만 실제로 면접때 저런 질문을 받는다면
상당히 당황했겠다. 지극히 객관적인 지성을 통해 아웃풋을 생산해 내야 하는
프로그래머의 관점에서 벗어나 감성적인 답변을 했을지도 모르겠다. 실제로도 그럴 것이다
생각할 수록 복잡한 문제가 되겠다. scope를 명시해주지 않은 질문인 이상 명확한 scope를 가진
답변을 기대하기 힘들겠지만, 나라면 그 것을 정하고 답변을 하겠다.
사상가가 아닌 프로그래머를 뽑는 것이기 때문.
Posted by