使用带有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示例。

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

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

API开发人员角色

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

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

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

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

应用开发人员角色

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

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

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

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

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

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

  • 开发人员将消费者**和消费者秘密嵌入到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的应用程序中输入其凭据。

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

位于中间的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

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