精华内容
下载资源
问答
  • oauth2

    2019-01-24 22:38:29
    Oauth2 1.第三方认证介绍: 当需要访问第三方系统的资源时,由第三方系统认证通过后,在对用户进行授权 2.oauth2介绍: oauth协议2.0版本,1.0版本操作非常复杂;oauth是一个第三方安全认证协议 3.oauth授权模式: 授权...
    Oauth2
    1.第三方认证介绍:
    	当需要访问第三方系统的资源时,由第三方系统认证通过后,在对用户进行授权
    2.oauth2介绍:
    	oauth协议2.0版本,1.0版本操作非常复杂;oauth是一个第三方安全认证协议
    3.oauth授权模式:
    	授权码模式,密码模式,隐式授权模式,客户端模式
    4.oauth2授权码模式流程:
    * 浏览器客户端请求第三方认证服务器认证
    	用户在浏览器客户端点击微信/QQ登录
    * 资源拥有者(用户)允许对浏览器客户端授权
    	用户登录成功后,第三方认证服务器询问用户,是否允许对浏览器客户端授权
    * 第三方认证服务器响应授权码给浏览器客户端
    	用户同意授权,第三方认证服务器就会响应一个授权码到客户端,并拼接在url后面
    * 浏览器客户端携带授权码向第三方认证服务器申请token令牌,认证服务器校验授权码合法性,使用私钥将用户信
    息加密成令牌,并响应令牌给客户端(主要使用openid,openid = 用户微信号 + appid)
    	将用户信息保存在第三方资源服务器,key是令牌id,value是用户信息;并将令牌作为头信息,保存在客户端浏
    览器中
    * 浏览器携带token向本地服务器申请资源,本地服务器使用公钥解密token,查询数据库,获得用户的授权信息
    	本地数据库的权限表关联openid,使用公钥解密第三方认证系统的token,获取出openid;客户度请求本地服务器的资源,校验用户携带token的合法性,并返回数据给客户端浏览器
    5.jwt
    	JWT(json web token)是一种在通信双方传递json数据的规范;JWT包含三部分,每部分用点隔开,eg:aa.bb.cc;
    * header:{type:"jwt",alg:"hash算法"}
    * Payload:负载,携带数据,{id:"1",name:"张三"}
    * signature:签名,使用base64url将header和payload进行编码,防止内容被篡改
    
      使用私钥对JWT数据加密,使用公钥解密出JWT数据
    springboottest如果测试类的包无法被引导类扫描,@SpringBootTest(classes=Applicaiton.class)
    
    Oauth2授权码模式
    1.申请授权码
    get==> localhost:40400/auth/oauth/authorize?client_id=XcWebApp&response_type=code&scop=app&redirect_uri=http://localhost
    client_id:客户端id,和授权配置类中设置的客户端id一致。
    response_type:授权码模式固定为code
    scop:客户端范围,和授权配置类中设置的scop一致。
    redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)
    2.申请令牌
    post==> http://localhost:40400/auth/oauth/token
    请求体参数:
    grant_type:授权类型,填写authorization_code,表示授权码模式
    code:授权码,就是刚刚获取的授权码,注意:授权码只使用一次就无效了,需要重新申请。
    redirect_uri:申请授权码时的跳转url,一定和申请授权码时用的redirect_uri一致。
    此链接需要使用 http Basic认证。
    响应体数据:
    access_token:访问令牌,携带此令牌访问资源
    token_type:有MAC Token与Bearer Token两种类型,两种的校验算法不同,RFC 6750建议Oauth2采用 Bearer (空格) access_token
    refresh_token:刷新令牌,使用此令牌可以延长访问令牌的过期时间。
    expires_in:过期时间,单位为秒。
    scope:范围,与定义的客户端范围一致
    
    3.受保护本地资源的配置
    @Configuration
    @EnableResourceServer
    @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)//激活方法上的PreAuthorize注解
    public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    
        //公钥
        private static final String PUBLIC_KEY = "publickey.txt";
    
        //定义JwtTokenStore,使用jwt令牌
        @Bean
        public TokenStore tokenStore(JwtAccessTokenConverter jwtAccessTokenConverter) {
            return new JwtTokenStore(jwtAccessTokenConverter);
        }
    
        //定义JJwtAccessTokenConverter,使用jwt令牌
        @Bean
        public JwtAccessTokenConverter jwtAccessTokenConverter() {
            JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
            converter.setVerifierKey(getPubKey());
            return converter;
        }
        /**
         * 获取非对称加密公钥 Key
         * @return 公钥 Key
         */
        private String getPubKey() {
            Resource resource = new ClassPathResource(PUBLIC_KEY);
            try {
                InputStreamReader inputStreamReader = new InputStreamReader(resource.getInputStream());
                BufferedReader br = new BufferedReader(inputStreamReader);
                return br.lines().collect(Collectors.joining("\n"));
            } catch (IOException ioe) {
                return null;
            }
        }
        //Http安全配置,对每个到达系统的http请求链接进行校验
        @Override
        public void configure(HttpSecurity http) throws Exception {
            //所有请求必须认证通过
            http.authorizeRequests()
                    //下边的路径放行
                    .antMatchers("/v2/api-docs", "/swagger-resources/configuration/ui",
                            "/swagger-resources","/swagger-resources/configuration/security",
                            "/swagger-ui.html","/webjars/**").permitAll()
                    .anyRequest().authenticated();
        }
        //swagger-ui页面虽然可以访问,但是接口方法依然会被拒绝
    }
    4.依赖
     <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-oauth2</artifactId>
    </dependency>
    
    
    Oauth2密码模式
    1.直接申请令牌
    post请求==>   http://localhost:40400/auth/oauth/token
    请求参数:
    grant_type:密码模式授权填写password
    username:账号
    password:密码
    并且此链接需要使用 http Basic认证。
    响应数据:
    exp:过期时间,long类型,距离1970年的秒数(new Date().getTime()可得到当前时间距离1970年的毫秒数)。
    user_name: 用户名
    client_id:客户端Id,在oauth_client_details中配置
    scope:客户端范围,在oauth_client_details表中配置
    jti:与令牌对应的唯一标识
    companyId、userpic、name、utype、id:这些字段是本认证服务在Spring Security基础上扩展的用户身份信息
    
    展开全文
  • OAUTH2

    2019-07-26 19:02:49
    1.什么是OAuth2 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth...

    1.什么是OAuth2

     

    OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。

    2.应用场景

    第三方应用授权登录:在APP或者网页接入一些第三方应用时,时长会需要用户登录另一个合作平台,比如QQ,微博,微信的授权登录。

     

    原生app授权:app登录请求后台接口,为了安全认证,所有请求都带token信息,如果登录验证、请求后台数据。

    前后端分离单页面应用(spa):前后端分离框架,前端请求后台数据,需要进行oauth2安全认证,比如使用vue、react后者h5开发的app。

    3.名词定义

    (1) Third-party application:第三方应用程序,本文中又称"客户端"(client),比如打开知乎,使用第三方登录,选择qq登录,这时候知乎就是客户端。

    (2)HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上例的qq。

    (3)Resource Owner:资源所有者,本文中又称"用户"(user),即登录用户。

    (4)User Agent:用户代理,本文中就是指浏览器。

    (5)Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。

    (6)Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

    4.运行流程

    (A)用户打开客户端以后,客户端要求用户给予授权。

    (B)用户同意给予客户端授权。

    (C)客户端使用上一步获得的授权,向认证服务器申请令牌。

    (D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

    (E)客户端使用令牌,向资源服务器申请获取资源。

    (F)资源服务器确认令牌无误,同意向客户端开放资源。

    5.四种授权模式

    授权码模式(authorization code)

    简化模式(implicit)

    密码模式(resource owner password credentials)

    客户端模式(client credentials)

    6.授权码模式

    授权码模式(authorization code)是功能最完整、流程最严密的授权模式。

    (1)用户访问客户端,后者将前者导向认证服务器,假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

    (2)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向页面链接。请求成功返回code授权码,一般有效时间是10分钟。

    (3)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向页面链接。请求成功返回access Token和refresh Token。

    7.简化模式Implicit

    适用于公开的浏览器单页应用

    Access Token直接从授权服务器返回(只有前端渠道)

    不支持refresh tokens

    假定资源所有者和公开客户应用在同一个设备上

    最容易受安全攻击

    8.用户名密码 Resource Owner Credentials

    使用用户名密码登录的应用,例如桌面App

    使用用户名/密码作为授权方式从授权服务器上获取access token

    一般不支持refresh token

    假定资源拥有者和公开客户子啊相同设备上

     

    9.客户端凭证 Client Credentials

    适用于服务器见通信场景,机密客户代表它自己或者一个用户

    只有后端渠道,使用客户凭证获取一个access token

    因为客户凭证可以使用对称或者非对称加密,该方式支持共享密码或者证书

     

    展开全文
  • OAuth2

    2014-04-25 11:46:56
    最近对OAuth2进行了研究,官网地址:http://oauth.net/2/ 发现支持java的有好多个,综合考虑最终选择了Spring Security for OAuth wiki地址:...spring-security-oauth2-2.0.0.B...
    最近对OAuth2进行了研究,官网地址:http://oauth.net/2/
    发现支持java的有好多个,综合考虑最终选择了Spring Security for OAuth
    wiki地址:https://github.com/spring-projects/spring-security-oauth/wiki/oAuth2

    spring-security-oauth2-2.0.0.BUILD-SNAPSHOT.jar中比较重要的地方
    一、org.springframework.security.oauth2.config.xml这个包主要用来解析配置文件
    1.AuthorizationServerBeanDefinitionParser授权服务器
    2.ResourceServerBeanDefinitionParser资源服务器

    二、org.springframework.security.oauth2.provider.endpoint这个包主要用来提供服务
    1.AuthorizationEndpoint主要是用来获取code。当然如果支持ImplicitGrant,也可以直接获取token,适用于无Server应用。
    2.TokenEndpoint主要是用来获取token。当然如果支持RefreshToken,也可以用来当token过期后使用该接口刷新token。

    三、org.springframework.security.oauth2.common.exceptions这个包列出了OAuth2中所有可能产生的异常类型以及序列化反序列化
    1.OAuth2Exception定义了OAuth2中的所有异常情况
    2.OAuth2ExceptionJackson1Serializer异常序列化类,需要扩展自定义其他一些异常情况

    四、filter
    1.org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter验证登陆用户信息2.org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter验证客户端信息
    展开全文
  • springboot2整合oauth2

    万次阅读 多人点赞 2018-06-15 14:10:09
    1.背景 项目由springboot1.5.X升级到...完整项目demo:https://gitee.com/zkane/springboot2-oauth2.git 2.spring security Spring Security 从入门到进阶系列教程网址:http://www.spring4all.com/ar...

    1.背景

    项目由springboot1.5.X升级到springboot2.0.0后,导致各组件API以及依赖包发生了变化。

    完整项目demo:码云

    2.spring security

    Spring Security 从入门到进阶系列教程网址:http://www.spring4all.com/article/428

    • spring security架构图
      在这里插入图片描述
    • 认证过程
      [外链图片转存失败(img-Z2J4Yur9-1567653136510)(https://gitee.com/uploads/images/2018/0419/105052_53ea1406_1305332.png "屏幕截图.png")]

    3.OAuth2

    • OAuth2基础概念网址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
    • OAuth2分为3个部分:1认证服务器2资源服务器3第三方应用
    • OAuth2有4种授权模式:1授权码模式2简化模式3密码模式4客户端模式

    4.使用springboot2+oauth2注意事项

    • 项目搭建参考网址:

    https://blog.csdn.net/qq_19671173/article/details/79748422

    http://wiselyman.iteye.com/blog/2411813

    4.1.在pom.xml文件中导入依赖包发生变化

            <!-- springboot2.0已经将oauth2.0与security整合在一起 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
            <!-- 由于一些注解和API从spring security5.0中移除,所以需要导入下面的依赖包  -->
            <dependency>
                <groupId>org.springframework.security.oauth.boot</groupId>
                <artifactId>spring-security-oauth2-autoconfigure</artifactId>
                <version>2.0.0.RELEASE</version>
            </dependency>
            <!-- redis相关依赖包 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-pool2</artifactId>
            </dependency>
    

    4.2.直接使用RedisTokenStore存储token会出现NoSuchMethodError RedisConnection.set([B[B)V错误

    解决方案:自己编写一个MyRedisTokenStore,复制RedisTokenStore类中代码,并将代码中conn.set(accessKey, serializedAccessToken)修改为conn.stringCommands().set(accessKey, serializedAccessToken);

    4.3.前后端分离时,存在跨域问题

    解决方案:

    • 方案一在后端注册corsFilter
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.Ordered;
    import org.springframework.web.cors.CorsConfiguration;
    import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    import org.springframework.web.filter.CorsFilter;
    
    @Configuration
    public class CorsConfig {
        private CorsConfiguration buildConfig() {
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            // 1
            corsConfiguration.addAllowedOrigin("*");
            // 2
            corsConfiguration.addAllowedHeader("*");
            // 3
            corsConfiguration.addAllowedMethod("*");
            corsConfiguration.setAllowCredentials(true);
            return corsConfiguration;
        }
    
        @Bean
        public FilterRegistrationBean corsFilter() {
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            // step 4
            source.registerCorsConfiguration("/**", buildConfig());
            FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
            bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
            return bean;
        }
    }
    
    • 方案二,在启动类添加bean到IOC容器中
    @SpringBootApplication
    public class ZuulServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ZuulServerApplication.class, args);
        }
    
        /**
         * 解决前后端分离跨域问题
         *
         * @return
         */
        @Bean
        public CorsFilter corsFilter() {
            final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            final CorsConfiguration config = new CorsConfiguration();
            config.setAllowCredentials(true);
            config.addAllowedOrigin("*");
            config.addAllowedHeader("*");
            config.addAllowedMethod("*");
            source.registerCorsConfiguration("/**", config);
            return new CorsFilter(source);
        }
    
    }
    

    4.4.前后端分离,登录页面放在前端时登录的问题

    解决方案:授权模式使用password的方式

    • 使用post请求访问http://localhost:20000/auth/oauth/token
    • 在请求的headers中新增一个header:key=Authorization,value=Basic Y2xpZW50OnNlY3JldA==

    (Y2xpZW50OnNlY3JldA==为64编码,格式:client:secret)

    • 在form-data中传递参数:username(用户账号)、password(用户密码)、grant_type(固定值:password)、scope(作用域)
      这里写图片描述

    4.5.访问资源服务器的方式

    • 当通过在认证服务器获取到token后,有三种方式访问资源服务器
    1. 在Headers中携带:key=Authorization,value=bearer 797c4200-8b10-4a2b-8764-33397749a8f7
    2. 拼接在URL中:http://localhost:8088/user?access_token=797c4200-8b10-4a2b-8764-33397749a8f7
    3. 在form表单中:name=access_token,value=797c4200-8b10-4a2b-8764-33397749a8f7

    4.6.spring security密码配置问题

    • secret密码配置从 Spring Security 5.0开始必须以 {加密方式}+加密后的密码 这种格式填写
    • 当前版本5新增支持加密方式:

    bcrypt - BCryptPasswordEncoder (Also used for encoding)

    ldap - LdapShaPasswordEncoder

    MD4 - Md4PasswordEncoder

    MD5 - new MessageDigestPasswordEncoder(“MD5”)

    noop - NoOpPasswordEncoder

    pbkdf2 - Pbkdf2PasswordEncoder

    scrypt - SCryptPasswordEncoder

    SHA-1 - new MessageDigestPasswordEncoder(“SHA-1”)

    SHA-256 - new MessageDigestPasswordEncoder(“SHA-256”)

    sha256 - StandardPasswordEncoder

    4.7.通过spring security的角色限制访问受保护的接口

    • 在配置类或启动类上添加注解 @EnableGlobalMethodSecurity(securedEnabled = true)
    @EnableOAuth2Sso
    @Configuration
    @EnableGlobalMethodSecurity(securedEnabled = true)
    public class SecurityConfig extends WebSecurityConfigurerAdapter{
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers("/index")
                    .permitAll()
                    .anyRequest()
                    .authenticated();
        }
    }
    
    • 在controller的类或方法上添加注解 @Secured(“ROLE_ADMIN”)
    package com.bici.controller;
    
    import org.springframework.security.access.annotation.Secured;
    import org.springframework.security.core.Authentication;
    import org.springframework.security.core.context.SecurityContextHolder;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.CrossOrigin;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    /**
     * @author: keluosi@bicitech.cn
     * @date: 2018/4/17
     */
    @RestController
    @RequestMapping("/client")
    @Secured("ROLE_ADMIN")
    public class ClientController {
    
        @GetMapping("/user")
        public Authentication getUser() {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            return authentication;
        }
    
        @GetMapping("/index")
        @Secured("ROLE_USER")
        public String index() {
            return "index";
        }
    }
    
    

    4.8.使用自定义的加密方式校验数据库中保存的加密后的密文

    • 在@EnableWebSecurity注解的方法中编写代码
    import com.bici.encrypt.EncryptUtil;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.authentication.AuthenticationManager;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.crypto.password.PasswordEncoder;
    
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
    
        @Qualifier("userDetailsService")
        @Autowired
        private UserDetailsService userDetailsService;
    
        @Override
        protected UserDetailsService userDetailsService() {
            // 自定义用户信息类
            return this.userDetailsService;
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService).passwordEncoder(new PasswordEncoder(){
                @Override
                public String encode(CharSequence charSequence) {
                    // 加密
                    return EncryptUtil.hashPasswordAddingSalt(charSequence.toString());
                }
                @Override
                public boolean matches(CharSequence charSequence, String s) {
                    // 密码校验
                    return EncryptUtil.isValidPassword(charSequence.toString(), s);
                }
            }) ;
        }
    }
    

    4.9.通过配置返回通知获取token

    可以在这个地方将token和username存入到缓存中,然后如果需要强制某个用户下线时,通过username从缓存中找到token,调用ConsumerTokenServicesrevokeToken(token)方法。

    package com.zkane.aspect;
    
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpRequest;
    import org.springframework.http.ResponseEntity;
    import org.springframework.security.core.Authentication;
    import org.springframework.security.core.context.SecurityContextHolder;
    import org.springframework.security.oauth2.common.OAuth2AccessToken;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * @author: 594781919@qq.com
     * @review:
     * @date: 2018/8/24
     */
    @Aspect
    @Component
    public class TokenAspect {
    
        @Pointcut("execution(* org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.postAccessToken(..))")
        private void token() {
        }
    
        @AfterReturning(returning = "obj", pointcut = "token()")
        public void doAfterReturning(ResponseEntity<OAuth2AccessToken> obj) throws Exception {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            // 打印用户名
            System.out.println(request.getParameter("username"));
            // 打印token
            System.out.println(obj.getBody().getValue());
        }
    }
    

    5.不足或后续改进

    5.1.客户端信息保存到数据中

    • 创建sql语句
    CREATE TABLE `oauth_client_details` (
      `client_id` varchar(256) NOT NULL,
      `resource_ids` varchar(256) DEFAULT NULL,
      `client_secret` varchar(256) DEFAULT NULL,
      `scope` varchar(256) DEFAULT NULL,
      `authorized_grant_types` varchar(256) DEFAULT NULL,
      `web_server_redirect_uri` varchar(256) DEFAULT NULL,
      `authorities` varchar(256) DEFAULT NULL,
      `access_token_validity` int(11) DEFAULT NULL,
      `refresh_token_validity` int(11) DEFAULT NULL,
      `additional_information` varchar(4096) DEFAULT NULL,
      `autoapprove` varchar(256) DEFAULT NULL,
      PRIMARY KEY (`client_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO oauth_client_details (
    	client_id,
    	resource_ids,
    	client_secret,
    	scope,
    	authorized_grant_types,
    	web_server_redirect_uri,
    	authorities,
    	access_token_validity,
    	refresh_token_validity,
    	additional_information,
    	autoapprove
    )
    VALUES
    	(
    		'client',
    		NULL,
    		'{noop}secret',
    		'all',
    		'password,authorization_code,refresh_token,implicit,client_credentials',
    		NULL,
    		NULL,
    		NULL,
    		NULL,
    		NULL,
    		'true'
    	);
    
    • 以jdbc方式配置客户端信息
    @Configuration
    @EnableAuthorizationServer
    public class ServerConfig extends AuthorizationServerConfigurerAdapter {
        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            clients.jdbc(dataSource);
        }
    }
    

    5.2.前后端分离,导致单点登录问题

    • 目前通过网上下载的demo,还没有查找到第三方应用前后端分离,怎么去登录的问题。
    • 第三方应用一般都是通过请求转发页面时,到认证中心去登录。也就是前后端未分离的情况,使用注解@EnableOAuth2Sso
    • 建议解决方案:通过前端进行跳转到唯一的登录页面,登录成功后再返回到原来系统并带上token

    5.3.密码错误时,返回前端的json未实现自定义返回内容

    {
        "error": "invalid_grant",
        "error_description": "Bad credentials"
    }
    

    update 2018-04-28

    自定义返回前端的登录错误信息

    • 将spring-security-core\5.0.3.RELEASE\org\springframework\security\messages_zh_CN.properties拷贝到resources目录下
    • 在启动类中编写代码
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        @Bean
        public ReloadableResourceBundleMessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:messages");
            return messageSource;
        }
    }
    
    • 显示效果,error_description是在messages_zh_CN.properties中自己根据需要编写的
    {
        "error": "invalid_grant",
        "error_description": "账号未注册,请联系管理员"
    }
    
    展开全文
  • OAuth2客户端: spring-boot-starter-security:2.1.2.RELEASE spring-security-oauth2-client:5.1.3.RELEASE OAuth2认证服务: spring-security-oauth2-autoconfigure:2.1.2.RELEASE 具体代码就不一一贴出来了...
  • Oauth2 Server 搭建Oauth2认证服务

    千次阅读 2019-02-26 15:17:58
    本教程源码 ... 源码写的比较全面,教程我就只介绍关键的代码了 关键词 微服务认证 Oauth2 认证中心 ... spring-cloud-starter-oauth2 集成Oauth2 Oauth2 客户端 ...Oauth2 server 的开发 (aiwan-w...
  • 参考链接: ...OAuth2简易实战(一)-四种模式:https://www.cnblogs.com/x-jingxin/p/11507819.html OAuth 2 Developers Guide【官网】:...Spring Cloud OAuth2
  • oauth2笔记

    万次阅读 2020-09-05 10:27:24
    【2】OAuth2四种授权模式 【3】Spring OAuth2.0 【4】springcloud-OAuth 2.0 配置 【5】生成rsa密钥对 【6】WebSecurityConfigurerAdapter和ResourceServerConfigurerAdapter的区别 【7】oauth 同一用户多端登录 【8...
  • 本文基于go-oauth2/oauth2,参考go-oauth2/oauth2/example、go-oauth2/gin-server、llaoj/oauth2,结合beego框架实现OAuth 2.0授权码方式。 介绍 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在...
  • OAuth2学习(一)——初识OAuth2

    万次阅读 多人点赞 2019-08-27 23:16:46
    今天我们来讲解一下OAuth2,在平时应用中我们经常能够见到它的身影。比如,当微信小程序获取你的用户名和头像时需要你授予权限,以及当我们在网站上使用微信或QQ登录时也是使用到了OAuth2。接下来我们便来讲解一下...
  • oauth2+JWT实现oauth2服务

    万次阅读 2018-12-27 10:34:37
    文章目录介绍实现功能开发步骤引用jar包认证服务器测试项目源码 ...返回的token是oauth2自生成的token。但有时候,我们希望能在token中加些参数,这时候我们可以用jwt生成token。关于什么是jwt的概念,笔者...
  • Spring Security oAuth2简介

    万次阅读 2020-02-20 17:00:50
    本章节的目的是帮助大家快速上手使用 Spring 提供的 Spring Security oAuth2 搭建一套验证授权及资源访问服务,帮助大家在实现企业微服务架构时能够有效的控制多个服务的统一登录、授权及资源保护工作 什么是 oAuth ...
  • OAuth2学习(二)——OAuth2实战

    千次阅读 2019-09-17 23:14:06
    在上一篇文章中我们讲解了OAuth2的一些基本概念,对OAuth2有了基本的认识。这一节内容我们就讲解一下OAuth2实战,围绕
  • Springsecurity-oauth2OAuth2AuthenticationProcessingFilter xym01 1 2019-02-24 19:38 Spring-security-oauth2的版本是2.0 如下图1所示,继承了Filter,还继承了InitializingBean,这个与SpringIOC有关,在...
  • spring oauth2

    千次阅读 2018-03-26 13:47:25
    Spring REST API 这一次使用的是 OAuth2,这篇文章简单介绍在一个 REST API 中使用 Spring OAuth2 需要什么。我们将使用两个不同的客户端[Postman和基于Java应用程序的Spring RestTemplate]来访问OAuth2保护...
  • Spring Security Oauth2 自定义 OAuth2 Exception

    万次阅读 热门讨论 2018-05-27 20:22:01
    在使用Spring Security Oauth2登录和鉴权失败时,默认返回的异常信息如下 { "error": "unauthorized", "error_description": "Full authentication is required to access ...
  • 工作中遇到一个比较蛋疼的情况,Oauth2人家的jar包封装的好好的,当access_token超时的时候,返回的是OAuth2Exception,格式是{"error":"invalid_request","error_description":"code:'401','msg'='Invalid access ...
  • OAuth2认证机制提供了四种方式,但是这四种方式的输入和输出都是一样的,输入都是clientid和clientsecret,输出都是token; 如果是自己的应用要使用这些资源,用client_credentials的方式, authorization code:...
  • nodejs Oauth2

    2018-09-13 14:26:52
    oauth2 服务端 express+passport+oauth2orize+session+mongodb+redis oauth2 客户端 express+client-oauth2   项目提供简单的oauth2服务端和客户端,以下是github项目地址   github 地址gitHub/yardstrong.....
  • JWT和OAUTH2,spring security oauth2 的区别

    千次阅读 2019-12-20 15:55:02
    JWT: 一个token的格式,JSON的字符串 OAUTH2: 定义token产生的客户端,授权服务器和资源服务器的动态交互过程,时序。...spring security oauth2: spring 框架的oauth2的实现。不同的框架的实现可能有些许差别。 ...
  • oauth2的简单实现

    千次阅读 2019-04-11 21:02:33
    Oauth2的学习总结   这段时间领导叫我学习oauth2准备一下,以后上spring cloud的时候可以上手就使用。陆陆续续学习了两周,三周还是更多,发现oauth2还是很复杂的。这篇文章就是想总结一下这段时间学习oauth2的...
  • springboot2集成oauth2

    2019-04-14 22:46:31
    最近拿oauth2练手,搭了oauth2的demo。 服务端配置 /** * oauth2配置 * @author hao * @Date 2018-04-19 */ public class OAuth2ServerConfig { /** * oauth2资源服务器配置 * @author kdlq-hao */ ...
  • Spring security oauth2最简单入门环境搭建--二、干货 博客分类:  OAuth2 spring security oauth入门配置oauth2教程  关于OAuth2的一些简介,见我的上篇blog:...
  • spring-security5 oauth 开箱既用,认证时返回的是oauth2 标准的返回值 先来看看,默认的返回值 ## 未认证 { "error": "unauthorized", "error_description": "Full authentication is required to access this...
  • angular-oauth2 详细介绍angular-oauth2 是 AngularJS 的 OAuth2 认证模块,使用 ES6 编写。使用方法:1. 引入 js 库:&lt;script src="bower_components/angular/angular.min.js"&gt;&lt...
  • 前言 ... 代码 在上面的代码上面,又加了一些常用的配置 资源服务配置 import ...import com.oauth2.server.system.init.oauth2.handler.MyAuthenticationSucessHa.
  • OAuth2 图解

    千次阅读 多人点赞 2020-06-11 11:09:42
    本文简单的描述出了 OAuth2 工作背景,看完后可以轻松理解 OAuth2 是用来解决什么问题的。 1. 用户有自己的数据 2. 有一个服务器,负责管理用户的数据。这个服务器被称为”Resource Server(资源服务器)“ 3. 有...
  • oauth2根据使用场景不同,分成了4种模式 授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentials) 客户端模式(client credentials) 授权...
  • OAuth1,OAuth2异同

    2019-04-04 17:02:52
    ##一、写在前面 在收集资料时,我查询和学习了许多介绍OAuth的文章,这些文章有好有坏...整理的内容分为OAuth1.0a和OAuth2两部分。 OAuth 1.0a:One Leg ->Two Leg -> Three Legged OAuth 2:Two Leg ->T...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,776
精华内容 15,510
关键字:

oauth2