基于oauth 2.0 完成第三方开放平台

本文纯真从简朴的手艺完成来说,不触及开放平台的多维度的运营理念。

什么是开放平台

经由过程开放本身平台产物效劳的种种API接口,让其他第三方开辟者在开辟运用时依据需求直接挪用,比方微信登录、QQ登录、微信付出、微博登录、热点等。
让第三方运用经由过程开辟平台,使得本身海量数据资本取得沉淀(变现)
目前国内主流的网站的的开放平台,都是基于oauth2.0 协定举行做的开放平台

  • 微信开放平台受权机制流程图

《基于oauth 2.0 完成第三方开放平台》

  • 微博开放平台受权机制流程图

《基于oauth 2.0 完成第三方开放平台》

oauth2.0 受权码形式

受权码形式(authorization code)是功用最完全、流程最周密的受权形式。 它的特性就是经由过程客户端的背景效劳器,与”效劳提供商”的认证效劳器举行互动,可以满足绝大多数开放平台认证受权的需求。
《基于oauth 2.0 完成第三方开放平台》

引入相干依靠

<dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-oauth2</artifactId>
 </dependency>
 
<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-security</artifactId>
</dependency>

设置认证效劳器

经由过程内存形式,初始化一个支撑受权码形式的客户端

@Configuration
@AllArgsConstructor
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Override
    @SneakyThrows
    public void configure(ClientDetailsServiceConfigurer clients) {
        clients.inMemory()
                .withClient("pigx") // client_id
                .secret("pigx") // client_secret
                .authorizedGrantTypes("authorization_code") // 该client许可的受权范例
                .scopes("app"); // 许可的受权局限
    }
}

开端完成,测试一下

注重这里是 /oauth/authorize 不是 /oauth/token 接口,只需要带 client_id 即可。

localhost:9999/oauth/authorize?client_id=pigx&response_type=code&redirect_uri=https://pig4cloud.com
  • 先举行basic 登录,默许用户user,暗码已打在控制台本身查即可

《基于oauth 2.0 完成第三方开放平台》

  • 受权确认

《基于oauth 2.0 完成第三方开放平台》

  • 登录胜利带着code回调到目的接口

《基于oauth 2.0 完成第三方开放平台》

  • 经由过程/oauth/token猎取登录令牌

简朴的几步就完成上图微信或许其他网站的受权流程,不过目前为止 略显大略

  1. 登录没有界面,用户暗码数据库没有保留
  2. 确认受权界面太丑,没有特性化

设置平安登录

  • 设置未登录阻拦重定向到 loginPage
  • 设置登录完成提交的页面途径 这里会被spring security 接受
@Primary
@Order(90)
@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    @SneakyThrows
    protected void configure(HttpSecurity http) {
        http
            .formLogin()
            .loginPage("/token/login")
            .loginProcessingUrl("/token/form")
            .and()
            .authorizeRequests()
            .anyRequest().authenticated();
    }
}

认证效劳器设置用户加载划定规矩完成

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
    endpoints.userDetailsService(pigxUserDetailsService)
}

// 经由过程这步去加载数据的用户名暗码
public interface UserDetailsService {
    UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}

重写原有认证页面

默许逻辑/oauth/confirm_access,让他重定向到我们本身的途径,然后举行特性哈

@Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints
                .userDetailsService(pigxUserDetailsService)
                .pathMapping("/oauth/confirm_access", "/token/confirm_access")
    }

猎取高低文中的受权信息,传给前端

    /**
     * 确认受权页面
     *
     * @param request
     * @param session
     * @param modelAndView
     * @return
     */
    @GetMapping("/confirm_access")
    public ModelAndView confirm(HttpServletRequest request, HttpSession session, ModelAndView modelAndView) {
        Map<String, Object> scopeList = (Map<String, Object>) request.getAttribute("scopes");
        modelAndView.addObject("scopeList", scopeList.keySet());

        Object auth = session.getAttribute("authorizationRequest");
        if (auth != null) {
            AuthorizationRequest authorizationRequest = (AuthorizationRequest) auth;
            ClientDetails clientDetails = clientDetailsService.loadClientByClientId(authorizationRequest.getClientId());
            modelAndView.addObject("app", clientDetails.getAdditionalInformation());
            modelAndView.addObject("user", SecurityUtils.getUser());
        }

        modelAndView.setViewName("ftl/confirm");
        return modelAndView;
    }

终究结果

  • 把用户头像等信息展示出来就蛮好看了

《基于oauth 2.0 完成第三方开放平台》

总结

《基于oauth 2.0 完成第三方开放平台》

    原文作者:冷冷
    原文地址: https://segmentfault.com/a/1190000018811603
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞