使用带有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,一经查实,立即删除!

相关文章

git仓库的推送问题

git仓库的推送问题 推送问题 先说结论。先拉取&#xff0c;pull拉取完之后再commi提交。 如果先提交&#xff0c;再拉取的话&#xff0c;git会提示项目冲突&#xff0c;此时需要先解决冲突&#xff0c;而某些时候&#xff0c;我们不一定会处理好所有的冲突&#xff0c;而导致…

scala的插值器

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

src/main/resorces applicationContext.xml

<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http://www.springframework.org/schema/context"xmlns:aop"http://www.springframework.org/schem…

layui的checkbox示例

1.html页面: var isSkipcheckbox ;if (appOptions.isSkip ! "0") {isSkipcheckbox checked"";}<input type"checkbox" name"" lay-filter"type" lay-skin"primary" title"是否允许跳过" value&quo…

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;您可以在此处找到博客和幻…

AJAX的内容

第 1 章&#xff1a;原生 AJAX 1.1 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 AJAX 不是新的编程语言&#xff0c;而是…

洛谷P1099 树网的核

传送门 80分 $ Floyd $ 树的直径可以通过枚举求出。直径的两个端点$ maxi,maxj $ &#xff0c;由此可知对于一个点 $ k $ &#xff0c;如果满足 $ d[maxi][k]d[k][maxj]d[maxi][maxj] $ 那么 $ k $ 点一定在直径上。分别枚举位于直径上的起点 $ s $ 与终点 $ t $ 。 $ ecg $ 定…

HTML中直接写js 函数

1.在HTML中直接写JS函数: <body οnlοad"javascript:{window.location.hrefhttp://www.baidu.com/}">2.写在script标签里的话就是&#xff1a; <script>function tiao(){window.location.href"http://www.baidu.com/"}</script><!--…

选择通过更改内容类型返回的详细程度,第二部分

在上一篇文章中 &#xff0c;我们研究了使用MOXy的功能来控制特定实体的数据输出级别。 这篇文章着眼于Jersey 2.x提供的抽象&#xff0c;它允许您定义一组自定义的批注以具有相同的效果。 与之前一样&#xff0c;我们几乎没有什么琐碎的资源可以返回Jersey将为我们转换为JSON…

jQuery.ajax success 与 complete 区别

作者QQ&#xff1a;1095737364 QQ群&#xff1a;123300273 欢迎加入&#xff01; 天天用,不知所以然: $.ajax({type: "post",url: url,dataType:html,success: function(data) { },complete: function(XMLHttpRequest, textStatus) { },error: function(){}}…

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; 页面代…

leetcode 970. 强整数(Powerful Integers)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;解法&#xff1a;题目描述&#xff1a; 给定两个正整数 x 和 y&#xff0c;如果某一整数等于 x^i y^j&#xff0c;其中整数 i > 0 且 j > 0&#xff0c;那么我们认为该整数是一个强整数。 返回值小于或等…

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

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

Java 8:在新的Nashorn JS引擎中编译Lambda表达式

在最近的一篇文章中&#xff0c;我了解了Java 8和Scala如何实现Lambda表达式。 众所周知&#xff0c;Java 8不仅引入了对Javac编译器的改进&#xff0c;而且还引入了全新的解决方案-Nashorn。 这个新引擎旨在替代Java现有JavaScript解释器Rhino。 这为我们带来了JVM的前列&…

vue 组件开发

作者QQ&#xff1a;1095737364 QQ群&#xff1a;123300273 欢迎加入&#xff01;1.新建路由:router-->index.js,修改成下面的代码 import Vue from vueimport Router from vue-routerimport index from /components/index/indexVue.use(Router)export default new Ro…

sql中有一些保留字,当你的字段名是它的保留字时,这个时候sql语句的字段不加``就会报错...

sql中有一些保留字&#xff0c;当你的字段名是它的保留字时&#xff0c;这个时候sql语句的字段不加就会报错转载于:https://www.cnblogs.com/w123w/p/10673692.html

C++语言实现-邻接表

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

为了适应云数据库mySQL产品_为了适应不同的应用场景,云数据库mysql版提供的产品系列包括哪些...

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…