Security--09(QQ登录)

1. 首先实现的是api接口然后编写这个实现类,实现类需要继承AbstractOauth2ApiBingding,这个抽象类两个属性,这两个属性是干嘛的呢?accessToken:就是第五步生成的令牌,每个人走流程获取的令牌是不一样的,QQImpl不是一个单例的对象,所以他们声明为@Compont,那样的话他就是单例的了。restTemplate:用于第六步发请求拿到用户的信息。下一步 看QQ文档资料调用接口需要三个参数:access_token在抽象类中已经定.
摘要由CSDN通过智能技术生成

目录

 

1.Spring Social的原理图和实现的基本组件

2.实现过程

 2.1首先实现的是api接口

2.2 然后继续写下面的基本组件

2.3 组件写完了以后需要使用配置类将其加载出来给Spring管理

2.4 QQ登录的域名问题的解决

2.5 qq登录路径问题的解决

2.6  请求服务提供商返回信息无法解析的问题

2.7 解决首次登录的时候用户信息的注册或者绑定的问题。

2.8 实现自动注册的效果


 

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:

配置数据库的,

建表:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值