安全框架--OAuth2

上一篇 <<<安全框架--JWT
下一篇 >>>安全架构整体设计方案


OAuth2.0: 不是一们技术,而是一种协议,开放授权协议。

应用场景

第三方联合登陆 微信、QQ、支付宝、钉钉、码云、github底层都是会遵循oauth2.0协议。

OAuth2认证和授权的过程

安全框架--OAuth2_第1张图片

1)、用户访问第三方网站网站,想对用户存放在服务商的某些资源进行操作。
2)、第三方网站向服务商请求一个临时令牌。
3)、服务商验证第三方网站的身份后,授予一个临时令牌。
4)、第三方网站获得临时令牌后,将用户导向至服务商的授权页面请求用户授权,然后这个过程中将临时令牌和第三方网站的返回地址发送给服务商。
5)、用户在服务商的授权页面上输入自己的用户名和密码,授权第三方网站访问所相应的资源。
6)、授权成功后,服务商将用户导向第三方网站的返回地址。
7)、第三方网站根据临时令牌从服务商那里获取访问令牌。
8)、服务商根据令牌和用户的授权情况授予第三方网站访问令牌。
9)、第三方网站使用获取到的访问令牌访问存放在服务商的对应的用户资源。

安全框架--OAuth2_第2张图片

OAuth认证和授权的原理

  • a.根据appid和appkey 获取授权码
  • b.根据授权码获取accesstoken和refreshToken
  • c.根据accessToken获取openid
  • d.根据openid获取用户信息
  • e.使用refreshToken定时刷新accessToken

Oauth2角色划分

  • a、Resource Server:被授权访问的资源
  • b、Authotization Server:OAUTH2认证授权中心
  • c、Resource Owner: 用户
  • d、Client:使用API的客户端(如Android 、IOS、web app)

Oauth2四种授权方式

1)、授权码模式(authorization code)用在客户端与服务端应用之间授权
2)、简化模式(implicit)用在移动app或者web app(这些app是在用户的设备上的,如在手机上调起微信来进行认证授权)
3)、密码模式(resource owner password credentials)应用直接都是受信任的(都是由一家公司开发的)
4)、客户端模式(client credentials)用在应用API访问

Oauth2令牌存放方式

  • 1)、db
  • 2)、memory

代码演示

在Spring Cloud需要使用oauth2来实现多个微服务的统一认证授权,通过向OAUTH服务发送某个类型的grant type进行集中认证和授权,从而获得access_token,而这个token是受其他微服务信任的
Spring Cloud oauth2 需要依赖Spring security
认证中心

a、获得授权码

请求:http://localhost:8080/oauth/authorize?client_id=jarye_appid&response_type=code
返回:http://www.jarye.cn/callback?code=w111vA
安全框架--OAuth2_第3张图片
授权操作

b、根据授权码获取令牌


安全框架--OAuth2_第4张图片
获得令牌信息

c、令牌的有效性验证


安全框架--OAuth2_第5张图片
令牌有效性验证

资源中心

a、直接请求报错


安全框架--OAuth2_第6张图片
直接请求报错

b、加上令牌信息访问正常


安全框架--OAuth2_第7张图片
加上令牌访问正常

核心代码

认证中心配置

/*
当前项目为认证授权中心
 */
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
    //允许表单提交 检查accessToken是否有效期的情况下
    security.allowFormAuthenticationForClients()
            .checkTokenAccess("permitAll()");
}

/**
 * 分配我们的appid和appkey clentid clientkey
 *
 * @param clients
 * @throws Exception
 */
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    // 读数据库
    clients.inMemory()
            // appid
            .withClient("jarye_appid")
            .secret(passwordEncoder.encode("jarye_pwd"))
            // 授权码
            .authorizedGrantTypes("authorization_code")
            // 作用域 表示所有的接口都可以访问 分配我们的appid 调用接口的权限
            .scopes("all")
            // 资源ID
            .resourceIds("jarye_resource")
            // 用户选择授权之后,跳转到该地址传递code授权码
            .redirectUris("http://www.jarye.cn/callback");
}

资源中心

/**
* 功能描述:远程令牌校验的服务
*/
@Primary
@Bean
public RemoteTokenServices remoteTokenServices() {
    final RemoteTokenServices tokenServices = new RemoteTokenServices();
    //设置授权服务器check_token端点完整地址
    tokenServices.setCheckTokenEndpointUrl("http://localhost:8080/oauth/check_token");
    //设置客户端id与secret,注意:client_secret值不能使用passwordEncoder加密!
    tokenServices.setClientId(appId);
    tokenServices.setClientSecret(appSecret);
    return tokenServices;
}

/**
* 功能描述:配置授权信息
*/
@Override
public void configure(HttpSecurity http) throws Exception {
    //设置创建session策略
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
    //@formatter:off
    //所有请求必须授权
    http.authorizeRequests()
            .anyRequest().authenticated();
    //@formatter:on
}

/**
* 功能描述:配置资源信息
*/
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
    resources.resourceId("jarye_resource").stateless(true);
}

相关文章链接:
<< << << << << << << <<<安全技术--数据加密/认证技术
<<<安全技术--Https相关知识
<<<安全技术--接口幂等性设计
<<<安全框架--SpringSecurity
<<<安全框架--JWT
<<<安全架构整体设计方案

你可能感兴趣的:(安全框架--OAuth2)