我们正在开发一个具有前端和后端的应用程序。应使用 OAuth2 令牌通过 Rest API 访问后端。授权提供商是 Azure AD。
在 Azure 中,我们创建了 2 个应用程序注册。一种用于 API,一种用于客户端应用程序。API 注册定义了 3 个范围(读、写、删除)。客户端应用程序注册已委派这些范围的权限。
我们正在从客户端应用程序注册请求带有 clientID 和 clientSecret 的令牌。
问题是我们只能请求范围为 api/.default 的令牌。例如 api/read 会导致无效范围错误。但如果我们使用 api/.default,则令牌中不包含范围 (scp) 属性。是否不需要检查使用 API 的应用程序是否具有正确的权限?
我不确定我们是否做错了什么,或者我们是否有错误的理解/期望。
我正在玩 laravel 并尝试启用客户端凭据授予来保护某些 api 端点。
提供一些背景信息: 我想创建一个位于数据库和多个网站(和 SPA)之间的 api。因此,我将能够进行一些监控(哪些网站/SPA 调用哪些资源)并总体上添加一些安全性。因此,在不需要额外用户信息的情况下,机器对机器通信的客户端凭据授予应该是最好的方法。
我按照某人的教程(例如本教程)来实现这些资助类型,但我陷入困境......
我做了以下事情:
composer require laravel/passport
config/app.php
:Laravel\Passport\PassportServiceProvider::class,
php artisan migrate
php artisan passport:install
HasApiTokens
到App\User.php
Passport::routes()
到app/Providers/AuthServiceProvider.php
passport
inconfig/auth.php
到目前为止,一切都很好。现在我创建了一个示例客户端php artisan passport:client
:
New client created successfully.
Client ID: 3
Client secret: S5s9oEIRm5DNy5ySsr1H6jWlraOCZyF24gcpoDrJ
Run Code Online (Sandbox Code Playgroud)
现在,当我想使用邮递员为该客户端获取令牌时(添加到此处body.formdata
提供的类似内容中)
我收到以下错误。
{
"error": "unsupported_grant_type",
"error_description": "The authorization grant type is not supported by the authorization server.",
"hint": "Check that …
Run Code Online (Sandbox Code Playgroud) 我在 keycloak 管理控制台中定义了一个客户端,以使用 client_credentials 流授权它在我的应用程序中调用服务器到服务器 api。一切都很好,我想对该客户端应用 IP 限制。
我可以在管理控制台中的哪里定义此限制?我在keycloak文档中没有找到这样的配置。
我已经能够创建 Azure Functions App 来管理 Azure B2C 用户。我可以使用 client_credentials Flow 创建新用户并完美更新配置文件。但是,当我使用带有正文的 PATCH 请求更改密码时:
{
passwordProfile: {
password: 'password-value',
forceChangePasswordNextSignIn: false
},
passwordPolicies: "DisablePasswordExpiration"
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
{code: 'Authorization_RequestDenied', message: 'Insufficient privileges to complete the operation.'}
Run Code Online (Sandbox Code Playgroud)
我对此做了一些研究,并发现更新密码需要委派权限“Directory.AccessAsUser.All”。在前端应用程序中,我使用 B2CLogin 流程登录,因此访问令牌与 Graph API 不兼容。此外,B2C 应用程序中的应用程序级别不存在“Directory.AccessAsUser.All”。因此,我也无法将补丁请求与 client_credentials 流程一起使用。根据一些建议,该过程可以通过 Azure AD PowerShell 通过分配“公司管理员”角色来完成。但是,我还没有找到通过Azure Function重置密码的解决方案。分步解决方案(如果存在)对我来说非常有帮助,因为我对 Azure 服务相对较新。
我已在 Azure AD 中注册了两个应用程序;一套是服务器,一套是客户端。创建了两组;一套用于生产,另一套用于 UAT。客户端应用程序是“Web”类型,没有一个是 SPA。
生产服务器应用程序几乎是 UAT 服务器应用程序的克隆。Production Client App 几乎是 UAT Client 应用程序的克隆。
消费者使用客户端应用程序通过使用 OAuth 2.0 令牌端点 (v2) https://login.microsoftonline.com/[--Tenant--]/oauth2/v2.0/token作为带有密钥的客户端凭据流来获取令牌。生成的令牌用作不记名令牌来授权我的 Web API。
在生产客户端应用程序上,从令牌端点检索令牌时会返回错误,其内容如下:
AADSTS9002326:仅允许“单页应用程序”进行跨域令牌兑换
这里奇怪的是:
考虑到这些事实,说生产消费者站点存在网络限制是不合理的。我不明白为什么应用程序不在内部网络中而是在公共网络中生成令牌,而无论环境如何,UAT 应用程序在生成令牌时都没有问题。
这个案例几乎详细阐述了我的案例,但我检查了我的案例,其中客户端应用程序是公共的,服务器应用程序是私有的。
去哪里寻找?需要关注哪些领域?
azure oauth-2.0 azure-active-directory bearer-token clientcredential
我正在创建一个 node.js web 应用程序来使用“客户端凭据流”访问 GettyImages API
Passport.js 支持吗?如果是,我该如何实施?
oauth-2.0 ×3
azure ×2
oauth ×2
azure-ad-b2c ×1
bearer-token ×1
keycloak ×1
laravel ×1
node.js ×1
passport.js ×1
php ×1
token ×1