WSO2 身份服务器 - Oauth 2.0 - Java 签核示例

2024-04-17

我为 Oauth2 身份验证流程编写了一个基于 Java 的签核例程(令牌撤销)。请参阅下面的代码实现,遵循手册中描述的 cURL 协议说明[here https://docs.wso2.com/display/IS500/OAuth+Token+Revocation+with+WSO2+Identity+Server]。程序代码编译并运行时不会出现错误消息,但注销后,用户帐户在 WSO2 仪表板查询下仍保持连接状态。

下面看触发注销功能的Servlet类:

class SignoffServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {

                try{
       String accessToken = (String) req.getSession().getAttribute("access_token"); 
       System.out.println("Start Logoff processing for revoke of the token: " + accessToken);
           URL url = new URL (Oauth2Server + "/oauth2/revoke?token="+accessToken); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection();
       // new encode with Apache codec (for Java8 use native lib) 
       String userCredentials = clientId + ":" + clientSecret;
       String basicAuth = "Basic " + new String(new Base64().encode(userCredentials.getBytes()));
       connection.setRequestProperty ("Authorization", basicAuth);
       connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");    
       connection.addRequestProperty("token", accessToken); 
       connection.addRequestProperty("token_type_hint", "access_token");
       //connection.setRequestProperty("token", accessToken); 
       // connection.setRequestProperty("token_type_hint", "access_token");
                   connection.setRequestMethod("POST");
                   connection.setDoOutput(true);
                   InputStream content = (InputStream)connection.getInputStream();
                   BufferedReader in   = 
                     new BufferedReader (new InputStreamReader (content));
                     String line;
                     while ((line = in.readLine()) != null) {
                         System.out.println(line);
                         System.out.println("Logoff finished sucessfully");
                         }
                    } catch(Exception e) {
                      System.out.println("Logoff failed, error cause: " + e.toString());
                      e.printStackTrace();
                    }
    System.out.println("Logoff finished sucessfully");
    // return the json of the user's basic info
    String html_header = "<html><body>"; 
    String myjson = "<br>Logoff completed sucessfully"; 
    myjson += "<br><br><b><a href='./index.html'>Back to login page</a></b><br>";
    String html_footer = "</body></html>";  
    String mypage = html_header + myjson + html_footer; 
    resp.setContentType("text/html");
    resp.getWriter().println(myjson);
}   

}

欢迎就如何更改 Java 代码以激活 Oauth 2.0 的签核功能提供建议。

感谢您详细解释 Oauth2 中授权和身份验证之间的区别。请参阅下面能够撤销有效 Oauth2 令牌的代码:

class SignoffServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {

    String outputl = "";        
                try{
       String accessToken = (String) req.getSession().getAttribute("access_token"); 
           // testing .. inhibu acivate this line:  // revoke accessToken = "abc";             
       System.out.println("Start Logoff processing for revoke of the token: " + accessToken);
           // URL url = new URL (Oauth2Server + "/oauth2/revoke?token="+accessToken); 
           // URL url = new URL (Oauth2Server + "/oauth2endpoints/revoke");
       URL url = new URL (Oauth2Server + "/oauth2/revoke");
       HttpURLConnection connection = (HttpURLConnection) url.openConnection();
       connection.setRequestMethod("POST");
       connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
       // new encode with Apache codec (for Java8 use native lib) 
       String userCredentials = clientId + ":" + clientSecret;
       String basicAuth = "Basic " + new String(new Base64().encode(userCredentials.getBytes()));
       basicAuth = basicAuth.replace("\\r", "");
       basicAuth = basicAuth.replace("\\n", "");
                   connection.setRequestProperty ("Authorization", basicAuth);
       connection.setUseCaches(false);
       connection.setDoInput(true);
       connection.setDoOutput(true);
       // send data     
           // String str =  "{\"token\": \"" + accessToken + "\",\"token_type_hint\":\"access_token\"}";
       // example of JSON string  "{\"x\": \"val1\",\"y\":\"val2\"}";
       //byte[] outputInBytes = str.getBytes("UTF-8");
       //OutputStream os = connection.getOutputStream();
       //os.write( outputInBytes );    
       // os.close();
       //send request 
       DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); 
       wr.writeBytes("token=" + accessToken); 
       wr.flush(); 
       wr.close(); 
        // end of new method 
                   InputStream content = (InputStream)connection.getInputStream();
                   BufferedReader in   = 
                     new BufferedReader (new InputStreamReader (content));
                     String line;
                     while ((line = in.readLine()) != null) {
                         // System.out.println(line); // for debug only 
             outputl += line; 
                         }
                    } catch(Exception e) {
                      System.out.println("Logoff failed, error cause: " + e.toString());
                      e.printStackTrace();
                    }
    System.out.println("Logoff finished successfully");
    // return the json of the user's basic info
    // customized Apache HTTP GET with header - Claude, 27 August 2015 reading user information 
    // ===============================================================================================
                String tokeninfo = ""; 
    String infourl = Oauth2Server + "/oauth2/userinfo?schema=openid";
                StringBuilder infobody = new StringBuilder();
                DefaultHttpClient infohttpclient = new DefaultHttpClient(); // create new httpClient 
                HttpGet infohttpGet = new HttpGet(infourl); // create new httpGet object
                // get some info about the user with the access token
    String currentToken = (String) req.getSession().getAttribute("access_token");
                String bearer = "Bearer " + currentToken.toString(); 
        infohttpGet.setHeader("Authorization", bearer);
    try {
           HttpResponse response = infohttpclient.execute(infohttpGet); // execute httpGet
           StatusLine statusLine = response.getStatusLine();
                   int statusCode = statusLine.getStatusCode();
                   if (statusCode == HttpStatus.SC_OK) {
                       System.out.println(statusLine);
                       infobody.append(statusLine + "\n");
                       HttpEntity e = response.getEntity();
                       String entity = EntityUtils.toString(e);
                       infobody.append(entity);
                       } else {
                              infobody.append(statusLine + "\n");
                              // System.out.println(statusLine);
                              }
                    } catch (ClientProtocolException e) {
                      e.printStackTrace();
                    } catch (IOException e) {
                      e.printStackTrace();
                    } finally {
                      tokeninfo = infobody.toString();  
                      infohttpGet.releaseConnection(); // stop connection
                    }
    // User info lookup is done fetching current log status of the token 
    if (tokeninfo.startsWith("HTTP/1.1 400 Bad Request")) { 
        tokeninfo = "Token " + currentToken + " was revoked";               
        };  
    String html_header = "<html><body>"; 
    String myjson = "<br>Logoff completed successfully"; 
    myjson += "<br>Current Userinfo and Token Status";
    myjson += "<br>" + tokeninfo + "<br>"; 
    myjson += "<br><br><b><a href='./index.html'>Back to login page</a></b><br>";
    String html_footer = "</body></html>";  
    String mypage = html_header + myjson + html_footer; 
    resp.setContentType("text/html");
    resp.getWriter().println(myjson);
    // to print signoff screen for debug purpose
    // resp.getWriter().println(outputl);
}   

}


上面的文档已经提到了撤销访问令牌的方法。撤销访问令牌和从 OAuth2 授权服务器注销是两个不同的过程。举个例子;在 Facebook 中,您可以撤销为不同应用程序提供的访问令牌。但这并不意味着您已从 FB 或您已登录的任何其他应用程序退出。

OAuth2 不是一种身份验证机制。它是授权框架。它不包含从授权服务器注销的标准方法。但是,您可以使用一些自定义方法从可用的 WSO2IS 注销(终止 WSO2IS 中的 SSO 会话)。但是,必须使用最终用户的浏览器(不使用反向通道)通过调用以下 url 来完成此操作。请检查最后一部分this http://xacmlinfo.org/2015/01/08/openid-connect-identity-server/更多细节

https://localhost:9443/commonauth?commonAuthLogout=true&type=oidc2&sessionDataKey=7fa50562-2d0f-4234-8e39-8a7271b9b273&commonAuthCallerPath=http://localhost:8080/openidconnect/oauth2client&relyingParty=OpenidConnectWebapp
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WSO2 身份服务器 - Oauth 2.0 - Java 签核示例 的相关文章

随机推荐

  • 使用 AWS CodeBuild 构建 Windows 容器

    我正在开始使用 AWS 的 CI CD 功能 到目前为止 我已经基于 microsoft windowsservercore 映像在 Windows Server 2016 本地创建了 docker 映像 并将其手动推送到 ECR 亚马逊容
  • 内联块 div 中的文本将其向下推[重复]

    这个问题在这里已经有答案了 今天早上我发现了一个奇怪的 CSS 问题 我希望 CSS 专家能帮助我 在这个演示 http jsfiddle net 7HBCe 为什么红色 div 中的文本将其向下推 我预计这两个 div 会彼此相邻 谢谢
  • 删除Elasticsearch中类型的文档

    我想使用 HTTP REST api 删除 Elasticsearch 中某一类型中索引的所有文档 但我不想删除该类型的映射 如何在 URL 中构建查询来执行此操作 执行命令前 索引 映射状态 截图取自elasticsearch头插件网络界
  • 你能帮助解释我的 svn diff 输出吗?

    我正在使用 SVN DIFF 比较两个文件夹 一个在分支中 一个在主干中 目的是确定更改列表 然后我对分支中的文件进行了一些更改 但输出显示我已经在主干中修改了它们 为什么会出现这种情况 有没有更好的命令来获取我正在寻找的结果 我现在使用的
  • 具有 EasyIn 动画,然后按顺序缩放动画,因为缩放动画会永远重复

    我想要在 onAppear 上为文本信息和 SF 符号添加一个 escapeIn moveUp 动画 此后 我只希望 SF 符号永远按比例放大和缩小 目前 我已经设法永远缩小规模 但是当我设法链接时 easeIn moveUp 动画也会永远
  • Julia 似乎没有使用字符串来执行插值

    官方文档指出 连接和字符串插值调用string 将对象转换为字符串形式 然而 以下最小工作示例似乎证明了其他情况 type MyType x Int end import Base string Base string m MyType w
  • ... 不支持谷歌地图 Javascript API。使用其他浏览器

    我正在使用两个不同的第三方程序 不同的公司 它们显然使用 Google Maps Javascript API 当他们加载地图时 会显示世界地图 但会显示一条错误消息 Der von Ihnen verwendete Browser wir
  • 如何用动画消除一堆模态视图控制器而不在屏幕上闪烁顶部和底部之间任何呈现的 VC?

    更新 通过下面的 屏幕截图 方法修复 这可行 但是有更优雅的方法吗 我将如何消除一堆带有动画的模态视图控制器 而不在屏幕上闪烁顶部和底部之间任何呈现的 VC 尝试用动画来做到这一点是行不通的 请参阅下面的代码和描述我的问题的内嵌注释 您可以
  • 当客户端不正常退出时,如何检测服务器上 Python aiohttp Web 套接字的关闭

    我有一个简单的命令和控制服务器server py 完全不安全 不要使用 被动客户端update client py和另一个可以发送命令的客户端update commander py 有一个 http 端点http 0 0 0 0 8080
  • NAT 穿越和 IPv6

    我很好奇一旦 IPv6 的部署和使用增加 NAT 和 NAT 穿越机制的用处 我们有很多 NAT 遍历机制 包括专有的 主要用于某种住宅或企业 NAT 背后的 IPv4 设备 客户端 鉴于 NAT 的出现是因为 IPv4 缺乏可用地址 那么
  • 未找到 CSS 和 JS 的 Vue dist 路径

    我在构建后渲染 VueJS 应用程序时遇到问题 当我查看构建文件夹并检查路径时 我的资产 css 和 javascript 的路径开头有一个正斜杠 这使得我的 css 资源和 javascript 无法找到 我想知道在运行构建脚本之前如何避
  • 尝试将 CABasicAnimation 位置和图层不透明度延迟 3 秒,但是

    我试图使用 setBeginTime 将图层的不透明度和位置的动画延迟 3 秒 我将图层命名为boxLayer 动画进展顺利 但在前 3 秒内 该图层不应显示 该图层以其最终位置和不透明度显示 不应该 组动画并不能解决该问题 有人可以帮忙吗
  • C++2a 合约编程和编译器

    我有兴趣研究最近接受的C 20 的合约编程 https en cppreference com w cpp language attributes contract用于学习和调查目的 当我四处寻找编译器支持时 我很失望没有找到任何支持 两个
  • Laravel dusk 不工作 .env.dusk.local

    我有一个应用程序 我想使用 Laravel Dusk 我创建了一个名为 env dusk local带有用于测试的数据库和名为的文件 env使用我的默认数据库 我运行 php artisan 命令并创建了一个用户 register 在我使用
  • golang 中有惯用的范围语义吗?

    我想知道是否有任何惯用的方式来表示scoped语义 我所说的范围是指 范围互斥体 一个衬垫而不是显式锁定 延迟解锁 记录函数 或任何代码块 的入口和出口 测量执行时间 前两个项目符号的示例代码 package main import log
  • 从 DynamoDb 查询的 Python 脚本未提供所有项目

    我编写了以下 python 代码来从表中获取数据 但它没有按照我想要的方式获取所有项目 当我检查 DynamoDb 的 AWS 控制台页面时 我可以看到比从脚本中获得的条目多得多的条目 from future import print fu
  • 两个本体之间的映射

    我如何使用 owl sameas 来链接两个本体 如果我有本体A c rdf type owl Class 和本体B d rdf type owl Class 我想将两个本体与共享概念 c 和 d 联系起来 我读过有关 owl sameas
  • Flutter:webview_flutter 更新同一 webview 小部件中的 url

    嘿 我正在尝试创建一个屏幕 显示带有底部应用栏的网络视图 因此 您加载网络视图 当点击底部应用栏中的某个项目时 其他网站应该加载到同一个网络视图中 除了我最初解析的网站之外 我不知道如何打开另一个网站 我尝试使用 setState 更新网址
  • 处理kendo调度程序中的销毁事件

    我正在使用剑道调度程序 调度程序网格中添加了事件 当鼠标悬停在每个事件上时 右上角会出现一个小 x 即该事件的销毁事件 单击该事件时会显示一条警告消息 您确定要删除此事件吗 如果单击 是 它将继续并删除该事件 这是我的要求 正如您在上面看到
  • WSO2 身份服务器 - Oauth 2.0 - Java 签核示例

    我为 Oauth2 身份验证流程编写了一个基于 Java 的签核例程 令牌撤销 请参阅下面的代码实现 遵循手册中描述的 cURL 协议说明 here https docs wso2 com display IS500 OAuth Token