- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Laravel 进行 Azure B2C 登录,现在已经完成一半了。
Laravel 部分是一个 API,客户端是 Angular。我计划把整个过程都放在BE上。当用户单击“使用 Microsoft 登录”以重定向到 BE 服务器端页面时,我会在 BE 上施展魔法。最后,我想重定向到某个 FE 页面并在 cookie 中设置访问 token 。
我定义了两个 web.php(服务器端)路由。第一个用于重定向到 Azure 登录,第二个用于回调。
这是代码:
public function redirect()
{
$length = mt_rand(43, 128);
$bytes = random_bytes($length);
$codeVerifier = rtrim(strtr(base64_encode($bytes), '+/', '-_'), '=');
$state = Str::random(40);
$query = http_build_query([
'p' => 'B2C_1A_SIGNIN',
'client_id' => config('services.azureadb2c.client_id'),
'redirect_uri' => config('services.azureadb2c.redirect'),
'response_type' => 'code',
'scope' => 'openid',
'state' => $state,
'prompt' => 'login',
'code_challenge' => $this->generateCodeChallenge($codeVerifier),
'code_challenge_method' => 'S256',
]);
session(['state' => $state, 'code_verifier' => $codeVerifier]);
return redirect('https://' . config('services.azureadb2c.domain') . '.b2clogin.com/' . config('services.azureadb2c.domain') . '.onmicrosoft.com/b2c_1a_signin/oauth2/v2.0/authorize?' . $query);
}
public function callback(Request $request)
{
$client = new Client();
$response = $client->post("https://" . config('services.azureadb2c.domain') . ".b2clogin.com/" . config('services.azureadb2c.domain') . ".onmicrosoft.com/b2c_1a_signin/oauth2/v2.0/token?p=B2C_1A_SIGNIN", [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => config('services.azureadb2c.client_id'),
'client_secret' => config('services.azureadb2c.client_secret'),
'code' => $request->get('code'),
'redirect_uri' => config('services.azureadb2c.redirect'),
'code_verifier' => session('code_verifier'),
'scope' => 'openid',
],
]);
var_dump(json_decode($response->body()));
exit;
}
private function generateCodeChallenge($codeVerifier) {
$hash = hash('sha256', $codeVerifier, true);
$codeChallenge = rtrim(strtr(base64_encode($hash), '+/', '-_'), '=');
return $codeChallenge;
}
在这里,我面临下一个问题。重定向运行良好,用户被正确重定向,并且他可以很好地输入凭据等。在回调的最后,我收到了授权代码,但是当我发出 POST 请求来获取访问 token 时,我收到了下一个错误
`400 Bad Request` response: {"error":"invalid_grant","error_description":"AADB2C90085: The service has encountered an internal error. Please reauthe (truncated...)
您知道什么会导致此错误吗?
最佳答案
我尝试通过 Postman 在我的环境中重现相同的结果,并得到以下结果:
我通过在重定向 URI 中选择 SPA 注册了一个 Azure AD B2C 应用程序,如下所示:
我从 blog 中运行了 Bac Hoang [MSFT] 的 c# 代码,并成功获取了 code_challenge
和 code_verifier
的值,如下所示:
using IdentityModel;
using System.Security.Cryptography;
using System.Text;
namespace PKCEConsoleApp2
{
class Program
{
static void Main(string[] args)
{
var random = new Random();
int cvlength = random.Next(43, 128);
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
var codeVerifier = new string (Enumerable.Repeat(chars, cvlength).Select(s => s[random.Next(s.Length)]).ToArray());
string codeChallenge;
using (var sha256 = SHA256.Create())
{
var a = Encoding.UTF8.GetBytes(codeVerifier);
var challengeBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(codeVerifier));
codeChallenge = Base64Url.Encode(challengeBytes);
}
Console.WriteLine("codeVerifier " + codeVerifier + "\n");
Console.WriteLine("codeChallenge " + codeChallenge + "\n");
Console.ReadLine();
}
}
}
回应:
现在,我在浏览器中运行了以下授权请求,并成功获取了代码,如下所示:
https://sritenantb2c.b2clogin.com/sritenantb2c.onmicrosoft.com/B2C_1_Signin/oauth2/v2.0/authorize?
client_id=742978eb-ccb4-4b82-8140-3526417d4d09
&response_type=code
&redirect_uri=https://jwt.ms
&response_mode=query
&scope=openid
&code_challenge=l-kik2UPt2cInWJK6liasiRBhdpNm3qeOqUma_4Ih7E
&code_challenge_method=S256
回应:
当我尝试使用以下参数通过 Postman 生成 token 时,我只得到 id_token
和 refresh_token
而没有访问 token ,如下所示:
POST https://sritenantb2c.b2clogin.com/sritenantb2c.onmicrosoft.com/B2C_1_Signin/oauth2/v2.0/token
client_id:742978eb-ccb4-4b82-8140-xxxxxxxxxx
grant_type:authorization_code
scope:openid
code: <paste code from above step>
redirect_uri: https://jwt.ms
code_verifier:hMl0zyCvyUKJxS1gjOPqFNf1LPQ~tcvekFJeWsfzFGSFMi5~QkpCAq1QHMDT3N
回应:
要获取访问 token ,请通过公开 API 添加新范围,如下所示:
现在,在您的应用程序中添加此范围
,该范围将受到委派权限的约束,如下所示:
确保向上述范围授予管理员同意,如下所示:
现在,通过在浏览器中运行以下授权请求再次生成代码
https://sritenantb2c.b2clogin.com/sritenantb2c.onmicrosoft.com/B2C_1_Signin/oauth2/v2.0/authorize?
client_id=742978eb-ccb4-4b82-8140-xxxxxxxxxx
&response_type=code
&redirect_uri=https://jwt.ms
&response_mode=query
&scope=https://sritenantb2c.onmicrosoft.com/742978eb-ccb4-4b82-8140-xxxxxxxxxx/.default
&code_challenge=l-kik2UPt2cInWJK6liasiRBhdpNm3qeOqUma_4Ih7E
&code_challenge_method=S256
回应:
我通过 Postman 使用以下参数成功生成了访问 token ,如下所示:
POST https://sritenantb2c.b2clogin.com/sritenantb2c.onmicrosoft.com/B2C_1_Signin/oauth2/v2.0/token
client_id:742978eb-ccb4-4b82-8140-xxxxxxxxxx
grant_type:authorization_code
scope: https://sritenantb2c.onmicrosoft.com/742978eb-ccb4-4b82-8140-xxxxxxxxxxx/Admin.Read openid
code: <paste code from above step>
redirect_uri: https://jwt.ms
code_verifier:hMl0zyCvyUKJxS1gjOPqFNf1LPQ~tcvekFJeWsfzFGSFMi5~QkpCAq1QHMDT3N
回应:
当我在 jwt.ms 中解码上述访问 token 时,我得到了 scp
声明,如下所示:
关于php - 具有 OpenID Connect 和 PKCE 的 Azure B2C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75460287/
我是 OAuth 世界的新手,我想了解使用 PKCE 相对于传统授权代码授予的好处。 (我的许多假设可能是错误的,所以我会感谢你的更正。) 我是一名移动应用程序开发人员,根据 OAuth 文档,客户端
我知道 OAuth 2.0 Authorization Code with PKCE Flow 是 OAuth 的最佳实践。我们计划将它用于我们的 WEB 应用程序。但我不明白如何在不使用浏览器进行身
我很高兴听到我现在可以使用 Spotify Web API,而无需通过 PKCE 使用后端应用程序。不幸的是,我似乎有某种误解,无法让它发挥作用。 在此过程中,我可能会犯一些小错误,但我做了一次但无济
我有一个客户端应用程序,我想使用 Auth0 进行授权,我正在使用此处描述的工作流程: https://auth0.com/docs/api-auth/tutorials/authorization-
我正在编写将与某些 Oauth2 提供程序集成的客户端应用程序。我将使用 native android 应用程序作为前端,将 spring-boot 作为后端。我想在 PKCE 中使用 authori
我正在考虑将我的 Angular 应用程序中的身份验证流程从隐式流程升级为使用 pkce 的授权代码流程。我使用 Azure AD 作为身份验证提供程序。 我在 Microsoft 文档中没有找到与
在 Angular6+ 应用程序中实现 MSAL 库以与 AZURE AD 集成时,我需要一些输入。 当我阅读微软文档时,我遇到了两个流程“隐式授权流程”和“身份验证代码流程”。微软团队自己建议,与“
我希望扩展我们的 ID 服务器实例以支持移动应用程序,并希望将授权代码流与 PKCE 一起使用。由于这是一个公共(public)客户端,我不希望将 secret 存储在应用程序上,但似乎 ID3 需要
我尝试使用 pkce 和授权代码流从 keycloak 获取 token ,但没有成功。 请求参数(来自 postman ): curl -X POST \ http://keycloak-ar.
我们有用 .NET CORE 编写的 REST Web API,用于 REACT SPA,我们将 OKTA 与 PKCE 结合使用。 对于我们的 API,我们有使用 postman/newman 编写
我开始使用 IdentityServer4,并通过资源所有者流程完成了它,但由于不再推荐 PKCE,我决定更改它。我收到以下错误消息,这很明显,因为我不再使用 GrantTypes.ResourceO
我有一个现有的 Angular 应用程序,它使用 angular-oauth2-oidc 连接到本地托管的身份服务器。我已经剥离了 angular-oauth2-oidc 组件并实现了与 AWS Co
我被要求将一个新的 Web 应用程序与我们的 B2C 实现集成,并且要求是通过 PKCE 支持 Grant Flow。 B2C/IEF 支持吗?有关所需步骤的任何指示? 我充满希望,因为我找到了 th
我正在尝试使用 PKCE 将 Discord OAuth 添加到移动应用程序。我能够成功使用 DiscordAPI 进行身份验证,并且收到从服务器返回的代码。 但是,当我尝试调用 https://di
是否可以在当前版本的 Spring Security 中为 PKCE 身份验证创建授权服务器? 我做了研究,发现了这个授权服务器项目 https://github.com/spring-project
我正在尝试使用 PKCE 将 Discord OAuth 添加到移动应用程序。我能够成功使用 DiscordAPI 进行身份验证,并且收到从服务器返回的代码。 但是,当我尝试调用 https://di
是否可以在当前版本的 Spring Security 中为 PKCE 身份验证创建授权服务器? 我做了研究,发现了这个授权服务器项目 https://github.com/spring-project
默认情况下,AppAuth发送 S256 PKCE身份验证请求的代码挑战。如果我需要与仅支持 plain 代码挑战方法的服务器进行互操作,我该如何配置我的授权请求? 最佳答案 iOS:您可以使用 OI
我正在构建 2 个应用程序;一个前端,一个后端。 后端将使用 Rails API + Doorkeeper Gem(oauth2 提供程序)构建,而前端将使用 React Native 构建。 目前,
将授权代码流与 Spotify-API 的 PKCE 一起使用,我收到错误,我的 code_verifier 不正确,据我目前所知,这必须是编码问题。{"error":"invalid_grant",
我是一名优秀的程序员,十分优秀!