欢迎来到皮皮网官网

【php源码 房产】【discuz源码板块】【指标源码分析】oauth源码

时间:2024-12-24 03:11:01 来源:益阳网站建设源码

1.OAuth 2.0:对接 Keycloak 设备码授权流程
2.OAuth2.0原理图解:第三方网站为什么可以使用微信登录
3.阿里Spring Security OAuth2.0认证授权笔记震撼开源!原理+实战+源码三飞!
4.SpringSecurity Oauth2Authentication对象使用
5.Spring Security5后基于Oauth2.1的Authorization Server 实现 (官方demo,稍作修改)
6.越学越多——获取虚幻源码

oauth源码

OAuth 2.0:对接 Keycloak 设备码授权流程

       OAuth 2.0 是一种开放授权协议,被广泛应用于第三方软件(客户端)获取用户访问令牌,以便访问资源服务器上的php源码 房产用户信息。访问令牌以 jwt 格式呈现,具有内检机制,能节省服务器端存储,但服务器端仍可存储相关信息以进行更复杂的控制。访问令牌的获取方式多样,统称为授权许可类型,常见的包括授权码、密码、客户端等。

       本文以一个 nodejs 编写的命令行程序为例,展示了如何对接 Keycloak 的设备码授权流程。要体验此过程,需在安装了 nodejs 的环境中执行特定命令。按照提示,打开浏览器输入授权码,点击同意授权,discuz源码板块关闭浏览器后回到命令行,即进入登录状态。

       实现这一流程的关键是 OAuth 2.0 的设备码授权许可类型。它允许第三方应用在非浏览器环境下,通过命令行、API 等方式获取用户的访问令牌。文章中详细介绍了配置步骤和关键代码,包括发送 HTTP 请求到 Keycloak 授权服务器以获取设备码和用户码、跳转到浏览器页面进行用户授权、在命令行中轮询获取令牌等。

       在 Keycloak 实例中,配置了一个 demoapp 客户端并写了一个 demo 工程,源代码位于 GitHub。文章中展示了如何将 Keycloak 的登录功能集成到命令行工具中,通过输入 k8ss login 命令自动打开浏览器,用户登录后返回命令行,从而实现登录状态。由于需要千人千面,确保不同用户的登录状态隔离,只能使用设备码授权许可类型,以便为命令行工具提供用户级别的指标源码分析访问令牌。

       为了简化实现过程,文章中使用 Postman 编写 HTTP 请求,以生成对应的开发语言代码。对于非 nodejs 的应用,同样可以使用此方法对接其他服务。通过这种方式,开发人员可以快速集成 Keycloak 的授权功能,而无需从头构建授权服务器。

       综上所述,通过对接 Keycloak 的设备码授权流程,开发者能够实现非浏览器环境下对用户的授权管理,简化了第三方应用的集成过程,同时也保证了用户授权的灵活性和安全性。

OAuth2.0原理图解:第三方网站为什么可以使用微信登录

       假设小明开发了一个A网站,需要支持微信登录和淘宝账号登录。如果你是微信或者淘宝开发人员,你会怎么设计这个功能?本文结合淘宝开放平台官方文档以淘宝账号为例。

       从最简单视角去思考,用户在网站A输入淘宝用户名和密码,网站A调用淘宝接口校验输入信息,校验通过则登陆成功,reactor源码解读整体流程如下图:

       上述思路存在什么问题?最显著问题就是信息安全问题。问题第一个方面是用户需要将淘宝用户名和密码输入网站A,这样会带来用户名和密码泄露风险。问题第二个方面是如果用户不信任网站A,那么也不会输入淘宝用户名和密码,影响网站A业务开展。

       OAuth是一种流行标准。如果执行这行这个标准,那么用户可以在不告知A网站淘宝用户名和密码情况下,使用淘宝账号登陆A网站。

       目前已经发展到OAuth2.0版本,相较于1.0版本更加关注客户端开发者简易性,而且为桌面应用、web应用、手机设备提供专门认证流程。

       OAuth2.0标准定义了四种角色:

       四种角色交互流程:

       本文场景对应四种角色:

       OAuth2.0标准定义了以下四种授权模式:

       四种授权模式中最常用的是授权码模式,例如微信开发平台文档介绍对于网站应用微信OAuth2.0授权登录目前支持授权码模式,所以本文只介绍授权码模式,后续文章会详细比较四种模式。

       第一个流程是创建应用,A网站开发者首先去淘宝开放平台创建应用,模板源码加密开放平台会生成一个client_id作为A网站唯一标识。

       第二个流程是授权流程,用户在A网站点击使用淘宝账号登陆时,实际上跳转至A网站拼接授权URL页面,这个页面由淘宝提供。用户在授权页面输入淘宝用户名和密码,校验成功后跳转至A网站回调地址,这时A网站会拿到一个code,后台再使用code去获取access_token。

       第三个流程是获取信息,获取到access_token相当于获取到一把钥匙,再按照规范调用淘宝对外提供接口就可以获取到用户数据。

       第一个方面A网站开发人员需要在淘宝开放平台进行申请,需要输入个人信息或者公司信息,这样A网站可靠性有了一定程度保证。

       第二个方面在第一章节方案用户需要在A网站输入淘宝用户名和密码,但是在OAuth2.0方案虽然也要输入淘宝用户名密码,但是这个页面由淘宝官方提供,安全性得到了保证。

       第三个方面access_token(令牌)并没有在浏览器中传递,而是需要A网站在获取到code之后去后台程序换取,避免了钥匙泄露风险。

       第四个方面code(授权码)在浏览器传递有一定风险,但是具有两个特性一定程度保证了安全:

       在第二章节详细分析了OAuth2.0协议,在实现流程章节分析了创建应用、授权流程、获取信息三个流程,我们发现一个问题:在流程图步骤资源服务器需要远程调用授权服务器check_token端点校验令牌是否消息,这样比较消耗性能。

       如果资源服务器和授权服务器约定一个密钥对,授权服务器用秘钥加密令牌,当资源服务器接收到令牌时进行解密直接对令牌进行校验,这样可以节省远程交互。

       JSON Web Token(JWT)可以解决上述问题,作为一个开放标准(RFC )定义了一种紧凑的自包含方式,用于作为JSON对象在各方之间安全地传输信息。

       JWT分为头部、有效载荷和签名三个部分。头部包含签名算法以及token类型。有效载荷包含真正业务信息,例如用户ID、姓名、邮箱、权限信息。头部和有效载荷任何人都可以读出来,所以需要用签名防止篡改:头部和有效载荷分别进行Base编码,编码后用 . 连接组成新字符串,再使用头部声明算法进行签名。

       JWT令牌内容:

       JWT解码内容:

       在第二章节详细分析了OAuth2.0协议,我们还发现一个问题:客户端在获取到令牌之后,还需要调用资源服务器接口获取用户信息,有没有一种协议可以在返回令牌时同时将用户是谁返回呢?

       回答这个问题之前首先对比一组概念:授权与认证。授权关注通信实体具有什么权限,认证关注通信实体是谁。OAuth2.0只有授权流程,返回令牌之后授权流程已经完成,OpenID Connect在此基础上进行了扩展,客户端能够通过认证来识别用户。

       OpenID Connect定义了三种角色:

       三种角色交互流程:

       本文场景对应三种角色:

       OIDC标准协议新增id_token字段,这个字段符合JWT标准格式。为什么不与第三章节一样在access_token包含有效负载信息,而是新增id_token字段?因为即使access_token可以加入用户信息并且防篡改,但是用户每次请求都需要携带access_token,增加了带宽和用户信息泄露风险。

       OIDC标准协议要求提供了一个/userinfo端点,可以通过access_token调用获取用户信息,那么id_token已经包含了用户信息,为什么还要提供此端点呢?

       原因是id_token提供用户基本信息,如果客户端只要求获取基本信息,那么无需调用/userinfo端点。如果需要获取用户详细信息,那么可以调用/userinfo端点。

       JWT在线编码工具

       JWT在线解码工具

       淘宝开放平台用户授权介绍

       网站应用微信登录开发指南

       欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习

阿里Spring Security OAuth2.0认证授权笔记震撼开源!原理+实战+源码三飞!

       Spring Security是一款强大的企业级安全框架,它作为Spring生态系统的组成部分,为Spring应用提供声明式安全访问控制。在Spring Boot项目中,集成Spring Security能够简化安全控制代码编写,减少重复工作。

       在移动互联网时代,微信等应用的认证过程是用户身份验证的典型例子。认证是指确认用户身份是否合法,例如通过账号密码、二维码或指纹等方式。OAuth2.0作为OAuth协议的升级版本,允许用户授权第三方应用访问其存储信息,无需分享用户名和密码,提供了一种安全的授权协议。

       针对Spring Security的学习资料相对较少,本文档将提供两部分深入讲解:首先,通过XML配置在SSM环境中,从源码解析,详解Spring Security的认证、授权(包括“记住我”和CSRF拦截)功能。其次,在Spring Boot中,深入探讨分布式环境下的认证与授权实现。

       第一份笔记:

       基本概念

       基于Session的认证

       快速上手Spring Security

       应用详解

       分布式系统认证方案

       OAuth2.0介绍

       分布式系统授权实现

       企业开发首选的Spring Security笔记:

       初识Spring Security

       授权操作

       集中式Spring Security与SpringBoot整合

       OAuth2.0实战案例

       需要完整文档和源码的朋友,可通过此链接获取:[点击获取链接]

SpringSecurity Oauth2Authentication对象使用

        在调用资源服务器的过程中,我们会将申请的token 作为header值进行传递,携带调用者的身份信息。但是资源服务器是如何通过token对调用者的身份进行判断的呢?

        Security中有一个Filter实现了对token信息的转换,将token值转换成了调用者的用户信息。该filter就是 Oauth2AuthenticationProcessingFilter

        一、查看源码

        查看Oauth2AuthenticationProcessingFilter的doFilter方法

        通过查看Oauth2AuthenticationProcessingFilter的dofilter方法,重点有两点

        (1)将request中的token提取出来封装成Authentication对象

        (2)将Authentication交给authenticationManager进行鉴权处理

        下面我们重点看下这两处的处理。

        二、token到Authentication对象转换实现

        Authentication authentication = tokenExtractor.extract(request);

        tokenExtractor在Oauth2AuthencationProcessingFilter中的默认实现是BearerTokenExtractor,我们查看BearerTokenExtractor的extract()方法。

        三、Authentication对象的鉴权

        Authentication authResult = authenticationManager.authenticate(authentication);

        此处的authenticationManager的实现类是Oauth2AuthenticationManager,而不是我们之前一直提到的ProvicerManager。我们看下Oauth2AuthenticationManager中的authenticate()方法。

        RemoteTokenService 的 loadAuthentication() 方法

        用户认证转换类

        * 接口层注入的 OAuth2Authentication对象中的 principal属性即在该类的extractAuthentication() 方法中实现的。

        * security默认使用的是 DefaultAccessTokenConverter类中的extractAuthentication()方法中使用。

        * 通过继承UserAuthenticationConverter该类,实现其中的extractAuthentication()方法来满足我们自己构造 principal属性的需求。

        * 在ResourceConfig类中,继续使用DefaultAccessTokenConverter,但是类中的UserAuthenticationConverter我们里换成我们自己的CustomUserAuthenticationConverter实现类。

        *

        * 我们构造的principal属性是map类,里面包含phone和userId两个字段。

Spring Security5后基于Oauth2.1的Authorization Server 实现 (官方demo,稍作修改)

       QQ群

       说明

       Spring Security5之后,实现Oauth不再推荐使用spring-security-oauth2。官方推荐了一种新的方法(github.com/spring-proje...)。

       需要注意的是,该方式支持的不是oauth2,而是oauth2.1。关于oauth2.1的详细介绍,可以参考:oauth.net/2.1/ 和 aaronparecki.com//1...。

       摘自 oauth2.net 网站上对比 oauth2 的说明:

       主要区别(以下使用翻译软件翻译,大致意思没错)

       官方demo运行

       根据 github.com/spring-proje... 上的说明,使用 gradle 命令运行即可。

       复制官方代码(官网 userdetails 使用内存模式,我修改成了 jdbc,更加直观),使用 postman 进行测试。

       代码位置:authorization-server

       测试

       查看自动创建的表结构:

       浏览器访问:localhost:/h2-console...

       点击 Connect:

       我们看到创建了五张表,打开表会发现数据也被初始化进去了。

       启动项目,请求授权码模式地址:blogs.com/cjsblog/p/.html

       blogs.com/cjsblog/p/.html

       blogs.com/cjsblog/p/.html

       blogs.com/cjsblog/p/.html

       blogs.com/lihaoyang/p/.html

       blogs.com/charlypage/p/.html

       /t/.html

        9. 文档

       blogs.com/cjsblog/p/.html

copyright © 2016 powered by 皮皮网   sitemap