SpringSecurity+SpringSocial 实现QQ登入(二)
上节我们已经把基本代码写完,接着就是通过配置将其串联起来
配置文件编写
由于SpringBoot 1 跟SpringBoot2 有区别此处使用SpringBoot2
QQAutoConfig
SocialConfig
ImoocSpringSocialConfigurer
QQOAuth2Template
public class QQOAuth2Template extends OAuth2Template {
private Logger logger = LoggerFactory.getLogger(getClass());
public QQOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {
super(clientId, clientSecret, authorizeUrl, accessTokenUrl);
setUseParametersForClientAuthentication(true);
}
@Override
protected RestTemplate getRestTemplate() {
RestTemplate template = super.getRestTemplate();
//添加处理 text/html的 (qq数据请求的处理区)
template.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("utf-8")));
return template;
}
/**
* 覆盖此方法默认是对json数据进行处理成map
* 但是qq不是这样的
* @param accessTokenUrl
* @param parameters
* @return
*/
@Override
protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
String result = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);
logger.info("获取Access Token 的响应结果" + result);
//access_token=F679F117539B5042872183269AF866E5&expires_in=7776000&refresh_token=8038A2C14FF2529A412D01D56A6BC7F8
String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(result, "&");
String access = StringUtils.substringAfter(items[0],"=");
String accessToken = StringUtils.substringAfterLast(items[0],"=");
Long expiresIn = new Long(StringUtils.substringAfterLast(items[1],"="));
String refreshToken = StringUtils.substringAfterLast(items[2],"=");
return createAccessGrant(accessToken,null,refreshToken,expiresIn,null);
}
}