华为auth服务集成.net core 3.1,无法验证JWT
Huawei auth service integration with .net core 3.1, unable to validate JWT
我们有一个 react-native 应用程序 运行 在生产中使用 firebase phone auth。最近,我们收到了来自拥有新华为设备的用户的反馈,他们无法使用 firebase 使用他们的 phone 号码进行身份验证。
由于很多用户开始遇到这个问题,我们决定只为 HarmonyOS 下的设备实施华为身份验证服务,并为其他用户保留常规的 firebase phone 身份验证。
将 Huawei App Gallery Connect Auth SDK 集成到我们的 react-native 应用程序中后,我们能够接收 OTP 并使用 credentialWithVerifyCode
登录用户,我们还能够使用检索用户的令牌
idToken =(await (await AGCAuth.getInstance().currentUser()).getToken()).token;
idToken 是一个 JWT 令牌,看起来像这样
eyJhbGciOiJIUzUxMiJ9.eyJ0b2tlbiI6IjVCMzQ5OTM5ODBFNEYxRUQwNDBDOTBEMjA1Q0U4QTJCNzRFMTg3RkUyRDNDQzY4N0E3MUVCMUZFQ0VBMDZDQTEifQ.xtAXTzfpzqRHAvDP3fJjdctnNoFHFmqawWJBGqG4y3qBSeo1XNHFyNOPnL-V6BCmkpxGIO3eq2eYJShIJhad-A
里面的payload包含另一个token(不是JWT),但我们不认为这是问题所在,我们也尝试了一个包含所有用户信息的token。
将 JWT 发送到我们的 .NET Core 3.1 网络后 API 我们无法使用 JwtBearerExtensions.AddJwtBearer
验证令牌
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(
JwtBearerDefaults.AuthenticationScheme,
o =>
{
o.Authority = "https://oauth-login.cloud.huawei.com";
});
权限设置为 https://oauth-login.cloud.huawei.com
,发行者设置为 https://accounts.huawei.com
,这似乎不合适,因为在 firebase 中,发行者看起来更像:https://securetoken.google.com/YOUR_PROJECT
我们得到的错误是:
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10503: Signature validation failed. Keys tried: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
Exceptions caught:
'[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
token: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[7]
发生错误可能是因为权限不正确。
我们无法弄清楚问题出在哪里,我们找不到验证令牌所需的权限。
建议您使用以下方法验证token。
try {
AuthAccessToken authAccessToken = agcAuth.verifyAccessToken(accessToken, true);
} catch (AGCAuthException e) {
if (e.getErrorCode() == AuthErrorCode.VERIFY_ACCESS_TOKEN_ACCESS_TOKEN_IS_NULL.getErrorCode()) {
// The user access token is empty.
} else if (e.getErrorCode() == AuthErrorCode.JWT_VERIFY_FAILED.getErrorCode()) {
// Failed to authenticate the user access token.
} else if (e.getErrorCode() == AuthErrorCode.JWT_EXPIRE.getErrorCode()) {
// The user access token has expired.
} else if (e.getErrorCode() == AuthErrorCode.JWT_REVOKED.getErrorCode()) {
// The user access token has been revoked.
}
详情请参考this docs。
经过进一步调查并联系了华为开发者支持,这是我们发现的:
华为授权服务生成的令牌使用 HS512 作为其签名算法,如果将令牌放入 jwt.io 调试器,您将看到 {"alg": "HS512"}
。
让我们感到困惑的是,算法 HS512 在 docs 中被列为受支持,但实际上并不支持它以及 .net 核心身份模型中的所有对称算法。
我们剩下的唯一解决方案是按照他们的文档中所述手动验证令牌,这种解决方案不适合我们,因为 firebase 身份验证依赖于我们应用程序中的开放 ID 连接。
我们有一个 react-native 应用程序 运行 在生产中使用 firebase phone auth。最近,我们收到了来自拥有新华为设备的用户的反馈,他们无法使用 firebase 使用他们的 phone 号码进行身份验证。
由于很多用户开始遇到这个问题,我们决定只为 HarmonyOS 下的设备实施华为身份验证服务,并为其他用户保留常规的 firebase phone 身份验证。
将 Huawei App Gallery Connect Auth SDK 集成到我们的 react-native 应用程序中后,我们能够接收 OTP 并使用 credentialWithVerifyCode
登录用户,我们还能够使用检索用户的令牌
idToken =(await (await AGCAuth.getInstance().currentUser()).getToken()).token;
idToken 是一个 JWT 令牌,看起来像这样
eyJhbGciOiJIUzUxMiJ9.eyJ0b2tlbiI6IjVCMzQ5OTM5ODBFNEYxRUQwNDBDOTBEMjA1Q0U4QTJCNzRFMTg3RkUyRDNDQzY4N0E3MUVCMUZFQ0VBMDZDQTEifQ.xtAXTzfpzqRHAvDP3fJjdctnNoFHFmqawWJBGqG4y3qBSeo1XNHFyNOPnL-V6BCmkpxGIO3eq2eYJShIJhad-A
里面的payload包含另一个token(不是JWT),但我们不认为这是问题所在,我们也尝试了一个包含所有用户信息的token。
将 JWT 发送到我们的 .NET Core 3.1 网络后 API 我们无法使用 JwtBearerExtensions.AddJwtBearer
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(
JwtBearerDefaults.AuthenticationScheme,
o =>
{
o.Authority = "https://oauth-login.cloud.huawei.com";
});
权限设置为 https://oauth-login.cloud.huawei.com
,发行者设置为 https://accounts.huawei.com
,这似乎不合适,因为在 firebase 中,发行者看起来更像:https://securetoken.google.com/YOUR_PROJECT
我们得到的错误是:
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10503: Signature validation failed. Keys tried: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
Exceptions caught:
'[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
token: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[7]
发生错误可能是因为权限不正确。
我们无法弄清楚问题出在哪里,我们找不到验证令牌所需的权限。
建议您使用以下方法验证token。
try {
AuthAccessToken authAccessToken = agcAuth.verifyAccessToken(accessToken, true);
} catch (AGCAuthException e) {
if (e.getErrorCode() == AuthErrorCode.VERIFY_ACCESS_TOKEN_ACCESS_TOKEN_IS_NULL.getErrorCode()) {
// The user access token is empty.
} else if (e.getErrorCode() == AuthErrorCode.JWT_VERIFY_FAILED.getErrorCode()) {
// Failed to authenticate the user access token.
} else if (e.getErrorCode() == AuthErrorCode.JWT_EXPIRE.getErrorCode()) {
// The user access token has expired.
} else if (e.getErrorCode() == AuthErrorCode.JWT_REVOKED.getErrorCode()) {
// The user access token has been revoked.
}
详情请参考this docs。
经过进一步调查并联系了华为开发者支持,这是我们发现的:
华为授权服务生成的令牌使用 HS512 作为其签名算法,如果将令牌放入 jwt.io 调试器,您将看到 {"alg": "HS512"}
。
让我们感到困惑的是,算法 HS512 在 docs 中被列为受支持,但实际上并不支持它以及 .net 核心身份模型中的所有对称算法。
我们剩下的唯一解决方案是按照他们的文档中所述手动验证令牌,这种解决方案不适合我们,因为 firebase 身份验证依赖于我们应用程序中的开放 ID 连接。