- notice 스킨변경~
http://blog.outsider.ne.kr/170
만약 myid.net에 한글 닉네임이 있는 경우에는 가져올 때 URL을 통해서 가져오는데요.
URL이 UTF-8로 되어있고, encodeURI해서 오는데, 이것을 제대로 decode를 못해줘서 인증에 실패를 하더군요.
가져올 때
ParameterList response = new ParameterList(httpReq.getParameterMap());이렇게 해서 가져오면 한글인 경우 문제가 발생합니다.
Verification failed for: null reason: null 이런 에러를 발생하는데, 디버깅할 때 parameterList에 있는 한글로 받아야하는 닉네임이 있다면 깨져서 나올겁니다.
그래서 제가 임의로 url을 URIDecoder로 decode를 해서 nickname을 한글로 바꿨더니 인증이 되더군요.
다른 방법을 찾다가 MyID담당자님께 물어봤더니 아래와 같은 방법을 가르쳐주셨습니다 ^^
아래와 같이 파라메터를 얻어오면 됩니다.
ParameterList paramList = ParameterList.createFromQueryString(request.getQueryString());이렇게 하니까 되더군요.
알려주신 MyID의 수호이님 감사합니다 ^^
No Comment
src폴더에 openidtest.controller라는 package를 만듭시다.
그리고, OpenIDController클래스를 생성합니다.
OpendIDController.java
package openidtest.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openid4java.OpenIDException;
import org.openid4java.consumer.ConsumerManager;
import org.openid4java.consumer.VerificationResult;
import org.openid4java.discovery.DiscoveryInformation;
import org.openid4java.discovery.Identifier;
import org.openid4java.message.AuthRequest;
import org.openid4java.message.ParameterList;
import org.openid4java.server.RealmVerifier;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
public class OpenIDController
{
private ConsumerManager manager;
@RequestMapping(value="/index.do", method=RequestMethod.GET)
public String indexGetcontroller(ModelMap model)
{
return "index";
}
@SuppressWarnings("unchecked")
@RequestMapping(value="/index.do", method=RequestMethod.POST)
public String indexPostController(String openId, ModelMap model,
HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
try
{
manager = new ConsumerManager();
String returnToUrl = "http://localhost:8080/OpenIdTest/verify.do";
List discoveries = manager.discover(openId);
if (discoveries.size() == 0)
{
model.addAttribute("noopenid", openId);
return "index";
}
DiscoveryInformation discovered = manager.associate(discoveries);
request.getSession().setAttribute("openid-disc", discovered);
RealmVerifier rv = new RealmVerifier();
rv.setEnforceRpId(false);
manager.setRealmVerifier(rv);
AuthRequest authReq = manager.authenticate(discovered, returnToUrl);
if (!discovered.isVersion2())
{
// Option 1: GET HTTP-redirect to the OpenID Provider endpoint
// The only method supported in OpenID 1.x
// redirect-URL usually limited ~2048 bytes
response.sendRedirect(authReq.getDestinationUrl(true));
return null;
} else {
// Option 2: HTML FORM Redirection (Allows payloads >2048 bytes)
// RequestDispatcher dispatcher =
// getServletContext().getRequestDispatcher("formredirection.jsp");
// httpReq.setAttribute("prameterMap",
// response.getParameterMap());
// httpReq.setAttribute("destinationUrl",
// response.getDestinationUrl(false));
// dispatcher.forward(request, response);
}
}
catch (OpenIDException e)
{
}
return null;
//model.addAttribute("openId", openId);
//return "index";
}
@RequestMapping(value="/verify.do", method=RequestMethod.GET)
public String verifyController(String openId, ModelMap model,
HttpServletRequest request,
HttpServletResponse response) throws ServletException
{
try
{
ParameterList paramList = new ParameterList(request.getParameterMap());
DiscoveryInformation discovered = (DiscoveryInformation) request
.getSession().getAttribute("openid-disc");
// extract the receiving URL from the HTTP request
StringBuffer receivingURL = request.getRequestURL();
String queryString = request.getQueryString();
if (queryString != null && queryString.length() > 0)
receivingURL.append("?").append(request.getQueryString());
// verify the response; ConsumerManager needs to be the same
// (static) instance used to place the authentication request
VerificationResult verification = manager.verify(receivingURL.toString(),
paramList, discovered);
// examine the verification result and extract the verified
// identifier
Identifier verified = verification.getVerifiedId();
if (verified != null)
{
request.getSession()
.setAttribute("openid", verified.getIdentifier());
}
}
catch (OpenIDException e)
{
}
return "redirect:index.do";
}
@RequestMapping(value="/logout.do", method=RequestMethod.POST)
public String logoutController(String openId, ModelMap model,
HttpServletRequest request,
HttpServletResponse response) throws ServletException
{
request.getSession().removeAttribute("openid");
return "redirect:index.do";
}
}
WEB-IINF/jsp/index.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>오픈아이디 테스트</title>
</head>
<body>
<c:choose>
<c:when test="${sessionScope.openid != null}">
${sessionScope.openid}님 환영합니다.
<form action="logout.do" method="POST">
<input type="submit" value="로그아웃"/>
</form>
</c:when>
<c:otherwise>
<form action="index.do" method="POST">
<input type="text" id="openId" name="openId"/>
<input type="submit" value="로그인"/>
</form>
</c:otherwise>
</c:choose>
<c:if test="${noopenid != null}">
${noopenid}는 없는 아이디입니다.
</c:if>
</body>
</html>
view페이지에서 아이디를 치고, post요청을 하게 되면 indexPostController메소드가 호출이 됩니다. 여기서는 인증할 수 있는 URL을 redirect하게 됩니다. 그러면 OpenID를 제공하는 Provider에서 인증을 받고, returnURL로 이동을 해서 인증이 되었는지 확인 후 인증이 되면
Identifier verified = verification.getVerifiedId();
에서 Identifier 객체를 받을 수 있는데요. 이곳에서 오픈아이디를 구할 수 있습니다.
아 졸려-_-
(거의 똑같네-_-)
근데 이상하게 톰캣로그에서는 에러가 막 떨어지는데, 되네요-_-; 좀 더 확인해봐야겠네요 ㅠ
xrath님의 J2EE 환경에서 OpenID 지원 사이트 구축해보기
outsider님의 http://blog.outsider.ne.kr/164 http://blog.outsider.ne.kr/166
테스트환경은 TOMCAT6.0.18 + JDK 6u10 + Spring 2.5.6 입니다.
우선 http://code.sxip.com/ 이곳에서 라이브러리를 받습니다.
이클립스를 열어서 프로젝트를 하나 만듭시다.
Dynamic Web Project로 해서 만듭시다.
OpenIdTest라는 프로젝트로 만듭시다.
WEB-INF/lib에 라이브러리를 복사해야합니다. java-openid-sxip-0.9.4.jar이거 하나만 있으면 되는 줄 알았는데, lib폴더에 있는거 거의 다 필요하더군요-_-;
java-openid-sxip-0.9.4.jar
lib/commons-codec-1.3.jar
lib/commons-httpclient-3.0.1.jar
lib/commons-logging-1.03.jar
lib/htmlparser.jar
lib/openxri-client.jar
lib/openxri-syntax.jar
lib/endorsed/dom3-xercesImpl.jar
lib/endorsed/dom3-xml-apis.jar
lib/endorsed/xalan-2.6.0.jar
lib/xri/xmlsec-1.1.jar
그 외, 스프링과 jstl을 사용하기 위한 라이브러리를 복사합니다.
spring.jar
spring-webmvc.jar
standard.jar
jstl.jar
스프링을 위한 셋팅을 해봅시다.
web.xml파일을 수정합니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>OpenIdTest</display-name>
<!-- SPRING FRAMEWORK DISPATCHER SERVLET CONFIGURATIONS -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
</web-app>
WebContent밑에 redirect.jsp파일을 생성합니다.
redirect.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OPENID TEST</title>
</head>
<body>
<% response.sendRedirect("index.do"); %>
</body>
</html>
WEB-INF 밑에 spring-servlet.xml을 생성합니다.
spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- ANNOTATION CONTEXT DEFINITION -->
<context:annotation-config />
<context:component-scan base-package="openidtest" />
<!-- VIEW RESOLVER CONFIGURATIONS -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
아... 이제 셋팅이 완료되었어요.
다음 글에 계속.....-_-;

