Primary links

Java로 만드는 OpenID Consumer

OpenID4Java 로 Tomcat 과 같은 J2EE Container 에서 OpenID Consumer 사이트 만드는 방법을 정리해봤습니다.
 
J2EE 환경에서 OpenID 지원 사이트 구축해보기
 
OpenID 표준 문서나 보안 이슈들을 고려하기보다는, 공부할 시간은 없고 간단하게 만들어보는 것으로 시작하기를 선호하시는 분들을 위해 작성했습니다.
 
Java와 Tomcat 그리고 OpenID4Java 를 설치하고 간단히 테스트해본 후, 로그인 과정을 만들어 보게 하는 것이 주 목표이며, 많은 자바 웹개발자들이 OpenID 적용 사이트를 만들 수 있도록 친숙하고 쉽게 구성했습니다.
 
초안이고 OpenID를 공부하면서 작성한 문서라 OpenID의 정신(?)을 해치거나 위험한 부분이 있을 수도 있습니다. 피드백을 주세요. 차근차근 수정해나갈 생각입니다.
 

Simple Registration으로 사용자의 이메일주소, 닉네임 가져오기

아직 Draft 상태인 Attribute Exchange를 사용하려는 헛된 노력을 하다가 kayflow 님의 조언을 받아 Simple Registration ext-1.0으로 테스트해보니 잘 동작합니다!
 
myid.net 의 경우 simple registration 의 정보들을 거의 다 지원하는데, dob를 사용할 경우 약간의 문제가 생기지만, 흔히 사용하는 대부분의 attribute 들은 모두 잘 동작합니다.
 
myopenid.com 의 경우 sreg 의 모든 필드를 지원합니다. 대신 모든 필드를 다 보여주고 선택하게 되어있어 사용자 입장에서 조금 부담스러울 수 있을 것 같다는 생각이 들었습니다.
 
idtail.com 의 경우 sreg 를 담아 요청했을 때 따로 추가 정보를 요청한다는 메시지는 나오지 않지만, E-mail 주소는 잘 가져와졌습니다.
 
무엇보다 제가 사용하는 OpenID Provider 3군데 모두가 잘 동작한다는 것이 가장 즐거웠습니다 :-)
사용할 때는 org.openid4java.message.sreg 패키지를 import 하여 SRegRequest 메시지를 생성하여 AuthRequest 에 Extension을 담으면 됩니다.
 
SRegRequest sreq = SRegRequest.createFetchRequest();
sreq.addAttribute("email", true);
sreq.addAttribute("nickname", true);
AuthRequest auth = consumer.authenticate(.., .., ..);
auth.addExtension(sreq);
...
 
이렇게 요청을 보내면 OpenID Provider 에서 해당 등록정보를 Consumer가 원한다는 사실이 알려지고  승인 여부에 따라 Response 메시지에 등록정보들이 함께 실려나가게 됩니다. addAttribute 할 때 2번째 인자인 boolean 값은 required 인지 optional 인지를 지정하게 됩니다. 만약 false 일 경우 사용자가 해당 정보를 공개하지 않겠다고 해도 인증과정은 성공하게 됩니다.
 
이제 Verify servlet 에서 SRegResponse 메시지를 받아 처리하기만 하면 됩니다.
VerificationResult 확인이 다 끝난 뒤 AuthSuccess 메시지를 생성하여 hasExtension으로 OPENID_NS_SREG 가 담겨왔는지 확인한 후, getExtension으로 SRegResponse를 얻어낸 뒤 getAttributeValue로 email, nickname, fullname, postcode 등을 얻어오면 됩니다.
 
 
 

Attribute Exchange 문제

OpenID4Java 0.9.2는 Attribute Exchange 1.0 Draft 4를 지원합니다.
그런데 이를 확인해볼 수 있는 OpenID Provider가 없는 듯 싶네요. 아직 OpenID4Java로는 ax 테스트가 통과하질 않습니다. myid.net, myopenid.com, idtail.com 등이 모두 안되네요..
Provider로 전송되는 URL에는 분명 fetch_request 가 있는데, 인증시에 정보를 가져오는 화면이 뜨질 않네요. OpenID4Java가 너무 진화한(?) 것인지, OpenID4Java 만 타 사이트들과 연동되지 않는 것인지 모르겠습니다.
 
Redirect 되는 URL을 보면 openid.ns.ax 대신 openid.ns.ext1 이 들어가고
값은 http://openid.net/srv/ax/1.0-draft4 로 채워집니다. 도움을 받을 수 있을까요?
 

아직 draft 스펙입니다.

아직, draft 상태라, 정식 지원하는 프로바이더가 없는 것 같습니다.

감사합니다. Simple

감사합니다. Simple Registration을 사용하도록 문서를 갱신해봐야겠네요.