カスタム・メディエーター
OAuth 2.0 メディエーターは、カスタマイズした後処理を実行するために OAuth 2.0 メッセージ処理中にコールバックとして使用されます。
OAuth 2.0 メディエーターの作成
メディエーターを作成するには、com.ibm.oauth.core.api.oauth20.mediator.OAuth20Mediator というインターフェースを実装する必要があります。
以下の 1 つ以上のメソッドを実装して、カスタム後処理を実行できます。
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);
}
}