사용자 정의 중개자

OAuth 2.0 중개자는 OAuth 2.0 메시지 처리 중에 사용자 정의된 사후 처리를 수행하기 위한 콜백으로 사용됩니다.

OAuth 2.0 중개자 작성

중개자를 작성하려면, com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator라는 인터페이스를 구현해야 합니다. 다음 메소드 중 하나 이상을 구현하여 사용자 정의 사후 처리를 수행할 수 있습니다.
void init(OAuthComponentConfiguration config)
이 메소드는 이 오브젝트의 인스턴스를 작성할 때 팩토리를 통해 호출됩니다.
void mediateAuthorize(AttributeList attributeList)
이 메소드는 processAuthorization 메소드의 컴포넌트 이용자가 모든 사용자 정의 사후 처리를 수행할 수 있도록 기본 메시지 유효성 검증 및 처리 후 코어 컴포넌트를 통해 호출됩니다.
void mediateAuthorizeException(AttributeList attributeList, OAuthException exception)
이 메소드는 processAuthorization 메소드의 컴포넌트 이용자가 모든 사용자 정의 사후 처리를 수행할 수 있도록 프로토콜 예외 발생 시 코어 컴포넌트를 통해 호출됩니다.
void mediateResource(AttributeList attributeList)
이 메소드는 processResourceRequest 메소드의 컴포넌트 이용자가 모든 사후 처리를 수행할 수 있도록 기본 메시지 유효성 검증 및 처리 후 코어 컴포넌트를 통해 호출됩니다.
void mediateResourceException(AttributeList attributeList, OAuthException exception)
이 메소드는 processResourceRequest 메소드의 컴포넌트 이용자가 모든 사후 처리를 수행할 수 있도록 프로토콜 예외 발생 시 코어 컴포넌트를 통해 호출됩니다.
void mediateToken(AttributeList attributeList)
이 메소드는 processTokenRequest 메소드의 컴포넌트 이용자가 모든 사용자 정의 사후 처리를 수행할 수 있도록 기본 메시지 유효성 검증 및 처리 후 코어 컴포넌트를 통해 호출됩니다.
void mediateTokenException(AttributeList attributeList, OAuthException exception)
이 메소드는 processTokenRequest 메소드의 컴포넌트 이용자가 모든 사용자 정의 사후 처리를 수행할 수 있도록 프로토콜 예외 발생 시 코어 컴포넌트를 통해 호출됩니다.

OAuth 제공자의 OAuth 2.0 중개자 사용

특정 OAuth 2.0 서비스 제공자에 사용자 정의 중개자를 추가하려면, server.xml 파일에서 제공자 정의를 업데이트해야 합니다. oauthProvider 요소의 mediatorClassname 속성을 추가하고 중개자의 클래스 이름을 지정하십시오. 또한 oauthProvider 요소의 mediatorClassname 하위 요소를 사용하여 중개자의 클래스 이름을 여러 개 지정할 수도 있습니다. 중개자를 여러 개 지정한 경우에는 이러한 중개자가 지정된 순서대로 시작됩니다. 또한 중개자 클래스를 포함하는 library 요소를 정의하고 libraryRef 속성을 사용하여 라이브러리를 참조해야 합니다.

다음 예제에서는 server.xml 파일에서 제공자 정의의 샘플 사용자 정의 중개자 항목을 보여 줍니다.
<oauthProvider id="OAuthConfigSample" libraryRef="myLib"
  mediatorClassname="com.ibm.ws.security.oauth20.mediator.ResourceOwnerValidationMediator" ...>
  ...
</oauthProvider>

<library id="myLib">
  <fileset dir="C:\mydir" includes="myLib.jar" />
</library>
다음 코드 샘플에서는 자원 소유자 비밀번호 신임 정보 플로우의 WebSphere® Application Server 사용자 레지스트리를 사용하여 신임 정보 유효성 검증을 구현합니다.
package com.ibm.ws.security.oauth20.mediator;

import com.ibm.oauth.core.api.attributes.AttributeList;
import com.ibm.oauth.core.api.config.OAuthComponentConfiguration;
import com.ibm.oauth.core.api.error.OAuthException;
import com.ibm.oauth.core.api.error.oauth20.OAuth20MediatorException;
import com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator;
import com.ibm.oauth.core.internal.oauth20.OAuth20Constants;
import com.ibm.websphere.security.CustomRegistryException;
import com.ibm.websphere.security.PasswordCheckFailedException;
import com.ibm.websphere.security.UserRegistry;

import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.naming.InitialContext;
import javax.naming.NamingException;

public class ResourceOwnerValidationMedidator implements OAuth20Mediator {
  private static final String CLASS = ResourceOwnerValidationMedidator.class.getName();
  private static final Logger LOG = Logger.getLogger(CLASS);
  private UserRegistry reg = null;

  public void init(OAuthComponentConfiguration config) {
    try {
      InitialContext ctx = new InitialContext();
      reg = (UserRegistry) ctx.lookup("UserRegistry");
    } catch(NamingException ne) {
      LOG.log(Level.SEVERE, "Cannot lookup UserRegistry", ne);
    }
  }

  public void mediateAuthorize(AttributeList attributeList)
    throws OAuth20MediatorException {
    // nothing to do here
  }

  public void mediateAuthorizeException(AttributeList attributeList,
                                        OAuthException exception)
    throws OAuth20MediatorException {
    // nothing to do here
  }

  public void mediateResource(AttributeList attributeList)
    throws OAuth20MediatorException {
    // nothing to do here
  }

  public void mediateResourceException(AttributeList attributeList,
                                       OAuthException exception)
    throws OAuth20MediatorException {
    // nothing to do here
  }

  public void mediateToken(AttributeList attributeList)
    throws OAuth20MediatorException {
    final String methodName = "mediateToken";
    LOG.entering(CLASS, methodName, attributeList);
    if("password".equals(attributeList.getAttributeValueByName("grant_type"))) {
      String username = attributeList.getAttributeValueByName("username");
      String password = attributeList.getAttributeValueByName("password");
      try {
        reg.checkPassword(username, password);
      } catch (PasswordCheckFailedException e) {
        throw new OAuth20MediatorException("User doesn't exist or the
                                           password doesn't match.", e);
      		} catch (CustomRegistryException e) {
        throw new OAuth20MediatorException("Cannot validate resource owner.", e);
      		} catch (RemoteException e) {
        throw new OAuth20MediatorException("Cannot validate resource owner.", e);
      } 
    }
    LOG.exiting(CLASS, methodName);
  }

  public void mediateTokenException(AttributeList attributeList,
                                    OAuthException exception)
    throws OAuth20MediatorException {
    final String methodName = "mediateTokenException";
    LOG.entering(CLASS, methodName, new Object[] {attributeList, exception});
    if("password".equals(attributeList.getAttributeValueByName("grant_type"))) {
      // clear sensitive data
      attributeList.setAttribute("access_token",
                                 OAuth20Constants.ATTRTYPE_RESPONSE_ATTRIBUTE,
                                 new String[0]);
      attributeList.setAttribute("refresh_token",
                                 OAuth20Constants.ATTRTYPE_RESPONSE_ATTRIBUTE,
                                 new String[0]);
    }
    LOG.exiting(CLASS, methodName);
  }

}

주제의 유형을 표시하는 아이콘 개념 주제



시간소인 아이콘 마지막 업데이트 날짜: Monday, 5 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=cwlp_oauth_custommediator
파일 이름: cwlp_oauth_custommediator.html