package com.cattong.commons.oauth; import java.io.IOException; import java.io.Serializable; import java.net.URISyntaxException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import com.cattong.commons.Logger; import com.cattong.commons.http.HttpRequestWrapper; import com.cattong.commons.http.auth.Authorization; import com.cattong.commons.oauth.signature.OAuthSignatureMethod; import com.cattong.commons.util.UrlUtil; public class OAuthAccessor implements Cloneable, Serializable { private static final long serialVersionUID = 5590788443138352999L; public final OAuthConsumer consumer; private Authorization auth; public OAuthAccessor(OAuthConsumer consumer) { this.consumer = consumer; } public Authorization getAuthorization() { return auth; } public void setAuthorization(Authorization auth) { this.auth = auth; } public void sign(HttpRequestWrapper requestMessage) throws OAuthException, IOException, URISyntaxException { /******************************************/ OAuthUtil.addRequiredParameters(this, requestMessage); // 检查并补全OAuth认证的必需参数 OAuthSignatureMethod signatureMethod = OAuthSignatureMethod.newMethod(this); signatureMethod.sign(requestMessage); if (Logger.level <= Logger.DEBUG) { signatureMethod.validate(requestMessage); } /******************************************/ Map<String, String> oauthParameters = new HashMap<String, String>(); Iterator<Map.Entry<String, Object>> iterator = requestMessage.getParameters().entrySet().iterator(); while (iterator.hasNext()) { // 遍历参数,提取出OAuth参数 Map.Entry<String, Object> entry = iterator.next(); if (entry.getKey().startsWith("oauth_")) { oauthParameters.put(entry.getKey(), String.valueOf(entry.getValue())); iterator.remove(); } } String url = requestMessage.getUrl(); OAuthParameterStyle style = this.consumer.getParameterStyle(); if (style == null){ style = OAuthParameterStyle.AUTHORIZATION_HEADER; } switch (style) { case QUERY_STRING: url = UrlUtil.appendQueryParameters(url, oauthParameters); requestMessage.setUrl(url); break; case AUTHORIZATION_HEADER: //直落,与默认相同,即将签名信息添加至头部 default: String oauthHeader = OAuthUtil.getAuthorizationHeader(null, oauthParameters); Logger.debug("OAuth Authorization Header : {}", oauthHeader); requestMessage.addHeader("Authorization", oauthHeader); break; } } @Override public OAuthAccessor clone() { try { return (OAuthAccessor) super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } }