Oauth2使用postman登录获取token

这篇具有很好参考价值的文章主要介绍了Oauth2使用postman登录获取token。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Oauth2使用postman登录获取token

  1. 网关请求拦截-(CheckJwtFilter.java)

    package com.xiaoge.config;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.xiaoge.constant.GatewayConstant;
    import org.apache.commons.lang.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.gateway.filter.GatewayFilter;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.Ordered;
    import org.springframework.core.io.buffer.DataBuffer;
    import org.springframework.core.io.buffer.DataBufferFactory;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.server.reactive.ServerHttpRequest;
    import org.springframework.http.server.reactive.ServerHttpResponse;
    import org.springframework.util.CollectionUtils;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @Classname CheckJwtFilter
     * @Date 2022/3/20 下午4:49
     * @Created by xiaoge
     * @Description TODO
     */
    @Configuration
    public class CheckJwtFilter implements GlobalFilter, Ordered {
    
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        /**
         * 过滤请求, 判断是否有jwt, 有放行, 没拦截
         * @param exchange
         * @param chain
         * @return
         */
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            ServerHttpRequest request = exchange.getRequest();
    
            // 获取路径
            String path = request.getURI().getPath();
    
            // 判断该路径是否在放行路径中
            if (GatewayConstant.ALLOW_PATH.contains(path)) {
                return chain.filter(exchange);
            }
    
            // 判断该请求头中是否包含Authorization
            HttpHeaders headers = request.getHeaders();
            List<String> list = headers.get(GatewayConstant.AUTHORIZATION);
            if (!CollectionUtils.isEmpty(list)) {
                String token = list.get(0);
    
                if (StringUtils.isNotBlank(token)) {
                    String jwt = token.replace("bearer ", "");
    
                    if (StringUtils.isNotBlank(jwt)) {
                        // 看redis是否还有该token
                        Boolean hasKey = redisTemplate.hasKey(GatewayConstant.OAUTH_PREFIX + jwt);
    
                        if(hasKey) {
                            return chain.filter(exchange);
                        }
                    }
                }
    
            }
    
            // 这里就是没有 jwt 了,返回 401
            ServerHttpResponse response = exchange.getResponse();
            // 设置响应头
            response.getHeaders().add("content-type", "application/json;charset=utf-8");
            Map<String, Object> map = new HashMap<>();
            map.put("code", HttpStatus.UNAUTHORIZED.value());
            map.put("msg", "非法访问!");
    
            ObjectMapper objectMapper = new ObjectMapper();
    
            byte[] bytes = null;
            try {
                bytes = objectMapper.writeValueAsBytes(map);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
    
            DataBuffer buffer = response.bufferFactory().wrap(bytes);
            return response.writeWith(Mono.just(buffer));
    
        }
    
    
        /**
         * 执行顺序 越小越先 要比-1 小
         * @return
         */
        @Override
        public int getOrder() {
            return -2;
        }
    }
    
    
  2. 网关配置把获取到的token存入redis-(GatewayConfig.java)它是把我们访问网关的路由转发到授权微服务

    package com.xiaoge.config;
    
    import cn.hutool.json.JSONObject;
    import cn.hutool.json.JSONUtil;
    import com.xiaoge.constant.GatewayConstant;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.gateway.route.RouteLocator;
    import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import reactor.core.publisher.Mono;
    
    import java.time.Duration;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @Classname GatewayConfig
     * @Date 2022/3/20 下午5:18
     * @Created by xiaoge
     * @Description TODO
     */
    @Configuration
    public class GatewayConfig {
    
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        /**
         * 描述: 给授权专门做的存入 token 路由
         *
         * @param builder:
         * @return org.springframework.cloud.gateway.route.RouteLocator */
        @Bean
        public RouteLocator routeLocator(RouteLocatorBuilder builder) {
            return builder .routes()
                    .route("auth-server-router", r -> r.path("/oauth/**")
                            .filters(f -> f.modifyResponseBody(String.class, String.class, (exchanges, s) -> {
                                String path = exchanges.getRequest().getURI().getPath();
                                if ("/oauth/token".equals(path)) {
                                    //如果是登录的请求,那么得到的 s 就是 token 的一套
                                    JSONObject jsonObject = JSONUtil.parseObj(s);
    
                                    // 判断jsonObject 是否包含access_token
                                    if (jsonObject.containsKey("access_token")) {
                                        //如果包含 access_token 就放进 redis 里面
                                        // token值
                                        String access_token = jsonObject.getStr("access_token");
                                        // 过期时间
                                        Long expires_in = jsonObject.getLong("expires_in");
    
                                        // 存入redis中
                                        redisTemplate.opsForValue().set(GatewayConstant.OAUTH_PREFIX + access_token, "", Duration.ofSeconds(expires_in));
                                    }
                                }
                                return Mono.just(s);
                            })).uri("lb://auth-server"))
                    .build();
    
        }
    }
    
  3. 授权服务认证配置-(AuthorizationConfig.java)

    package com.xiaoge.config;
    
    import com.xiaoge.service.impl.UserDetailsServiceImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.security.authentication.AuthenticationManager;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
    import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
    import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
    import org.springframework.security.oauth2.provider.token.TokenStore;
    import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
    import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
    import org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory;
    
    import java.security.KeyPair;
    
    /**
     * @Author: ZhangXiao
     * @DateTime: 2022/4/7 15:59
     * @Description:
     * 1. token的存储
     * 2. jwt的转换器
     * 3. 第三方应用
     * 4. endpoints暴露
     */
    @Configuration
    public class AuthorizationConfig extends AuthorizationServerConfigurerAdapter {
    
        @Autowired
        private PasswordEncoder passwordEncoder;
    
        @Autowired
        private AuthenticationManager authenticationManager;
    
        @Autowired
        private UserDetailsServiceImpl userDetailsService;
    
        /**
         * 使用 jwt 存放 token
         * @return
         */
        @Bean
        public TokenStore tokenStore() {
            return new JwtTokenStore(jwtAccessTokenConverter());
        }
    
    
        /**
         * 使用非对称加密的方式
         * @return
         */
        @Bean
        public JwtAccessTokenConverter jwtAccessTokenConverter() {
            JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
            // 把私钥读到内存中
            ClassPathResource resource = new ClassPathResource("cxs-jwt.jks");
            // 创建一个钥匙工厂
            KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource,"cxs123".toCharArray());
            // 获取钥匙, 传入钥匙别名
            KeyPair privateKey = keyStoreKeyFactory.getKeyPair("cxs-jwt");
            // 设置进转换器里面
            jwtAccessTokenConverter.setKeyPair(privateKey);
            return jwtAccessTokenConverter;
        }
    
    
        /**
         * 配置第三方应用
         * password 只要是登录都用这个授权方式
         * 客户端授权 用于微服务之间自发的进行远程调用时 资源服务器必须要token的情况, 当然也是可以放行服务提供者的接口的
         *
         *
         * 描述: 一个 web 平台,用于第三方访问
         * 一个 sxt 平台,内部访问的,例如 mq 里发起远程调用
         * @param clients
         * @throws Exception
         */
        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            clients.inMemory() // 配置第三方引用
                        .withClient("web") // 浏览器
                        .secret(passwordEncoder.encode("web-secret")) // 密码加密方式
                        .scopes("all")  // 作用域
                        .authorizedGrantTypes("password") // 授权类型 密码授权
                        .accessTokenValiditySeconds(7200) // token的时间7200秒
                        .redirectUris("https://www.baidu.com") // token过期从定向地址
                        .and() // 上面是密码授权方式, 下面是客户端授权
                        .withClient("client") // 微服务之间自发的调用
                        .secret(passwordEncoder.encode("client-secret")) // 密码加密方式
                        .scopes("read") // 只读 业务方面的一个配置
                        .authorizedGrantTypes("client_credentials") // 授权类型  客户端授权
                        .accessTokenValiditySeconds(Integer.MAX_VALUE) // token过期时间 66年
                        .redirectUris("https://www.baidu.com");  // token过期从定向地址
    
        }
    
    
        /**
         * 暴露出去
         * @param endpoints
         * @throws Exception
         */
        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            endpoints
                    .userDetailsService(userDetailsService)  // 暴露密码登录实现类
                    .authenticationManager(authenticationManager) // 暴露密码登录需要的认证管理器
                    .tokenStore(tokenStore())  // 暴露tokenStore
                    .accessTokenConverter(jwtAccessTokenConverter()); // 暴露jwt转换器
            super.configure(endpoints);
        }
    
    }
    
  4. 授权服务安全配置-(WebSecurityConfig.java)

    package com.xiaoge.config;
    
    import com.xiaoge.service.impl.UserDetailsServiceImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.authentication.AuthenticationManager;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    /**
     * @Author: ZhangXiao
     * @DateTime: 2022/4/7 15:56
     * @Description:
     */
    @Configuration
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Autowired
        private UserDetailsServiceImpl userDetailsService;
    
        /**
         * 认证管理器 密码登录需要认证管理器
         * @return
         * @throws Exception
         */
        @Bean
        public AuthenticationManager authenticationManager() throws Exception {
            return super.authenticationManager();
        }
    
    
        /**
         * 走自己的登录 密码登录需要的
         * @param auth
         * @throws Exception
         */
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            //走自己的登录
            auth.userDetailsService(userDetailsService);
        }
    
    }
    
  5. 授权服务登录-(UserDetailsServiceImpl.java)

    package com.xiaoge.service.impl;
    
    import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    import com.xiaoge.constant.AuthConstant;
    import com.xiaoge.domain.SysUser;
    import com.xiaoge.mapper.SysUserMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.stereotype.Service;
    import org.springframework.util.CollectionUtils;
    import org.springframework.util.ObjectUtils;
    import org.springframework.util.StringUtils;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.List;
    
    /**
     * @Author: ZhangXiao
     * @DateTime: 2022/4/7 16:10
     * @Description:
     */
    @Service
    public class UserDetailsServiceImpl implements UserDetailsService {
    
        @Autowired
        private SysUserMapper sysUserMapper;
    
        /**
         * 登录方法
         * @param username
         * @return
         * @throws UsernameNotFoundException
         */
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            // 获取request
            ServletRequestAttributes requestAttributes =  (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = requestAttributes.getRequest();
    
            // 获取请求头信息
            String loginType = request.getHeader(AuthConstant.LOGIN_TYPE);
    
            if (StringUtils.isEmpty(loginType)) {
                return null;
            }
    
            // 选择
            switch (loginType) {
                case AuthConstant.SYS_USER:
                    // 后台用户 就查后台的sys_user表
                    SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(
                            SysUser::getUsername, username
                    ));
    
                    if (!ObjectUtils.isEmpty(sysUser)) {
                        // 查询权限
                        List<String> auths = sysUserMapper.findUserAuthsById(sysUser.getUserId());
    
                        if (!CollectionUtils.isEmpty(auths)) {
                            // 设置权限
                            sysUser.setAuths(auths);
                        }
                    }
                    return sysUser;
                case AuthConstant.MEMBER:
                    // 前台用户
                    return null;
                default:
                    return null;
    
            }
        }
    }
    
  6. 授权服务启动类-(AuthServerApplication.class) (一定要加这个认证注解EnableAuthorizationServer, 因为WebSecurityConfig配置了认证管理器)

    package com.xiaoge;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
    
    /**
     * @Author: ZhangXiao
     * @DateTime: 2022/4/7 15:36
     * @Description:
     */
    @SpringBootApplication
    @EnableAuthorizationServer // 开启授权服务器
    @EnableEurekaClient  // 开启eureka客户端
    @MapperScan(basePackages = "com.xiaoge.mapper")
    public class AuthServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(AuthServerApplication.class, args);
        }
    
    
        /**
         * 密码加密器
         * @return
         */
        @Bean
        public PasswordEncoder passwordEncoder(){
            return new BCryptPasswordEncoder();
        }
    
    }
    
  7. postman-Authorization(web web-secret grant_type(认证方式)是AuthorizationConfig类中配置的)
    Oauth2使用postman登录获取token
    Oauth2使用postman登录获取token
    源码地址:https://gitee.com/xiaogectwbq/ego-shop-cloud文章来源地址https://www.toymoban.com/news/detail-400303.html

到了这里,关于Oauth2使用postman登录获取token的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • SpringBoot3.0 + SpringSecurity6.0 +OAuth2 使用Github作为授权登录

    SpringBoot3.0 + SpringSecurity6.0 +OAuth2 使用Github作为授权登录

    1.1 OAuth是什么 开放授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供

    2024年02月11日
    浏览(13)
  • 【OAuth2系列】Spring Cloud Gateway 作为OAuth2 Client接入第三方单点登录代码实践

    【OAuth2系列】Spring Cloud Gateway 作为OAuth2 Client接入第三方单点登录代码实践

            在年初的时候我参与了一个项目,当时是很多家公司协同完成这个项目,其中一个公司专门负责登录这块的内容,需要我们的后端接入他们的单点登录(OAuth2 授权码模式),这块接入工作是由我来负责,我们的项目是微服务架构,经过网上各种查阅资料发现网关作为

    2024年02月04日
    浏览(15)
  • Python oauth2登录Outlook读取邮件

    Python oauth2登录Outlook读取邮件

    微软登录方式发生了改变,需要用 oauth2 ,以前的写的脚本都登录不上了,本文记录下更新后的登录方式。 报错如下: imaplib.IMAP4.error: b’LOGIN failed.’ 1.在Azure 门户注册应用程序 这里可以跟着官方教程走 传送门:https://learn.microsoft.com/zh-cn/azure/active-directory/develop/web-app-quicks

    2024年02月04日
    浏览(16)
  • 如何通过OAuth2.0完成Microsoft平台登录验证

    如何通过OAuth2.0完成Microsoft平台登录验证

    参考内容: OAuth2 in Python | TestDriven.io 代表用户获取访问权限 - Microsoft Graph | Microsoft Learn OAuth 2.0 Bearer Token Usage 首先需要了解的是,通过Microsoft平台做身份验证,有一些配置时拿到的参数不可或缺(在身份验证的步骤中会用到,不一定是同一个步骤用到),其中包括: client_id:

    2024年02月09日
    浏览(17)
  • Spring Security oauth2.0微信小程序登录

    Spring Security oauth2.0微信小程序登录

    微信小程序前期开发准备,可以参考这篇文章微信小程序前期准备 1、学习过Spring Secrity oauth2.0的都知道,他有四种登录模式可以选择 authorization code(授权码模式) implicit(简化模式) resource owner password credentials(密码模式) client credentials(客户端模式) 前三种模式都需要用

    2024年02月10日
    浏览(13)
  • 自定义OAuth2组件实现对授权码登录模式的封装

    所谓OAuth2其实就是Open Authorization,即开放授权,是一种授权机制或者说是一种协议。 OAuth2允许用户授权第三方应用访问其存储在开放平台(授权服务器)中的数据而不需要提供密码 。授权服务器根据OAuth2协议标准制订一套授权的API,第三方网站接入开放平台之后即可通过其

    2024年02月05日
    浏览(11)
  • Spring-Security+OAuth2+redis实现密码登录

    一、OAuth2认证模式         一共四种认证方式,授权码模式、密码模式、简化模式和客户端模式。实现单点登录,比较流行的方法是使用jwt方式,jwt是无状态的,其本身就能携带信息,因此服务端可以不用保存他的信息,但只要token不过期,用户就可以一直访问,这样就无

    2024年02月16日
    浏览(13)
  • 手摸手接入Github实现Oauth2第三方登录

    手摸手接入Github实现Oauth2第三方登录

    最近在学习oauth2授权登录流程,oauth2简单来说就是接入第三方应用(qq、微信、github、gitee等),不用在本站登录,而是去请求第三方应用的用户信息完成登录。 下面就一起来看一下如何接入github实现第三方登录 首先,我们需要在github中添加OAuth App,登录你的github(如果还有

    2024年02月04日
    浏览(18)
  • 【springboot+vue项目(十五)】基于Oauth2的SSO单点登录(二)vue-element-admin框架改造整合Oauth2.0

    【springboot+vue项目(十五)】基于Oauth2的SSO单点登录(二)vue-element-admin框架改造整合Oauth2.0

    Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架,提供了丰富的组件和功能,可以帮助开发者快速搭建现代化的后台管理系统。 vue-element-admin/   |-- build/                          # 构建相关配置文件   |    |-- build.js                   # 生产环境构建脚本

    2024年02月20日
    浏览(17)
  • Spring Boot整合OAuth2实现GitHub第三方登录

    Github OAuth 第三方登录示例 第三方登录的原理是借助OAuth授权来实现,首先用户先向客户端提供第三方网站的数据证明自己的身份获取授权码,然后客户端拿着授权码与授权服务器建立连接获得一个Access Token,之后客户端就可以通过Access Token来与资源服务器进行交互。 使用O

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包