Spring Seurity系列(十四) 开发QQ登录(下)

在上一篇结尾处,qq登录报了回调地址错误。

查看地址栏中的回调地址为:http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fqq

可以看出将用户引导到认证服务器和认证服务器带着授权码的返回到第三方应用的地址是一样的

都为/auth/qq。

但是我在QQ互联测试账号中配置的回调域为:http://www.example.com/qqLogin/callback.do。

自己实现ImoocSpringSocialConfigurer 继承 SpringSocialConfigurer 

/**
 * 自己创建ImoocSpringSocialConfigurer继承SpringSocialConfigurer,重写
 * postProcess,将自己配置的filterProcessesUrl设置进去。
 * @author zhailiang
 *
 */
public class ImoocSpringSocialConfigurer extends SpringSocialConfigurer {
	
	private String filterProcessesUrl;
	
	public ImoocSpringSocialConfigurer(String filterProcessesUrl) {
		this.filterProcessesUrl = filterProcessesUrl;
	}
	
	@Override
	protected <T> T postProcess(T object) {
		SocialAuthenticationFilter filter = (SocialAuthenticationFilter) super.postProcess(object);
		filter.setFilterProcessesUrl(filterProcessesUrl);
		return (T) filter;
	}

}

修改SocialConfig:

//将SpringSocialFilter添加到安全配置的Bean
	@Bean
	public SpringSocialConfigurer imoocSocialSecurityConfig() {
		String filterProcessesUrl = securityProperties.getSocial().getFilterProcessesUrl();
		ImoocSpringSocialConfigurer imoocSocialSecurityConfig = new ImoocSpringSocialConfigurer(filterProcessesUrl);
		return imoocSocialSecurityConfig;
	}

在 SocialProperties中添加默认的拦截为/auth

在配置文件中配置:

 

修改页面:

启动项目进行测试:扫码后进入这样的页面:

 

查看控制台:

为什么扫码成功后跳转的地址是signin?

 先了解一下第三方登录的流程:

 跟踪源码分析:

为什么不支持text/html

 

 

 因此创建QQOAuth2Template 继承 OAuth2Template:

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);
		//useParametersForClientAuthentication为true时exchangeForAccess方法。才会setclientId
		setUseParametersForClientAuthentication(true);
	}
	
	//qq互联获取accessToke的响应返回的是&拼接的字符串
	@Override
	protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
		String responseStr = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);
		
		logger.info("获取accessToke的响应:"+responseStr);
		
		String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(responseStr, "&");
		
		String accessToken = StringUtils.substringAfterLast(items[0], "=");
		Long expiresIn = new Long(StringUtils.substringAfterLast(items[1], "="));
		String refreshToken = StringUtils.substringAfterLast(items[2], "=");
		
		return new AccessGrant(accessToken, null, refreshToken, expiresIn);
	}
	
	//重写createRestTemplate,解决不能处理text/html
	@Override
	protected RestTemplate createRestTemplate() {
		RestTemplate restTemplate = super.createRestTemplate();
		restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
		return restTemplate;
	}

}

并修改在上面一节中下面图片中的错误:

 

启动项目进行测试:控制台打印

下篇将进行为什么跳转的是signup的原因进行分析。 

猜你喜欢

转载自blog.csdn.net/newhanzhe/article/details/81274015