package weiboclient4j.oauth2;
import org.scribe.exceptions.OAuthException;
import org.scribe.model.OAuthConfig;
import org.scribe.model.OAuthConstants;
import org.scribe.model.OAuthRequest;
import org.scribe.model.Response;
import org.scribe.model.Token;
import org.scribe.model.Verifier;
import org.scribe.oauth.OAuth20ServiceImpl;
import weiboclient4j.WeiboClientException;
import weiboclient4j.WeiboError;
import weiboclient4j.utils.JsonUtils;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author Hover Ruan
*/
public class SinaWeibo2ServiceImpl extends OAuth20ServiceImpl {
public static final String GRANT_TYPE = "grant_type";
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
private static Logger log = Logger.getLogger(SinaWeibo2ServiceImpl.class.getName());
private SinaWeibo2Api api;
private OAuthConfig config;
public SinaWeibo2ServiceImpl(SinaWeibo2Api api, OAuthConfig config) {
super(api, config);
this.api = api;
this.config = config;
}
@Override
public Token getAccessToken(Token requestToken, Verifier verifier) {
OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
request.addBodyParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
request.addBodyParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
request.addBodyParameter(GRANT_TYPE, api.getGrantType().getType());
if (api.getGrantType() == GrantType.AuthorizationCode) {
request.addBodyParameter(OAuthConstants.CODE, verifier.getValue());
request.addBodyParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
} else if (api.getGrantType() == GrantType.Password && requestToken != null) {
request.addBodyParameter(USERNAME, requestToken.getToken());
request.addBodyParameter(PASSWORD, requestToken.getSecret());
}
Response response = request.send();
String responseBody = response.getBody();
if (!response.isSuccessful()) {
try {
WeiboError error = JsonUtils.readValue(responseBody, WeiboError.class);
if (error.isNotEmpty()) {
throw new OAuthException("Failed with weibo error", new WeiboClientException(error));
}
} catch (IOException e) {
log.log(Level.WARNING, String.format("Failed to parse response: %d, %s", response.getCode(),
responseBody));
}
return null;
}
return api.getAccessTokenExtractor().extract(responseBody);
}
}