基于oauth 2.0 实现第三方开放平台

简介: 本文单纯从简单的技术实现来讲,不涉及开放平台的多维度的运营理念。什么是开放平台通过开放自己平台产品服务的各种API接口,让其他第三方开发者在开发应用时根据需求直接调用,例如微信登录、QQ登录、微信支付、微博登录、热门等。

本文单纯从简单的技术实现来讲,不涉及开放平台的多维度的运营理念。

什么是开放平台

通过开放自己平台产品服务的各种API接口,让其他第三方开发者在开发应用时根据需求直接调用,例如微信登录、QQ登录、微信支付、微博登录、热门等。
让第三方应用通过开发平台,使得自身海量数据资源得到沉淀(变现)
目前国内主流的网站的的开放平台,都是基于oauth2.0 协议进行做的开放平台

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

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

oauth2.0 授权码模式

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。 它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动,能够满足绝大多数开放平台认证授权的需求。

引入相关依赖

<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,密码已经打在控制台自己查即可
  • 授权确认
  • 登录成功带着code回调到目标接口
  • 通过/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;
    }

最终效果

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

总结

目录
相关文章
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
阿里云千问3.5版本活动,Qwen3.5-Plus入门套餐4.5折起,每百万tokens价格低至0.8元
阿里云推出千问3.5版本活动,Qwen3.5-Plus实现原生多模态革新,性能提升且成本降低,支持1M token视频输入。千问3.5入门套餐首购低至4.5折,可抵扣全系大模型,阿里云提供先进GPU算力,支持大模型推理。企业级AI开发平台PAI,支持一键部署。此外,阿里云还推出了9.9元定制AI助理活动,展现AI领域成果。
|
机器学习/深度学习 编解码 算法
人脸识别的主要流程
【1月更文挑战第4天】
|
消息中间件 网络协议 前端开发
殷浩详解DDD:如何避免写流水账代码?
在日常工作中我观察到,面对老系统重构和迁移场景,有大量代码属于流水账代码,通常能看到开发在对外的API接口里直接写业务逻辑代码,或者在一个服务里大量的堆接口,导致业务逻辑实际无法收敛,接口复用性比较差。所以本文主要想系统性的解释一下如何通过DDD的重构,将原有的流水账代码改造为逻辑清晰、职责分明的模块。
殷浩详解DDD:如何避免写流水账代码?
|
JavaScript 物联网 API
vue中使用mqtt
vue中使用mqtt
|
6月前
|
前端开发 NoSQL Java
jeecg-boot
JeecgBoot 是一个基于 Spring Boot 和 Vue3 的低代码开发平台,支持快速构建企业级应用。平台提供源码下载、技术架构清晰,涵盖前后端详细配置及代码生成指南。用户可通过 GitHub 获取源码,使用 IDEA 和 WebStorm 开发,结合 MySQL、Redis 等组件实现系统搭建。平台内置代码生成功能,支持表单开发、菜单配置与权限管理,便于快速实现增删改查等业务需求。
 jeecg-boot
|
移动开发 开发者 UED
HTML5 语义元素详解
HTML5引入了诸多语义元素
IEC104初学者教程,第六章:信息对象类型归总
信息对象类型(Type Identification, TI)字段用于指示报文中包含的信息对象的类型。信息对象类型字段通常是一个字节(8位),表示不同种类的数据或命令。每种类型的值代表一种特定的电力系统数据或控制指令,接收方根据此字段来解析和处理报文中的具体信息。
383 2
|
缓存 JavaScript 小程序
uniapp 普通页面跳转到tabBar页面详解(附加代码+uni.switchTab使用)
uniapp 普通页面跳转到tabBar页面详解(附加代码+uni.switchTab使用)
1576 1
【超详细】springboot + springdoc-openapi + knife4j 集成案例
springdoc-openapijava库有助于使用 spring boot 项目自动生成 API 文档。 springdoc-openapi通过在运行时检查应用程序以根据 spring 配置、类结构和各种注释推断 API 语义来工作。
|
缓存 API 异构计算
数据缓存系列分享(二):23秒完成从零开始搭建StableDiffusion
通过文章 数据缓存系列分享(一):打开大模型应用的另一种方式 我们了解ECI数据缓在使用体验、性能等方面相比于NAS、OSS存储方式的优劣。本文将继续结合实际场景 StableDiffusion 应用讲解数据缓存在大模型方面所带来的极致体验。值得一提的是,即便是对于没有任何准备、零算法基础、零大模型背景知识的开发者也可以轻松地通过ECI API在短短的23秒的时间内就可以搭建一个完整的StableDiffusion应用。
1361 0
数据缓存系列分享(二):23秒完成从零开始搭建StableDiffusion

热门文章

最新文章