package net.dev123.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 net.dev123.commons.Constants; import net.dev123.commons.http.HttpRequestMessage; import net.dev123.commons.oauth.signature.OAuthSignatureMethod; import net.dev123.commons.util.UrlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class OAuthAccessor implements Cloneable, Serializable { private static final long serialVersionUID = 5590788443138352999L; private static final Logger logger = LoggerFactory.getLogger(OAuthAccessor.class.getSimpleName()); public final OAuthConsumer consumer; private OAuthToken oauthToken; public OAuthAccessor(OAuthConsumer consumer) { this.consumer = consumer; } public OAuthToken getOAuthToken() { return oauthToken; } public void setOAuthToken(OAuthToken token) { this.oauthToken = token; } public void sign(HttpRequestMessage request) throws OAuthException, IOException, URISyntaxException { /******************************************/ OAuthUtil.addRequiredParameters(this, request); // 检查并补全OAuth认证的必需参数 OAuthSignatureMethod signatureMethod = OAuthSignatureMethod.newMethod(this); signatureMethod.sign(request); if (Constants.DEBUG){ signatureMethod.validate(request); } /******************************************/ Map<String, String> oauthParameters = new HashMap<String, String>(); Iterator<Map.Entry<String, Object>> iterator = request.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 = request.getUrl(); OAuthParameterStyle style = this.consumer.getParameterStyle(); if (style == null){ style = OAuthParameterStyle.AUTHORIZATION_HEADER; } switch (style) { case QUERY_STRING: url = UrlUtil.appendQueryParameters(url, oauthParameters); request.setUrl(url); break; case AUTHORIZATION_HEADER: //直落,与默认相同,即将签名信息添加至头部 default: String oauthHeader = OAuthUtil.getAuthorizationHeader(null, oauthParameters); if (Constants.DEBUG) { logger.debug("OAuth Authorization Header : {}", oauthHeader); } request.addHeader("Authorization", oauthHeader); break; } } @Override public OAuthAccessor clone() { try { return (OAuthAccessor) super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } } }