SpringSecurity oAuth2.0的四种模式(小结)

目录
  • 1.1. 授权码授权模式(Authorization code Grant)
    • 1.1.1. 流程图
    • 1.1.2. 授权服务器配置配置
    • 1.1.3. 资源服务器配置
    • 1.1.5. 使用场景
  • 1.2. 隐式授权模式(Implicit Grant)
    • 1.2.1. 流程图
    • 1.2.2. 改动 authorizedGrantTypes
    • 1.2.3. 操作步骤
    • 1.2.4. 使用场景
  • 1.3. 密码模式(Resource Owner Password Credentials Grant)
    • 1.3.1. 流程图
    • 1.3.2. 改动
    • 1.3.3. 操作步骤
    • 1.3.4. 使用场景
  • 1.4. 客户端凭证模式(Client Credentials Grant)
    • 1.4.1. 流程图
    • 1.4.2. 改动
    • 1.4.3. 操作步骤
    • 1.4.4. 使用场景
  • 1.5. 刷新TOKEN
    • 1.5.1. 流程图
    • 1.5.2. 改动

1.1. 授权码授权模式(Authorization code Grant)

1.1.1. 流程图

1.1.2. 授权服务器配置配置

授权服务器中 client,secret,redirectUri,授权模式,权限配置

//授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends
        AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients)
            throws Exception {
        clients.inMemory()
            .withClient("clientapp")
            .secret("112233")
            .redirectUris("http://localhost:9001/callback")
            // 授权码模式
            .authorizedGrantTypes("authorization_code")
            .scopes("read_userinfo", "read_contacts");
    }

}

1.1.3. 资源服务器配置

配置需要资源授权的接口地址

//资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest()
            .authenticated()
        .and()
            .requestMatchers()
            .antMatchers("/api/**");
    }

}

1.1.4. 操作步骤

浏览器请求下列地址,获取授权code,请求参数client_id,redirect_uri回调地址,response_type响应类型,scope权限

http://localhost:8080/oauth/authorize?client_id=clientapp&redirect_uri=http://localhost:9001/callback&response_type=code&scope=read_userinfo

输入用户名密码,该密码为Spring Security的登路密码,application.properties里配置

# Spring Security Setting
security.user.name=bobo
security.user.password=xyz

登陆后显示

选择Approve,点击Authorize,会调用回调地址并返回code参数

在获得授权码后,接下去获取访问令牌,访问

http://localhost:8080/oauth/token?code=ghN0hF&grant_type=authorization_code&redirect_uri=http://localhost:9001/callback&scope=read_userinfo

注意:需要在headers里添加认证

认证参数就是授权服务器配置的client和secret

获取token后访问

http://localhost:8080/api/userinfo?access_token=f4345f3a-34a3-4887-bc02-e95150c54bf4

如果token错误,则

1.1.5. 使用场景

授权码模式是最常见的一种授权模式,在oauth2.0内是最安全和最完善的。适用于所有有Server端的应用,如Web站点、有Server端的手机客户端。可以得到较长期限授权。

1.2. 隐式授权模式(Implicit Grant)

1.2.1. 流程图

1.2.2. 改动 authorizedGrantTypes

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthoriationServer extends AuthorizationServerConfigurerAdapter{
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

        clients.inMemory()
                .withClient("clientapp")
                .secret("112233")
                .accessTokenValiditySeconds(60)
                .redirectUris("http://localhost:9001/callback")
                .authorizedGrantTypes("implicit")
                .scopes("admin", "visitor");
    }
}

1.2.3. 操作步骤

申请授权token,参数和申请授权码类似,client_id,redirect_uri回调地址,response_type有变动,改为直接获取token,scope权限,state用于认证标记,传过去什么回调时传回来什么

http://localhost:8080/oauth/authorize?client_id=clientapp&redirect_uri=http://localhost:9001/callback&response_type=token&scope=admin&state=abc

操作同上,输入密码跳转认证确认,选Approve后点Authorize,跳转

3. 可以看到直接返回了access_token,state也是原样返回
4. 之后按授权码模式第六步操作,把access_token参数带上,进行接口调用就可以了

1.2.4. 使用场景

  • 适用于所有无Server端配合的应用
  • 如手机/桌面客户端程序、浏览器插件。
  • 基于JavaScript等脚本客户端脚本语言实现的应用。

注意:因为Access token是附着在 redirect_uri 上面被返回的,所以这个 Access token就可能会暴露给资源所有者或者设置内的其它方(对资源所有者来说,可以看到redirect_uri,对其它方来说,可以通过监测浏览器的地址变化来得到 Access token)。

1.3. 密码模式(Resource Owner Password Credentials Grant)

1.3.1. 流程图

1.3.2. 改动

授权服务器配置,需要添加用户认证管理端点authenticationManager,修改模式authorizedGrantTypes为password

// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthoriationServer extends AuthorizationServerConfigurerAdapter{

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

        clients.inMemory()
                .withClient("clientapp")
                .secret("112233")
                .accessTokenValiditySeconds(60)
                .redirectUris("http://localhost:9001/callback")
                .authorizedGrantTypes("password")
                .scopes("admin", "visitor");
    }
}

1.3.3. 操作步骤

调用以下链接,向客户端和服务器提供用户名密码

http://localhost:8080/oauth/token?password=123456&grant_type=password&username=lll&scope=admin

注意:和授权码模式一样,需要在headers里添加认证

结果:

获取token后,步骤同1.1和1.2模式

1.3.4. 使用场景

  • 这种模式适用于用户对应用程序高度信任的情况。比如是用户操作系统的一部分。
  • 认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

1.4. 客户端凭证模式(Client Credentials Grant)

1.4.1. 流程图

1.4.2. 改动

只需修改授权服务器,authorizedGrantTypes类型client_credentials

1.4.3. 操作步骤

http://localhost:8080/oauth/token?grant_type=client_credentials&scope=admin

可以看到客户端凭证模式也需要在header里添加认证账户密码

获得token后操作同上

1.4.4. 使用场景

  • 客户端模式应用于应用程序想要以自己的名义与授权服务器以及资源服务器进行互动。
  • 例如使用了第三方的静态文件服务

1.5. 刷新TOKEN

1.5.1. 流程图

1.5.2. 改动

1.5.3. 操作步骤

以授权码模式为例,步骤同授权码模式,取得授权码后,去取token时,返回

在token过期后,调用

http://localhost:8080/oauth/token?grant_type=refresh_token&refresh_token=ad3941d1-c6dd-4a2e-a9c8-eac6a9a59dd2

返回

就可以拿新的access_token继续调用了建议将access_token和refresh_token的过期时间保存下来,每次调用平台方的业务api前先对access_token和refresh_token进行一下时间判断,如果过期则执行刷新access_token或重新授权操作。refersh_token如果过期就只能让用户重新授权。

参考 https://www.cnblogs.com/maoxiaolv/p/5838680.html

代码学习地址 https://github.com/spring2go/oauth2lab

到此这篇关于SpringSecurity oAuth2.0的四种模式(小结)的文章就介绍到这了,更多相关SpringSecurity oAuth2.0模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring Security Oauth2.0 实现短信验证码登录示例

    本文介绍了Spring Security Oauth2.0 实现短信验证码登录示例,分享给大家,具体如下: 定义手机号登录令牌 /** * @author lengleng * @date 2018/1/9 * 手机号登录令牌 */ public class MobileAuthenticationToken extends AbstractAuthenticationToken { private static final long serialVersionUID = SpringSecur

  • SpringSecurity oAuth2.0的四种模式(小结)

    目录 1.1. 授权码授权模式(Authorization code Grant) 1.1.1. 流程图 1.1.2. 授权服务器配置配置 1.1.3. 资源服务器配置 1.1.5. 使用场景 1.2. 隐式授权模式(Implicit Grant) 1.2.1. 流程图 1.2.2. 改动 authorizedGrantTypes 1.2.3. 操作步骤 1.2.4. 使用场景 1.3. 密码模式(Resource Owner Password Credentials Grant) 1.3.1.

  • 详解laravel passport OAuth2.0的4种模式

    参考: https://xueyuanjun.com/post/ 1... 熟悉的场景 某个网站,某用户未注册,注册时提示可微信账号登录(github, google都有类似 某网站是第三方(客户端), 认证服务器和资源服务器都在微信,资源是指微信的用户名,头像等 网站目的是获取改用户微信的账户,头像等,方便快速注册. 前提需要用户授权同意. laravel用passport搭建OAuth2认证服务 相当于基于laravel搭建OAuth2 Server. 资源拥有者: laravel serv

  • Springcloud+Mybatis使用多数据源的四种方式(小结)

    前段时间在做会员中心和中间件系统开发时,多次碰到多数据源配置问题,主要用到分包方式.参数化切换.注解+AOP.动态添加 这四种方式.这里做一下总结,分享下使用心得以及踩过的坑. 分包方式 数据源配置文件 在yml中,配置两个数据源,id分别为master和s1. spring: datasource: master: jdbcUrl: jdbc:mysql://192.168.xxx.xxx:xxxx/db1?......... username: xxx password: xxx drive

  • springboot集成websocket的四种方式小结

    目录 1. 原生注解 2. Spring封装 3. TIO STOMP Session 共享的问题 如何选择 其它 参考链接 1. 原生注解 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> WebSocketConfi

  • Android 访问文件权限的四种模式介绍

    Linux文件的访问权限 * 在Android中,每一个应用是一个独立的用户 * drwxrwxrwx * 第1位:d表示文件夹,-表示文件 * 第2-4位:rwx,表示这个文件的拥有者(创建这个文件的应用)用户对该文件的权限 * r:读 * w:写 * x:执行 * 第5-7位:rwx,表示跟文件拥有者用户同组的用户对该文件的权限 * 第8-10位:rwx,表示其他用户组的用户对该文件的权限 openFileOutput的四种模式 * MODE_PRIVATE:-rw-rw---- * MOD

  • VirtualBox虚拟机网络设置四种模式详细说明

    VirtualBox的提供了四种网络接入模式,它们分别是: 1.NAT 网络地址转换模式(NAT,Network Address Translation) 2.Bridged Adapter 桥接模式 3.Internal 内部网络模式 4.Host-only Adapter 主机模式 第一种 NAT模式  NAT模式是最简单的实现虚拟机上网的方式,你可以这样理解:Vhost访问网络的所有数据都是由主机提供的,vhost并不真实存在于网络中,主机与网络中的任何机器都不能查看和访问到Vhost的存

  • 使用python实现回文数的四种方法小结

    回文数就是指整数倒过来和原整数相等. Example 1: Input: 121 Output: true Example 2: Input: -121 Output: false Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome. Example 3: Input: 10 Output: false Expla

  • Spring中集成Groovy的四种方式(小结)

    groovy是一种动态脚本语言,适用于一些可变.和规则配置性的需求,目前Spring提供ScriptSource接口,支持两种类型,一种是 ResourceScriptSource,另一种是 StaticScriptSource,但是有的场景我们需要把groovy代码放进DB中,所以我们需要扩展这个. ResourceScriptSource:在 resources 下面写groovy类 StaticScriptSource:把groovy类代码放进XML里 DatabaseScriptSour

  • Java 数组转List的四种方式小结

    目录 第一种方式(未必最佳):使用ArrayList.asList(strArray) 第二种方法(支持增删查改): 第三种方式(通过集合工具类Collections.addAll()方法(最高效)) 第四种方式通过JDK8的Stream流将3总基本类型数组转为List java数组转list误区 一.不能把基本数据类型转化为列表 二.asList方法返回的是数组的一个视图 第一种方式(未必最佳):使用ArrayList.asList(strArray) ​ 使用Arrays工具类Arrays.

  • Oracle 数据库启动过程的三阶段、停库四种模式详解

    目录 数据库的启动过程(3个台阶) 1.nomount 2.mount 3.open 数据库的启动过程(3个台阶) 1.nomount shutdown --> nomount startup nomount select status from v$instance; SQL> SQL> conn / as sysdba Connected to an idle instance. SQL> SQL> startup nomount ORACLE instance star

随机推荐