当前位置: 首页 > 知识库问答 >
问题:

授权代码流如何在单页应用程序中工作?

廉学潞
2023-03-14

嗨,我正在探索关于azure active Directory的一些身份验证和授权流。我以前在单页应用程序中使用誓言隐式流。在阅读microsoft文档之后,我已经理解了关于隐式流的以下内容。

隐式流:

单页javacript应用程序使用隐式流从azure active Directory获得获取访问令牌。它直接调用令牌endpoint来获取令牌,因此这使得隐式流不太安全。

NET Web应用程序中的授权折叠

React Web App中的授权代码流

我有SPA react应用程序,它使用MSAL库。我从github https://github.com/azure-samples/ms-identity-javascript-react-tutorial/tree/main/3-authorization-II/1-call-api/spa克隆了示例应用程序。

每当我运行这个应用程序并登录时,第一次调用将如下所示

 https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=https://login.microsoftonline.com/c5ffa990-7e0a-4bf6-6c04-79ab98e05931/oauth2/v2.0/authorize

为了获取访问令牌,在FormData部分的请求中,我可以看到以下参数

client_d, redirect_uri,scope,code

在代码中,我看到一些希望从授权endpoint接收的代码值。无论如何,这个api返回给我access_token。

现在总结一下,在。NET核心web应用程序和React SPA应用程序这两个地方我都使用了授权代码流。

在网上浏览了几个文件和视频后,我总结道:

NET core MVC等服务器端web应用程序在使用授权代码流时,利用client_secrete获取访问令牌,此调用将发生在服务器端,因此客户端的secrete不会通过浏览器暴露给用户

当授权流使用没有服务器端支持的SPA应用程序时,首先进行调用获取授权码,然后在没有client_secrete的情况下进行post请求获取访问令牌,只有通过使用“state”参数并限制重定向URL到可信的客户端,才能保证没有客户端秘密的授权码授予的安全。

因此,我的结论是,当我们使用带有授权代码流的服务器端web应用程序时,我们可以使用客户端secrete,但在SPA的情况下,我们不使用client_secrete。

我已经理解了上面的概念,并解释了我所理解的,还列出了我在web应用和spa应用中实现两种授权代码流后遇到的困惑。如果我的理解正确与否,如果我的理解是错误的,我到底在哪里理解错了,有人能帮助我吗?有人能在这方面帮我吗。任何帮助都将不胜感激。谢谢

共有1个答案

红鸿运
2023-03-14

Authcode流是一个OAuth2.0工作流,您可以在任何类型的客户端(Web/Mobile/SPA)中使用它。客户机应该使用MSAL库与AAD/B2C通信,使用PKCE通过S256加密的代码交换证明密钥(Code_Challengy)来保护授权代码授予。

Authcode授权流规范:

如果您使用的是B2C,您的入口endpoint是:

https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/authorize?
client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6
&response_type=code
&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob
&response_mode=query
&scope=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6%20offline_access
&state=arbitrary_data_you_can_receive_in_the_response
&code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
&code_challenge_method=S256

令牌endpoint:

POST https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6&scope=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 offline_access&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...&redirect_uri=urn:ietf:wg:oauth:2.0:oob&code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong 

参数是从第一个GET请求返回的access_code。

 类似资料:
  • 我有2个微软tenat AD租户A和tenat B, 我需要通过在租户a下注册的应用程序调用租户B的Azure API(如Azure资源调配、读取Azure数据、调用成本API和其他一些Azure API)。我已经通过以下方式实现了这一点。 > 在租户A下创建了一个多租户应用(仅具有图形API权限)。 使用此URL通过Authoriziation Code流获取Azure刷新令牌(租户B用户(非管

  • 企业授权应用流程 PDF版下载 企业的系统管理员从管理后台-应用市场发起授权安装第三方应用,安装后如流平台会将授权凭证、授权信息等推送给服务商后台。 详细步骤: 企业管理员授权安装应用 企业的系统管理员从管理后台应用市场发起授权安装第三方应用; 授权成功,回调临时授权码 a) 授权成功后,如流企业平台会回调应用开发信息中填写的安装事件回调地址,GET参数上带上临时授权码auth_code; b)

  • 我正试图获得一个适用于Android、iOS和Web的Flutter v2应用程序。我让用户登录成功,使用授权代码流与Auth0集成。 但是,对于Web版本,我尝试了几个库和指南。但是我无法让它工作,也找不到完整的工作示例。 我尝试过的库和指南: https://pub.dev/packages/openid_client https://pub.dev/packages/simple_auth

  • 我正在使用Spotipy python库与Spotify web api进行交互。我已经研究过API和文档,但我没有看到一个清晰的示例来显示该库如何支持授权代码流(https://developer . Spotify . com/we b-API/Authorization-guide/# Authorization-code-flow)。

  • 我们有一个应用程序,它应该通过第三方OAuth 2.0服务器使用身份验证,该服务器充当授权服务器。 据我所知,有两种可能性。 “正确”的一个是: 移动应用程序存储client_id 移动应用程序从GET/auth开始接收authorization_code 授权服务器返回响应,重定向到redirect_uri并附加授权代码。我们假设,redirect_uri是我们自己服务器上的endpoint 移

  • 我是这方面的新手,读了很多之后,我觉得我不太明白如何在Keycloak中实现授权代码流。我的疑惑: > < li> 在创建了支持此流程的客户端后,如何执行凭据验证?默认情况下,如果我不做任何配置,我会得到一个登录表单。如果我在浏览器中打开这个html,并填写用户和密码字段,当我按下按钮时,它会将我发送到一个类型为.../realm/{ REAL _ NAME }/log in-actions/au