springsocial/oauth2---第三方登陆之QQ登陆4【redirect uri is illegal(100010)错误解决方式】

文章目录

  • 1 redirect uri is illegal(100010)错误的原因
    • 1 redirect uri是什么,怎么配置
    • 1.2 redirect uri与我们项目的关系
  • 2 解决 redirect uri错误
    • 2.1 修改我们项目的访问域名+端口
    • 2.2 将SocialAuthenticationFilter默认拦截的请求/auth改为/qqLogin(可配置)
    • 2.3 配置providerId将qq改为callback.do
    • 2.4 修改QQ登陆按钮的请求路径
  • 3 测试

项目源码地址 https://github.com/nieandsun/security

1 redirect uri is illegal(100010)错误的原因

1 redirect uri是什么,怎么配置

上篇文章开发完,当点击QQ登陆时会跳转到如下页面:
springsocial/oauth2---第三方登陆之QQ登陆4【redirect uri is illegal(100010)错误解决方式】_第1张图片
首先我们要明确Oauth2协议的整个流程: 用户点击QQ进行QQ登陆----》用户通过扫码等方式进行授权 —》授权成功后QQ会调用一个回调地址,将授权码给我们的系统 —》然后我们的系统会拿着授权码等去换accesstoken —》换到accesstoken后再通过accesstoken等拿到openid—》接着再拿着accesstoken,openid等去QQ换取用户信息。

redirect uri就是上诉过程中的回调地址

同时我们还要明确redirect uri不是随意生成的,而是在我们的系统在QQ上进行注册时需要填写的必填信息之一,它的填写有一定的规则,可参考QQ互联官网。这里要注意,官网上明确说明了域名要包含"http://"部分
springsocial/oauth2---第三方登陆之QQ登陆4【redirect uri is illegal(100010)错误解决方式】_第2张图片

1.2 redirect uri与我们项目的关系

我们把请求的路径拷贝如下(这个请求具体怎么生成的???为什么要这要生成???与QQ互联官网上获取授权码接口有什么关系???建议大家好好看看QQ互联的官网并仔细阅读一下源码:org.springframework.social.oauth2.OAuth2Template):

https://graph.qq.com/oauth2.0/show?which=error&display=pc&error=100010&client_id=100550231&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fqq&state=8f3b0533-e5a7-4dfe-a2b8-94f0119b0ad2

从中我们可以看到redirect_uri的路径如下:

http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fqq

其实可以很容易地猜出来就是localhost://8080/auth/qq,这肯定不可能是我们在QQ互联上配置的redirect_uri,因此当我们的项目拿着这个redirect_uri去请求QQ的接口时就报出了redirect uri is illegal(100010)的错误。

同时我们也可以看出redirect_uri在我们项目中的生成规则是:

IP+端口号(或者域名+端口)+/auth/qq

其中/auth和/qq我们在上篇文章中讲过它俩分别由SocialAuthenticationFilter和providerId控制。

2 解决 redirect uri错误

通过前面的讲解,就可以很容易地知道假如我们在QQ互联上配置的网站地址和回调域名(redirect_uri)如下。
springsocial/oauth2---第三方登陆之QQ登陆4【redirect uri is illegal(100010)错误解决方式】_第3张图片
那么为了让我们的项目不会报redirect_uri错误,我们需要做如下四件事。

2.1 修改我们项目的访问域名+端口

访问域名应该为:

http://www.pinzhi365.com

本地测试开发时可以通过SwitchHosts来将域名映射为IP,端口号需在项目里指定为80。

  • 本机指定域名和IP的映射关系

springsocial/oauth2---第三方登陆之QQ登陆4【redirect uri is illegal(100010)错误解决方式】_第4张图片

  • 将项目的访问端口号改为80
server:
  port: 80

2.2 将SocialAuthenticationFilter默认拦截的请求/auth改为/qqLogin(可配置)

这个可以通过继承springsocialSocial为我们提供的SocialAuthenticationFilter的配置类SpringSocialConfigurer,并重写其后置处理方法的方式来完成,具体代码如下:

  • 新建一个NrscSpringSocialConfigurer 类继承SpringSocialConfigurer并重写其后置处理方法
package com.nrsc.security.core.social.qq;

import org.springframework.social.security.SocialAuthenticationFilter;
import org.springframework.social.security.SpringSocialConfigurer;

/** * @author : Sun Chuan * @date : 2019/8/19 22:48 * Description:继承springsocialSocial为我们提供的SocialAuthenticationFilter的配置类SpringSocialConfigurer * 并重写其后置处理方法,让其默认拦截包含我们配置字符串的请求 */
public class NrscSpringSocialConfigurer extends SpringSocialConfigurer {

    private String filterProcessesUrl;

    public NrscSpringSocialConfigurer(String filterProcessesUrl) {
        this.filterProcessesUrl = filterProcessesUrl;
    }

    /** * T 其实就是指的SocialAuthenticationFilter类型 * * @param object * @param  * @return */
    @Override
    protected <T> T postProcess(T object) {
        //在父类处理完SocialAuthenticationFilter之后的基础上,将其默认拦截url改成我们配置的值
        SocialAuthenticationFilter filter = (SocialAuthenticationFilter) super.postProcess(object);
        filter.setFilterProcessesUrl(filterProcessesUrl);
        return (T) filter;
    }
}
  • 将我们写的NrscSpringSocialConfigurer 类作为SocialAuthenticationFilter的配置类注入到spring容器,并加入到spring-security过滤器链中
    @Autowired
    private NrscSecurityProperties nrscSecurityProperties;
    /** * 通过apply()该实例,可以将SocialAuthenticationFilter加入到spring-security的过滤器链 */
    @Bean
    public SpringSocialConfigurer nrscSocialSecurityConfig() {
        // 默认配置类,进行组件的组装
        // 包括了过滤器SocialAuthenticationFilter 添加到security过滤链中
        String filterProcessesUrl = nrscSecurityProperties.getSocial().getFilterProcessesUrl();
        NrscSpringSocialConfigurer configurer = new NrscSpringSocialConfigurer(filterProcessesUrl);
        return configurer;
    }
  • 在配置文件里配置filterProcessesUrl让SocialAuthenticationFilter默认拦截含有/qqLogin的请求

springsocial/oauth2---第三方登陆之QQ登陆4【redirect uri is illegal(100010)错误解决方式】_第5张图片

2.3 配置providerId将qq改为callback.do

配置如上图。

2.4 修改QQ登陆按钮的请求路径

修改后的代码如下:

<h3>社交登录h3>
<a href="/qqLogin/callback.do">QQ登录a>

3 测试

访问http://www.pinzhi365.com/nrsc-login.html可以进入到我们的系统,并且点击QQ登陆可以跳转到QQ 的登陆页,没再出现redirect uri is illegal(100010)错误。
springsocial/oauth2---第三方登陆之QQ登陆4【redirect uri is illegal(100010)错误解决方式】_第6张图片

你可能感兴趣的:(spring-security,spring-security)