华为 auth 服务与 .net core 3.1 集成,无法验证 JWT

Posted

技术标签:

【中文标题】华为 auth 服务与 .net core 3.1 集成,无法验证 JWT【英文标题】:Huawei auth service integration with .net core 3.1, unable to validate JWT 【发布时间】:2021-12-21 18:11:33 【问题描述】:

我们有一个使用 firebase phone auth 在生产中运行的 react-native 应用程序。最近,我们收到了来自拥有新华为设备的用户无法使用 Firebase 对其电话号码进行身份验证的反馈。

由于很多用户开始遇到这个问题,我们决定只为 HarmonyOS 下的设备实施华为身份验证服务,并为其他用户保留常规的 firebase 电话身份验证。

在我们的 react-native 应用程序中集成 Huawei App Gallery Connect Auth SDK 后,我们能够接收 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 Web 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]

发生错误可能是因为权限不正确。

我们无法找出问题所在,我们无法找到验证令牌所需的权限。

【问题讨论】:

【参考方案1】:

建议您使用以下方法验证令牌。

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。

【讨论】:

感谢@shirley 的回答,我们使用的是 .net 核心,并且提供的文档适用于 Java。此外,我们不能使用这种方法,因为我们已经在使用 addJwtBearer 和 Firebase Auth。如果我们选择使用这种方法,我们还必须手动验证 firebase 令牌 hi@Reda,我们目前不支持 .net 核心接口,但我们会记录此要求并将其反馈给产品团队。感谢您的反馈。 您好@shirley,感谢您的回复。我只是想问一下华为Auth服务是否支持openId connect? hi@Reda,您可以尝试使用REST API 看看是否有帮助。【参考方案2】:

经过更多调查并联系华为开发者支持后,我们发现:

Huawei Auth服务生成的token使用HS512作为签名算法,将token放入jwt.io调试器会看到"alg": "HS512"

让我们感到困惑的是,算法 HS512 在 docs 中被列为支持,但实际上并不支持它以及 .net 核心身份模型中的所有对称算法。

Github issue

我们剩下的唯一解决方案是按照他们的文档中所述手动验证令牌,这种解决方案不适合我们,因为 firebase 身份验证依赖于我们应用程序中的开放 ID 连接。

【讨论】:

以上是关于华为 auth 服务与 .net core 3.1 集成,无法验证 JWT的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .NET Core 3.1 中的 F# 访问 WCF 服务?

.NET Core 2 WebAPI CORS 与 Angular 4 前端和 Windows Auth 的问题

ASP.NET Core 3.1 MVC AddOpenIDConnect 与 IdentityServer3

Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作

使用 TFS 代理将构建服务器配置为具有 .NET Core 2.1 和 .NET Core 3.1

Auth0 .NET Core - 从 access_token 读取权限