目录
2.3 组件写完了以后需要使用配置类将其加载出来给Spring管理
1.Spring Social的原理图和实现的基本组件
2.实现过程
2.1首先实现的是api接口
根据原理图来看我们先写获取用户的实现,即第六步,第六步为完全自定的Api实现
然后编写这个实现类,实现类需要继承AbstractOauth2ApiBingding,这个抽象类两个属性,这两个属性是干嘛的呢?
accessToken:就是第五步生成的令牌,每个人走流程获取的令牌是不一样的,QQImpl不是一个单例的对象,所以不能声明为 @Compont,那样的话他就是单例的了。
restTemplate:用于第六步发请求拿到用户的信息。
package org.lilly.core.social.qq.api;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.lilly.core.social.qq.UserInfo;
import org.springframework.social.oauth2.AbstractOAuth2ApiBinding;
import org.springframework.social.oauth2.TokenStrategy;
/**
* Created by Andy on 2020/7/20
* 调用get_user_info获取用户的信息
* 这个角色就是ServiceProvider里面的API接口的实现
*/
public class QQImpl extends AbstractOAuth2ApiBinding implements QQ {
/**
* 申请QQ登录成功后,分配给应用的appid,
*/
private String appId;
/**
* 用户的ID,与QQ号码一一对应。
* 可通过调用https://graph.qq.com/oauth2.0/me?access_token=YOUR_ACCESS_TOKEN 来获取。
*/
private String openId;
/**
* 获得openId的URL
* <p>
* 返回:callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );
*/
private String URL_GET_OPERNID = "https://graph.qq.com/oauth2.0/me?access_token=%s";
/**
* 获得用户信息的URL
* https://graph.qq.com/user/get_user_info?access_token=YOUR_ACCESS_TOKEN&oauth_consumer_key=YOUR_APP_ID&openid=YOUR_OPENID
* access_token已经在AbstractOAuth2ApiBinding生成RestTemplate的时候绑定了,他可以设置请求体的转换器和请求的拦截器
*/
private String URL_GET_USERINFO = "https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s";
private ObjectMapper objectMapper = new ObjectMapper();
public QQImpl(String accessToken, String appId) {
//Token的策略TokenStrategy,将参数放在url中
super(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER);
this.appId = appId;
String url = String.format(URL_GET_OPERNID, accessToken);
String result = super.getRestTemplate().getForEntity(url, String.class).getBody();
String openId = StringUtils.substringBetween(result, "openid\":\"", "\"}");
this.openId = openId;
}
@Override
public UserInfo getUserInfo() {
String url = String.format(URL_GET_USERINFO, this.appId, this.openId);
String object = super.getRestTemplate().getForObject(url, String.class);
UserInfo userInfo = null;
try {
userInfo = objectMapper.readValue(object, UserInfo.class);
userInfo.setOpenId(this.openId);
} catch (IOException e) {
e.printStackTrace();
}
return userInfo;
}
}
下一步 看QQ文档资料,调用接口需要三个参数:access_token在抽象类中已经定义了,所以还需要两个appId 和openId
获取appid需要申请成为开发者:https://www.cnblogs.com/xiaogou/p/11663164.html
2.2 然后继续写下面的基本组件
获取用户信息的步骤就完了,上面的整个步骤只是完成了第六步
然后就可以构造出一个ServiceProvider, 另外的一2个组件先用默认的Oauth2Template,
注意这个泛型是第六步API接口的类型,这里是QQ接口,
右边部分服务提供商的部分就写完了。
接下来写左边的部分,Connection相关的。
首先服务提供商有了,还差一个ApiAdapter就可以构造出ConnectionFactory,这个接口没有默认的,因为不同的提供商都是不一样的所以自己写,这个泛型的类型就是这个Api接口的类型,这里当然就是QQ。
默认QQ永远能连接上,openID及用户在服务提供商里面的唯一标识id
编写ConnectionFactory:
配置数据库的,
建表: