package com.monkeyk.os.oauth;
import com.monkeyk.os.domain.oauth.AccessToken;
import com.monkeyk.os.domain.oauth.ClientDetails;
import com.monkeyk.os.domain.shared.BeanProvider;
import com.monkeyk.os.service.OauthService;
import org.apache.commons.lang.StringUtils;
import org.apache.oltu.oauth2.as.response.OAuthASResponse;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
import org.apache.oltu.oauth2.common.message.OAuthResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletResponse;
/**
* 2015/7/3
* <p/>
* 对OAUTH各种流程的操作进行抽象,
* 将没用的行为(方法) 放于此
*
* @author Shengzhao Li
*/
public abstract class OAuthHandler {
private static final Logger LOG = LoggerFactory.getLogger(OAuthHandler.class);
protected transient OauthService oauthService = BeanProvider.getBean(OauthService.class);
private ClientDetails clientDetails;
protected ClientDetails clientDetails() {
if (clientDetails == null) {
final String clientId = clientId();
clientDetails = oauthService.loadClientDetails(clientId);
LOG.debug("Load ClientDetails: {} by clientId: {}", clientDetails, clientId);
}
return clientDetails;
}
/**
* Create AccessToken response
*
* @param accessToken AccessToken
* @param queryOrJson True is QueryMessage, false is JSON message
* @return OAuthResponse
* @throws org.apache.oltu.oauth2.common.exception.OAuthSystemException
*/
protected OAuthResponse createTokenResponse(AccessToken accessToken, boolean queryOrJson) throws OAuthSystemException {
final ClientDetails tempClientDetails = clientDetails();
final OAuthASResponse.OAuthTokenResponseBuilder builder = OAuthASResponse
.tokenResponse(HttpServletResponse.SC_OK)
.location(tempClientDetails.getRedirectUri())
.setAccessToken(accessToken.tokenId())
.setExpiresIn(String.valueOf(accessToken.currentTokenExpiredSeconds()))
.setTokenType(accessToken.tokenType());
final String refreshToken = accessToken.refreshToken();
if (StringUtils.isNotEmpty(refreshToken)) {
builder.setRefreshToken(refreshToken);
}
return queryOrJson ? builder.buildQueryMessage() : builder.buildJSONMessage();
}
protected abstract String clientId();
}