,基于JWT和OAuth2.0应用接入第三方统一认证服务

简介: 一套应用服务,有自己的独立登录接口,独立认证服务(JWT认证),独立用户等,需要接入第三方的统一认证系统,实现用户统一登录;

需求描述:

一套应用服务,有自己的独立登录接口,独立认证服务(JWT认证),独立用户等,需要接入第三方的统一认证系统,实现用户统一登录;

需求分析:

实现统一用户和单点登录,需要是:

  • 首先用户同步,用户数量小,可以通过手动新建,然后和统一用户关联的方式;

    > 对于只有统一登录,不需要统一用户的,需要自动新建用户或关联已有用户
    
    • 其次是统一登录页面:可以保留自有登录页面,通过不同接口跳转到统一登录页面做验证;
  • jwt方式不提供统一登出服务;

需求实现说明

  1. 用户同步:先手动新建,或在登录时自动新建,或先同步用户信息;
  2. 提供登陆接口:在应用中提供一个新的登录接口(restful接口),跳转的统一登录页,在跳转过程中提供必要参数;
  3. 统一登录回调: 在应用中提供一个统一登录后的回调接口,用于验证是否登录成功;
  4. 生成应用JWT:在统一登录结果验证成功后,则生成应用中的jwt,放置到Cookie中,跳转到应用页面;
  5. 验证jwt: 在应用页面中验证jwt,jwt是应用生成,是可用的;

代码实现:

  • 用户同步:可用手动新建测试;
  • 提供登录跳转接口:

    Oauth2.0认证服务一般会提供一个登录地址:传递以下参数:

    一个登陆成功的回调地址redirectUri
    一个原值返回的参数state,一般会填写登录后的跳转页面
    统一认证系统应用的id和secret

以下代码提供了一个登录接口,跳转的统一登录页面,并携带指定参数;

public void login(HttpServletRequest request, HttpServletResponse response,String redirect_uri) {
        String contextPath = request.getContextPath();
        String redirectUri = serverUri + contextPath + "/api/authsuccess";
        //->/api/authsuccess是应用提供的验证地址
        logger.info("认证成功之后调转到目标地址为:redirectUri:{}", redirectUri);
        String url = UriComponentsBuilder.fromUriString(authorizeUrl).queryParam("app_id", clientId)
                    .queryParam("app_secret", clientSecret).queryParam("state", redirect_uri)
                    .queryParam("redirect_uri", redirectUri).build().encode().toUriString();
        response.sendRedirect(url);
        
    }
  • 在统一登录页面,用户输入用户名密码登录,通过成功后,回调应用上一步登录验证接口;
    用户登录成功,统一认证服务会保存应用系统的Session,在下次通过应用跳转其他系统时,会获取到这个session判断是否登录,若已登录,在不会出现登录窗口

    Oauth2.0一般情况下,会返回一个code给应用;
    应用接收code,通过统一登录接口,获取登录用户ID
    应用获取登录用户ID,生成JWTtoken
    将jwt_token放置到cookie中,跳转的指定页面
// state为上一步传递的参数
public void authenticate(HttpServletRequest request, HttpServletResponse response, String code,
            String state) {
    
        Map<String, Object> userInfo = getUserInfo(code); //获取用户信息
        String userId = (String) userInfo.get("username");
  
        String _jwt = generateToken(userId);
        String jwt_iss = (System.currentTimeMillis()/ 1000) + "";
        String jwt_expire = (30 * 1000) + "";
        Cookie jwt_cookie = new Cookie("_jwt", jwt);
        Cookie jwtActiveCookie = new Cookie("_jwt_active", jwt_iss );
        Cookie jwtExpireTimeCookie = new Cookie("_jwt_exp", jwt_expire );
        jwtCookie.setPath("/");
        jwtActiveCookie.setPath("/");
        jwtExpireTimeCookie.setPath("/");
        response.addCookie(jwtCookie);
        response.addCookie(jwtActiveCookie);
        response.addCookie(jwtExpireTimeCookie);
        response.sendRedirect(state);
}
  • 跳转后的页面为应用页面,在调用应用接口时,会验证jwt是否有效

接入完成;

其他接入方式,可能接口不同,但是流程应该大致相似;
在这里插入图片描述

相关文章
|
2月前
|
JSON JavaScript 数据格式
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能。
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能。
95 1
|
2月前
|
安全 Java Spring
Spring Security+jwt实现认证
Spring Security+jwt实现认证
|
2月前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
132 0
|
4天前
|
存储 算法 安全
JWT原理与在身份验证中的应用
JWT原理与在身份验证中的应用
|
1月前
|
存储 JSON API
在django3应用中使用现代的JWT鉴权
【6月更文挑战第8天】本文介绍流行的鉴权方式,JSON Web Tokens (JWT) 是一种验证JSON数据所有者的机制,它是一个编码的、安全的字符串,包含可信任的数据且能加密签名。无状态的令牌认证允许客户端存储令牌并将其在每次请求。
29 8
在django3应用中使用现代的JWT鉴权
|
27天前
|
消息中间件 Serverless Go
Serverless 应用引擎操作报错合集之通过自定义域名配置jwt认证,始终报错:"Code": "JWTTokenIsInvalid",是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5天前
|
存储 JSON 算法
JWT原理与在身份验证中的应用
JWT原理与在身份验证中的应用
|
2月前
|
存储 JSON JavaScript
session和JWT的应用及区别
在Node.js中实现登录认证,可以使用`express-session`进行Session管理。首先安装`express-session`,然后全局引入并配置。登录成功后,存储用户信息和登录状态至Session,之后可从Session中获取或销毁用户信息。另外,JWT(Json Web Token)也是一个选择。JWT包含header、payload和signauter三部分,通过`jsonwebtoken`包生成和解密Token,设置秘钥和过期时间。使用`express-jwt`进行解密,并配置全局错误处理中间件来处理无效Token的情况。
24 2
1天搞定SpringBoot+Vue全栈开发 (9)JWT跨域认证
1天搞定SpringBoot+Vue全栈开发 (9)JWT跨域认证
|
23天前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
37 0