当前位置: 首页 > 科技观察

如何为多个WebAPI提供授权方式

时间:2023-03-15 14:30:36 科技观察

【.com速译】AzureActiveDirectory(活动目录,AzureAD)是业界比较流行的企业级认证服务。如今,许多组织都在使用该服务来为应用程序启用单点登录(SSO)并保护他们提供的WebAPI。其中,基于OpenIdConnect(OIDC)身份验证的MicrosoftIdentityPlatform2.0是针对OAuth2.0授权流程的最新改进版本。如果你的应用程序使用了AzureAD的以下功能,那么本文只是向你介绍了如何为多个WebAPI提供授权:1.启用单点登录(OpenIdConnect认证)。2.使用OAuth2授权(隐式授权流程)保护WebAPI。3.单个客户端应用程序使用多个WebAPI提供程序。首先,我们假设你的客户端应用属于单页面架构(SinglePageArchitecture,如:AngularSPA),而这个架构使用了以下两种不同的API:1.MicrosoftGraphAPI(https://dzone.com/articles/getting-access-token-for-microsoft-graph-using-oau?preview=true)-获取员工资料详细信息并将其显示在应用程序的GUI中。此过程需要获取访问令牌并通过图形API调用提交。2.自定义WebAPI–提供应用程序的基本功能和数据。对于每个WebAPI调用,必须获取并提交不同且单独的访问令牌。显然,应用程序的用户必须先通过AzureAD(OIDC,https://dzone.com/articles/integrating-okta-oauth-20-oidc-with-mulesoft-anypo)进行身份验证,然后才能访问受保护的API保护函数和数据.也就是说,他们需要先传递一个有效的JWT访问令牌,然后才能访问受保护的API。在Azure门户中执行SPA应用程序注册的第一步,在Azure门户(https://portal.azure.com/#home)中注册您的客户端应用程序(SPA)。注意:请为您的SPA应用设置重定向的URI,并为ImplicitGrant的OAuth2数据流选择IDToken和AccessToken。下图是一个假设的Web应用程序的屏幕截图,供您参考:SpecifyURIRoutesPublishWebAPIinAzurePortal为WebAPI定义以下配置。1.自定义WebAPI的作用域,以控制其对API保护函数的访问。2.授权可以调用WebAPI的客户端应用程序,这样在调用的时候就不需要手动判断是否同意了。在AzurePortal中发布API为客户端应用程序指定API权限选择所有权限供客户端应用程序调用API。如果您需要获取用户的个人资料,请选择带有User.Read的MicrosoftGraphAPI。如下截图所示:同理申请MicrosoftGraphAPI权限,选择WebAPI,自定义API权限范围。请求WebAPI权限从AngularSPA调用MicrosoftGraphAPI我们假设的AngularSPA(https://dzone.com/articles/angular-tutorials-and-articles)将通过调用GraphAPI信息来获取用户配置文件的详细信息。当然,你也可以在Angular应用程序中使用任何身份验证客户端库,例如:angular-auth-oidc-clientoidc-client这里值得注意的是:MicrosoftGraphAPI和自定义WebAPI是两种截然不同的API提供者类型,所以它们的范围不能合并到同一个Angular应用程序中的同一个AzureAD以进行授权调用。那么,正确的做法应该是:使用两个单独的调用。即:分别调用MicrosoftGraphAPI和WebAPI一次,每次调用指定不同的作用域。调用MicrosoftGraphAPI的具体顺序和步骤如下:Angular第一次调用AzureADOAuth2.0授权端点,指定User.Read的范围。指定User.Read的范围2.AzureAD执行用户身份验证。3.AzureAD生成一个accesstoken,可以根据userprofile的详细信息调用GraphAPI的相应权限。同时,它还会生成一个IDtoken来指示用户登录。4.注意:在v2.0中,AzureAD在内部调用了userinfoGraphAPI,获取和返回的用户详情只是用户的基本属性。稍后,我们可以显式调用另一个GraphAPI端点来获取用户的详细属性信息。5、在AzureAD的重定向请求中,我们会根据Angular代码获取对应的accesstoken。通过调用GraphAPI,我们将此令牌的Authorization标头设置为Bearer类型的令牌。相应地,API将返回用户个人资料的详细信息,包括:员工编号、照片和组织结构等。以下示例是对GraphAPI端点的HTTPGET请求,可以获取用户的员工编号。注意:应在请求的授权标头中传递Bearer类型的令牌。https://graph.microsoft.com/v1.0/me$,userPrincipalName,country,extension_8b4e685f580748b59864d62c2e7fcfad_employeeNumber从AngularSPA调用自定义WebAPI的具体顺序和步骤如下:1.指定http://的范围mystatementapi/access_as_user(虽然可以是任意范围,但我们最好匹配AzureAD门户中的那些应用程序,在其注册过程中定义的范围)。此范围将用于对AzureADOAuth2.0授权端点的第二次调用。指定user_as_access的范围2.注意:由于我们的浏览器在之前的调用中已经设置了认证cookie,所以这一步将不再进行用户认证。3.AzureAD生成另一个具有调用WebAPI的访问权限的访问令牌。此令牌将用于每个WebAPI。4.在AzureAD重定向的请求中,我们会根据Angular代码获取对应的accesstoken。通过调用自定义API,我们将这个token的授权头(Authorizationheader)设置为一个Bearer类型的token。5、WebAPI验证来自AzureAD的token,验证成功则返回正常的响应信息;如果失败,则告知错误信息。刷新访问令牌通常,访问令牌是短暂的。我们可以将令牌的过期时间配置为一个小时或更短。然后,客户端应用程序应在令牌过期之前从AzureAD请求新的访问令牌。此外,这个过程应该在后台自动完成,无需用户干预。所以我们可以在客户端应用程序中采用隐藏的iframe方法。事实上,这显然是用于调用那些自定义WebAPI(而不是本示例前面提到的GraphAPI)的访问令牌所必需的。综上所述,上面提到的AzureAD作为一种基于云的身份认证服务。您可以将您的应用部署到其他云服务或本地数据中心,实现个性化的认证授权。当然,你也可以在开始编写Angular应用程序代码之前,使用Postman客户端(译者注:一个强大的网页调试和接口测试工具)来测试验证AzureAD和各种WebAPI的配置。总的来说,通过上面详细的设计方法和实现步骤,我们已经演示了Angular客户端应用如何从不同的WebAPI获取OAuth2类型的授权。希望对你有帮助。原标题:AuthorizationApproachforMultipleWebAPIProviders,作者:SatyenMishra&SachinKulkarni