资讯专栏INFORMATION COLUMN

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

Simon / 2915人阅读

摘要:本文单纯从简单的技术实现来讲,不涉及开放平台的多维度的运营理念。它的特点就是通过客户端的后台服务器,与服务提供商的认证服务器进行互动能够满足绝大多数开放平台认证授权的需求。

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

什么是开放平台

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

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

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

oauth2.0 授权码模式

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

引入相关依赖

         org.springframework.cloud
         spring-cloud-starter-oauth2
 
 

        org.springframework.cloud
        spring-cloud-starter-security
配置认证服务器

通过内存模式,初始化一个支持授权码模式的客户端

@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获取登录令牌

简单的几步就完成上图微信或者其他网站的授权流程,不过目前为止 略显简陋

登录没有界面,用户密码数据库没有保存

确认授权界面太丑,没有个性化

配置安全登录

配置未登录拦截重定向到 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 scopeList = (Map) 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;
    }
最终效果

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

总结

以上源码参考个人项目 基于Spring Cloud、OAuth2.0开发基于Vue前后分离的开发平台

QQ: 2270033969 一起来聊聊你们是咋用 spring cloud 的吧。

欢迎关注我们的公众号获得更多的好玩JavaEE 实践

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103382.html

相关文章

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

    摘要:本文单纯从简单的技术实现来讲,不涉及开放平台的多维度的运营理念。它的特点就是通过客户端的后台服务器,与服务提供商的认证服务器进行互动能够满足绝大多数开放平台认证授权的需求。 本文单纯从简单的技术实现来讲,不涉及开放平台的多维度的运营理念。 什么是开放平台 通过开放自己平台产品服务的各种API接口,让其他第三方开发者在开发应用时根据需求直接调用,例如微信登录、QQ登录、微信支付、微博登录...

    xiaodao 评论0 收藏0
  • Authing 是什么及实现了哪些国际身份协议

    摘要:是什么提供身份认证和授权服务。你希望你的用户能使用微信登录,同时你还希望能追踪到用户的注册来源,活动数据,以便你做后续的用户增长。 Authing 是什么? Authing 提供身份认证和授权服务。 我们为开发者和企业提供用以保证应用程序安全所需的认证模块,这让开发人员无需成为安全专家。 你可以将以任意语言和任意技术栈编写的应用接入到 Authing,同时你还可以自定义应用程序的登录方...

    RichardXG 评论0 收藏0
  • 基于 github issues 实现三方评论系统

    摘要:什么是第三方评论系统博客或系统,一般都是有内容和评论两部分组成。而且垃圾评论和过滤非法关键字难度较大,所以在国内外都有第三评论系统。三评论系统实现预备工作创建。 本文只是介绍如何基于 github issues 实现第三方评论系统,对于 Hexo 介绍,本文并不打算详述,如果有童鞋之前还没有了解 Hexo 的,可以先看一下之前文章《静态博客框架 Hexo 入门 》,或者直接访问 Hex...

    waltr 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<