使用带有OAuth2的Web应用程序和使用JWT来调用API – WSO2 API Manager

在这篇文章中,我将分享我在WSO2 API管理器(API-M)方面的经验和理解,以解决该行业中非常普遍和有用的情况。

简要地说明以下流程。

公开了一个API,供应用程序开发人员在API Manager(可为API添加访问控制)的控制下使用。 然后,应用程序开发人员使他们的应用程序使用这些API。 开发和测试完成后,他们会将其提供给App Store的最终用户。 然后,最终用户可以在商店中注册并使用自己的凭据使用这些应用程序。 该应用程序将提供所需的服务,以调用其已订阅的API。

以上情形在WSO2 API-M中得到了很好的演示,在[1]的文档中说明了Pizza hacks示例。

rsz_jwt_token_scenario

为了清楚起见,我将简要介绍这些步骤。 有关详细步骤,请参阅[1]中的文档。

API开发人员角色

  • 我们在WSO2-应用程序服务器或任何其他所需的应用程序服务器中部署与“比萨饼订购”相关的后端服务。 (从API-M示例svn下载代码,使用Maven3进行构建并将其部署在WSO2 AS中。如果检查WADL,则可以检查其公开的资源。请注意端点URL。)

rsz_api1

  • 然后,我们将这些服务作为API在WSO2 API-M Publisher中发布,以便它们将在API-M Store中可用(登录到API-M Publisher,默认包为https:// localhost:9443 / publisher,并将API发布为在示例文档中进行了指导。我们应确保生产端点URL与第一步中观察到的相匹配。

rsz_addapi

应用开发人员角色

  • 现在出现了一位应用程序开发人员,他希望开发一个应用程序来订购Pizza。 他/她可以在商店中注册此应用,并订阅这些应用开发所需的API。 因此,此APP开发人员将使用以前的开发人员发布的API公开的服务。 比萨订购示例Web应用程序的代码也可以从svn下载。

rsz_addapp

  • 在订阅时,他/她会获得消费者秘密和消费者密钥,然后将其用于请求OAuth令牌以访问API(在本示例中,我们使用授予类型“ password”中要求的用户名和密码。还有其他几种可能的授予类型同样,如果我们不想发送密码)。

rsz_subscribeapi

从“我的订阅”中获取消费者密钥和机密。

rsz_generatetokens

  • 开发人员将消费者密钥和消费者秘密嵌入到Pizza订购应用程序中(在大多数情况下,在web.xml中)。
<context-param><param-name>consumerKey</param-name><param-value>FyfSK4RNHqGETmnNkaI87hIoNFQa</param-value></context-param><context-param><param-name>consumerSecret</param-name><param-value>1NFr7jb8JBA3IFa6gkjoN_PoYAca</param-value></context-param>

此时,我们可以使用以下简单的curl命令检查令牌的工作方式。 提供从上面的UI获取的访问令牌。

curl -k -H "Authorization: Bearer <access_token>" https://localhost:8245/pizzashack/menu/1.0.0

这将返回比萨饼的菜单详细信息,如下所示:

[{"price":"13.99","icon":"/images/6.png","description":"Grilled white chicken, hickory-smoked bacon and fresh sliced onions in barbeque sauce","name":"BBQ Chicken Bacon"},{"price":"24.99","icon":"......................:"/images/5.png","description":"Rich and creamy blend of spinach and garlic Parmesan with Alfredo sauce","name":"Spinach Alfredo"},{"price":"15.99","icon":"/images/4.png","description":"Six cheese blend of mozzarella, Parmesan, Romano, Asiago and Fontina","name":"Tuscan Six Cheese"}]

由于我们已经看到了访问令牌,因此可以在这里使用它。 但是,当最终用户来订购披萨时,他/她将不会被看到。 此外,此令牌还与USER_TYPE:APPLICATION有关,APPLICATION比最终用户具有更多的特权,因此我们无论如何不能让用户使用它。 因此,使用嵌入的使用者密钥/秘密和最终用户输入的凭据(如果使用了密码授予类型)为最终用户生成了一个单独的令牌,该凭据将与USER_TYPE:APPLICATION_USER相关。

最终用户

因此,这是在App Store中注册的最终用户。

然后,最终用户可以使用该应用程序在线订购披萨,在http:// localhost / pizzashack的应用程序中输入其凭据。

比萨

位于中间的API-M在此方案中充当授权服务器,管理公开API的使用。

那么JWT断言在哪里起作用?

JWT断言是一种用于发送调用API的最终用户的详细信息的格式。 就像SAML断言会携带用户声明一样,JWT也以JSON表示符携带用户声明。 我们可以在[2]上找到更多详细信息。 这用于将那些详细信息传递到后端服务,这可能需要它们进行监视或其他目的。 默认的JWT令牌如下。

{"iss":"wso2.org/products/am","exp":1391029971429,"http://wso2.org/claims/subscriber":"admin","http://wso2.org/claims/applicationid":"1","http://wso2.org/claims/applicationname":"DefaultApplication","http://wso2.org/claims/applicationtier":"Unlimited","http://wso2.org/claims/apicontext":"/pizzashack/menu","http://wso2.org/claims/version":"1.0.0","http://wso2.org/claims/tier":"Bronze","http://wso2.org/claims/keytype":"PRODUCTION","http://wso2.org/claims/usertype":"APPLICATION","http://wso2.org/claims/enduser":"admin","http://wso2.org/claims/enduserTenantId":"-1234"
}

干杯!

资源:

  1. http://docs.wso2.org/display/AM150/Invoking+APIs+using+a+Web+App+Deployed+in+WSO2+AS
  2. http://lalajisureshika.blogspot.com/2013/06/passing-end-user-details-from-client-to.html
  3. http://asanka.abeysinghe.org/2014/01/oauth-for-application-developer-and.html

参考: 使用我们的JCG合作伙伴 Pushpalanka(位于Pushpalanka的Blog博客) 使用带有OAuth2的Web应用程序调用API,并使用JWT – WSO2 API Manager 。

翻译自: https://www.javacodegeeks.com/2014/02/invoking-apis-using-a-web-app-with-oauth2-and-use-of-jwt-wso2-api-manager.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala的插值器

Scala 为我们提供了三种字符串插值的方式&#xff0c;分别是 s, f 和 raw。它们都是定义在 StringContext 中的方法。 s 字符串插值器 val a 2println(s"小明今年$a 岁了") f 字符串插值器 它除 s 的功能外(不指定格式就和 s 一样)&#xff0c;还能进行格式化输出&a…

confluence 编辑器加载_Onlyoffice集成Confluence的工作原理

onlyoffice 与 confluence集成使用&#xff0c;使用onlyoffice connector for confluence 插件对接confluence插件在confluence中创建了一个新的按钮动作&#xff0c;Edit in OnlyOffice 用来处理office文档。这允许多用户实时协作并且将变更返回到confluence中。具体工作原理&…

红帽JBoss BRMS和BPMS富客户端框架展示了与GWT / Errai / UberFire和AngularJS的多语言集成...

上周&#xff0c;我发布了一个博客&#xff0c;重点介绍了我的演示文稿&#xff0c;该演示文稿展示了我们在BRMS和BPMS平台内完成的工作&#xff0c;Drools和jBPM项目的产品化版本所产生的丰富客户端平台。 该演示文稿是所有屏幕截图和视频&#xff0c;您可以在此处找到博客和幻…

vscode如何设置回车自动换行缩进?

要解决这个问题&#xff0c;首先打开设置&#xff0c;查找tabsize&#xff0c;进入settings.json。 把"editor.autoIndent"的属性值改为false&#xff0c;即"editor.autoIndent": "false"&#xff0c;就可以了。

vue 过滤器使用的传参说明

在table中&#xff0c;需要对obj的数据类型进行文字转换&#xff0c;例如后台接口返回的姓别值&#xff1a;1&#xff0c;2。其中需要页面根据字典需要把1》男&#xff0c;2》女进行转换。 以前的习惯是每一个过滤方法都写一个方法进行转换&#xff0c;例如&#xff1a; 页面代…

ruby sinatra mysql_一分钟开始持续集成之旅系列之:Ruby + Sinatra 应用

前言现代软件工程越来越复杂&#xff0c;而开发效率随着软件复杂度增加呈指数型下降。为在提高开发效率的同时也能保证质量&#xff0c;越来越多团队开始践行敏捷开发方法。持续集成是敏捷开发的重要实践之一。它倡导团队通过自动化构建工具频繁地验证软件可用性&#xff0c;从…

C++语言实现-邻接表

图的邻接表实现 邻接表是图的一种链式存储结构。主要是应对于邻接矩阵在顶点多边少的时候&#xff0c;浪费空间的问题。它的方法就是声明两个结构。如下图所示&#xff1a; 先来看看伪代码&#xff1a; typedef char Vertextype; //表结点结构 struct ArcNode { int adjvex; …

使用Lucene的新FreeTextSuggester查找长尾建议

Lucene的“ 建议”模块提供了许多有趣的自动建议实现&#xff0c;以便在用户将每个字符输入搜索框时为他们提供实时搜索建议。 例如&#xff0c; WFSTCompletionLookup将所有建议及其权重编译到一个紧凑的有限状态传感器中 &#xff0c;从而可以对基本建议进行快速前缀查找。 …

mysql 查看锁表日志_MYSQL 表锁情况查看

查看锁表情况mysql> show status like ‘Table%’;—————————-——–| Variable_name | Value |—————————-——–| Table_locks_immediate | 795505 || Table_locks_waited | 0 || Table_open_cache_hits | 0 || Table_open_cache_misses | 0 || Table_ope…

Java,Scala,Guava和Trove集合-它们可以容纳多少数据?

关于我们的数据结构&#xff0c;令人着迷的事情之一是&#xff0c;即使我们对它们非常熟悉&#xff0c;我们仍然很难说出像HashMap这样基本的东西在1GB的内存中可以容纳多少个项目。 我们可能会在学校&#xff0c;高级开发人员那里学到这一点&#xff0c;或者由于数据结构选择不…

switch 失效

switch 开关失效无法切换&#xff0c;可以关闭&#xff0c;无法开启。 发现问题点 require-table.js 中toggle value的数据类型不是 number 导致 &#xff08;value ? no : yes )判断总为no&#xff1b; 前面将value 强制转换为number类型即可 转载于:https://www.cnblogs.c…

纯php socket mysql_PHP 连接 unix_socket MySQL

当MySQL使用Unix Socket启动时&#xff0c;直接使用localhost会发生了一个数据库错误&#xff0c;发生无法连接数据库错误。 Warning: mysql_connect() [function.mysql-connect]: [2002] 这时应当修改hostname&#xff0c;例如在CI 配置数据库 (database.php) 从&#xff1a; …

mysql为什么不能插入数据_mysql为啥不能插入数据

mysql为何不能插入数据&#xff1f;安装AppServ后首次使用mysql&#xff0c;没有图形界面&#xff0c;在“MySql Command Line Client”的操作如下&#xff1a;mysql> create database cars;Query OK, 1 row affected (0.00 sec)mysql> use cars;Database changedmysql&g…

mocha 测试 mysql_e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDrive

e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 二 图片验证码的识别 &#xff0c; 下面讲一下Node.js中如何访问数据库&#xff0c; 在做自动化测试过程中&#xff0c; 经常可能遇到需要到数据库取值&#xff0c;或是…

在Window上使用Jenkins自动发布Java工件

这篇文章将展示如何使用Jenkins Continuous Integration自动执行Java Web应用程序&#xff08;使用MYSQL DB和基于Hibernate ORM在基于REST的Jersey2 Spring环境中开发的学生申请应用程序&#xff09;的发布过程-上载发布工件到发布存储库。 如上一篇文章在Windows上使用Jenkin…

Python开发【第六篇】:模块

Python开发【第六篇】&#xff1a;模块 模块&#xff0c;用一砣代码实现了某个功能的代码集合。 类似于函数式编程和面向过程编程&#xff0c;函数式编程则完成一个功能&#xff0c;其他代码用来调用即可&#xff0c;提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来…

在jsp文件中通过超链接访问servlet_Eclipse中创建Servlet

1.新建test1.jsp文件&#xff0c;输入如下代码代码解释&#xff1a;一个超链接&#xff0c;跳转到forwardServlet注意forwardServlet 这里是个Servlet2.在工程中新建Servlet3.输入Class名称&#xff0c;注意下边的Supper Class 它自动继承了HttpServlet选择next4.Create Servle…

C# 多线程学习系列四之ThreadPool取消、超时子线程操作以及ManualResetEvent和AutoResetEvent信号量的使用...

1、简介 虽然ThreadPool、Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常、或者子线程的业务逻辑不符合我们的预期,那么这个时候我们必须关闭它,而不是让它继续执行,消耗资源.让CPU不在把时间和资源花在没有意义的代码上. 2、主线…

Oracle学习:新建表空间

1. 以 sysdba 身份登入Oracle sqlplus / as sysdba; 2. 创建表空间 create tablespace (空间名)fwptfs (数据文件存放路径)datafile D:\xxx (初始大小)size 500m (自动扩容&#xff0c;每次200m)autoextend on next 200m; 3. 创建用户 create user (用户名)fwptfs…

tomcat7使用dbcp连接池遇到的坑

项目部署在tomcat后每隔一段时间便会报错 Cause: java.sql.SQLException: Could not retrieve transation read-only status server ; SQL []; Could not retrieve transation read-only status server; nested exception is java.sql.SQLException: Could not retrieve transa…