文章目录
一、原理回顾
没看过前面几篇博客的内容可以先看看:
SpringSecurity一:开发基于表单的登录
SpringSecurity二:验证码校验和记住我
SpringSecurity三:OAuth协议和SpringSocial
OAuth协议过程:
二、相关接口的了解
QQ登录文档链接:https://wiki.connect.qq.com/get_user_info ;
OAuth2.0协议必须传入的通用参数:
get_user_info返回参数
三、开发获取用户信息的api
由上一篇文章 SpringSecurity三:OAuth协议和SpringSocial 可知我们要开发一个第三方登录,需要写一个类QQImpl继承AbstractOAuth2ApiBinding 实现获取用户信息,AbstractOAuth2ApiBinding 如下:
restTemplate是用于向服务提供商发HTTP请求获取用户信息的。
由于每个用户在经历OAuth协议1-5步之后获取的accessToken都是不一样的,所以我们的QQImpl也应该不一样,是个多实例类。
由此,我们实现的QQImpl代码如下:
/**
*
*/
package com.imooc.security.core.social.qq.api;
import org.apache.commons.lang.StringUtils;
import org.springframework.social.oauth2.AbstractOAuth2ApiBinding;
import org.springframework.social.oauth2.TokenStrategy;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* @author zhailiang
*
*/
public class QQImpl extends AbstractOAuth2ApiBinding implements QQ {
private static final String URL_GET_OPENID = "https://graph.qq.com/oauth2.0/me?access_token=%s";
private static final String URL_GET_USERINFO = "https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s";
//可以通过accessToken取,accessToken是走完OAuth协议后拿到的令牌
private String appId;
//系统配置信息
private String openId;
private ObjectMapper objectMapper = new ObjectMapper();
public QQImpl(String accessToken, String appId) {
//TokenStrategy.AUTHORIZATION_HEADER是默认的请求策略,默认把accessToken放到请求头里,不符合QQ放在参数的要求
// TokenStrategy.ACCESS_TOKEN_PARAMETER把默认把accessToken放到参数里
super(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER);
this.appId = appId;
String url = String.format(URL_GET_OPENID, accessToken);
//获取openId
String result = getRestTemplate().getForObject(url, String.class);
//结果callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );
System.out.println(result);
this.openId = StringUtils.substringBetween(result, "\"openid\":\"", "\"}");
}
/* (non-Javadoc)
* @see com.imooc.security.core.social.qq.api.QQ#getUserInfo()
*/
@Override
public QQUserInfo