标签: jwt-auth

ASP.NET Core 3.1 JWT 签名在使用 AddJwtBearer() 时无效

问题:AddJwtBearer()失败,但手动验证令牌有效。

我正在尝试使用非对称 RSA 算法生成和验证 JWT。

我可以使用此演示代码很好地生成 JWT

[HttpPost("[action]")]
[Authorize]
[ValidateAntiForgeryToken]
public async Task<IActionResult> JwtBearerToken() {
    AppUser user = await userManager.GetUserAsync(User);

    using RSA rsa = RSA.Create(1024 * 2);
    rsa.ImportRSAPrivateKey(Convert.FromBase64String(configuration["jwt:privateKey"]), out int _);
    var signingCredentials = new SigningCredentials(new RsaSecurityKey(rsa), SecurityAlgorithms.RsaSha256);

    var jwt = new JwtSecurityToken(
        audience: "identityapp",
        issuer: "identityapp",
        claims: new List<Claim>() {new Claim(ClaimTypes.NameIdentifier, user.UserName)},
        notBefore: DateTime.Now,
        expires: DateTime.Now.AddHours(3),
        signingCredentials: signingCredentials
    );

    string token = new JwtSecurityTokenHandler().WriteToken(jwt);

    return RedirectToAction(nameof(Index), new {jwt = token});
}
Run Code Online (Sandbox Code Playgroud)



我还可以使用下面的演示代码验证令牌及其签名

[HttpPost("[action]")]
[ValidateAntiForgeryToken]
public IActionResult JwtBearerTokenVerify(string …
Run Code Online (Sandbox Code Playgroud)

c# encryption-asymmetric jwt asp.net-core jwt-auth

7
推荐指数
1
解决办法
3841
查看次数

ES256 JWT 验证 - SignatureException:签名编码无效:java.io.IOException:序列标记错误

嗨,我有一个使用 Elliptic Curve ES256 签名的 JWT,我正在尝试验证它:

eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ.eyJpc3MiOiJodHRwczovL2p3dC1pZHAuZXhhbXBsZS5jb20iLCJzdWIiOiJtYWlsdG86bWlrZUBleGFtcGxlLmNvbSIsIm5iZiI6MTU3NTY1NjY3NCwiZXhwIjoxOTI0OTkxOTk5LCJpYXQiOjE1NzU2NTY2NzQsImp0aSI6ImlkMTIzNDU2IiwidHlwIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9yZWdpc3RlciJ9.kcj0QQrERKIfny1TfHY-Z9iDFazr84xCssTDuXtV1n1dvY7CYXuP5ZBvpi9ArOQjsS8YCd0bKsWaQ-17VnF_1A
Run Code Online (Sandbox Code Playgroud)

使用此公钥:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoBUyo8CQAFPeYPvv78ylh5MwFZjT
CLQeb042TjiMJxG+9DLFmRSMlBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ==
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

这只是

eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ.eyJpc3MiOiJodHRwczovL2p3dC1pZHAuZXhhbXBsZS5jb20iLCJzdWIiOiJtYWlsdG86bWlrZUBleGFtcGxlLmNvbSIsIm5iZiI6MTU3NTY1NjY3NCwiZXhwIjoxOTI0OTkxOTk5LCJpYXQiOjE1NzU2NTY2NzQsImp0aSI6ImlkMTIzNDU2IiwidHlwIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9yZWdpc3RlciJ9.kcj0QQrERKIfny1TfHY-Z9iDFazr84xCssTDuXtV1n1dvY7CYXuP5ZBvpi9ArOQjsS8YCd0bKsWaQ-17VnF_1A
Run Code Online (Sandbox Code Playgroud)

它在https://jwt.io/ 上正确验证但是当我尝试使用本机 Java 验证它时,它引发了一个错误:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoBUyo8CQAFPeYPvv78ylh5MwFZjT
CLQeb042TjiMJxG+9DLFmRSMlBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ==
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

{
  "kty": "EC",
  "use": "sig",
  "crv": "P-256",
  "kid": "1234",
  "x": "oBUyo8CQAFPeYPvv78ylh5MwFZjTCLQeb042TjiMJxE=",
  "y": "vvQyxZkUjJQUPU/0bCy3Pj5qQdfu8jwEfqEeYGZ95CU=",
  "alg": "ES256"
}
Run Code Online (Sandbox Code Playgroud)

最后一行似乎引发了异常。


java.security.SignatureException: invalid encoding for signature: java.io.IOException: Sequence tag error
    at com.ibm.crypto.provider.AbstractSHAwithECDSA.engineVerify(Unknown Source)
    at java.security.Signature$Delegate.engineVerify(Signature.java:1219)
    at java.security.Signature.verify(Signature.java:652)
    at curam.platforminfrastructure.outbound.oauth2.impl.ValidateJWT.validateEllipticCurve(ValidateJWT.java:235)
    at curam.platforminfrastructure.outbound.oauth2.impl.ValidateJWT.validateJWT(ValidateJWT.java:88)
    at curam.platforminfrastructure.outbound.oauth2.impl.ValidateJWT.testJWT(ValidateJWT.java:53)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at …
Run Code Online (Sandbox Code Playgroud)

java cryptography elliptic-curve java-security jwt-auth

6
推荐指数
1
解决办法
1434
查看次数

为什么在 jwt 标头中发送算法

在 JWT 令牌中,我们在标头中发送用于签署 JWT 的算法类型,它只是 base64 编码的。任何人都可以轻松了解算法。例如

{ "alg":"HS256" }
Run Code Online (Sandbox Code Playgroud)

为什么我们将它发送给客户,因为客户不需要知道它。发送算法不是更安全吗?

jwt jwt-auth

6
推荐指数
1
解决办法
119
查看次数

ASP Net Core IdentityServer,生产环境中的“颁发者无效”

我正在尝试在生产(AWS Elasticbeanstalk 服务器)上部署一个使用 IdentityServer 的简单 asp 网络核心项目;我的测试项目基本上是启用了身份验证的 Visual Studio 2019 的 React.js 模板。

在开发中一切正常,但在生产中,当尝试使用 jwt 令牌对我的 api 进行身份验证时出现错误。

WWW-Authenticate: Bearer error="invalid_token", error_description="The issuer 'http://***.elasticbeanstalk.com' is invalid"
Run Code Online (Sandbox Code Playgroud)

使用的 access_token 是调用返回的内容

POST http://***.elasticbeanstalk.com/connect/token
Run Code Online (Sandbox Code Playgroud)

奇怪的行为是以下请求

GET http://***.elasticbeanstalk.com/connect/userinfo
Run Code Online (Sandbox Code Playgroud)

它正确返回了用户数据,这里使用了access_token,所以我认为令牌是正确的。

不幸的是,对我的 api 的请求因上述错误而失败。

我的Startup.cs代码是这样的:

WWW-Authenticate: Bearer error="invalid_token", error_description="The issuer 'http://***.elasticbeanstalk.com' is invalid"
Run Code Online (Sandbox Code Playgroud)

appsetting.json文件包含此:

POST http://***.elasticbeanstalk.com/connect/token
Run Code Online (Sandbox Code Playgroud)

bearer-token amazon-elastic-beanstalk identityserver4 jwt-auth asp.net-core-3.1

6
推荐指数
1
解决办法
2361
查看次数

如何在 Angular 8 中检查 JWT 令牌是否已过期

在 Angular 8 中,有哪些不同的方法可以检查 JWT 令牌是否已过期。到期时间为1小时。工作代码/示例将不胜感激。

angular jwt-auth

6
推荐指数
2
解决办法
2万
查看次数

使用承载令牌授权标头(flask_restful +flask_jwt_extended)发送 GET 消息时出现“段不足”

我在 Flask 应用程序中收到此错误:

curl http://0.0.0.0:8080/ -H "Authorization: Bearer TGazPL9rf3aIftplCYDTGDc8cbTd"
{
  "msg": "Not enough segments"
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例:

from flask import Flask
from flask_restful import Resource, Api
from flask_jwt_extended import JWTManager, jwt_required

app = Flask(__name__)
jwt = JWTManager(app)
api = Api(app)


class HelloWorld(Resource):
    @jwt_required
    def get(self):
        return {'hello': 'world'}


api.add_resource(HelloWorld, '/')
Run Code Online (Sandbox Code Playgroud)

安慰:

 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active! …
Run Code Online (Sandbox Code Playgroud)

flask flask-restful pyjwt flask-jwt-extended jwt-auth

6
推荐指数
1
解决办法
9704
查看次数

如何以与供应商无关的方式从移动应用程序实现二维码交叉登录作为网站或 web 应用程序的身份验证方法?

我正在为我的 web 应用程序使用 Django 2.2。

而且我一直在寻找适合使用移动应用程序通过二维码交叉登录到 webapp 的教程。

基本上工作流程是这样的:

预期工作流程

  1. 用户通过桌面访问网站
  2. 选择用户名/密码或二维码登录(我们假设用户已注册)
  3. 用户选择二维码登录
  4. 提示用户安装移动应用程序(可以是 android 或 iOS)
  5. 用户安装移动应用程序并使用用户名/密码登录。
  6. 在移动应用程序上,用户然后同意使用二维码作为替代登录(这是一次完成)
  7. 此后,在以后的登录中,当用户按照步骤 3 选择二维码登录时,他们使用移动应用程序扫描网站登录页面上生成的二维码。
  8. 然后移动应用程序使用 FaceID 或 FingerPrint ID(假设为 iOS)来允许登录。用户按下移动应用程序上的“是”按钮以确认登录。
  9. 以某种方式动态通知 web 应用程序并允许在桌面浏览器上登录。

我不太明白后端的移动和网络应用程序如何相互协作以无缝实现这一目标。

我发现了什么

我确实找到了这个似乎不再维护的库https://github.com/aruseni/django-qrauth。但是我仍然不太明白移动应用程序和 webapp 后端之间的流程是如何工作的。

我还发现这个https://medium.com/@ksarthak4ever/django-two-factor-authentication-2ece42748610似乎将手机用作 2FA 设备。除非我误解了,否则不完全是我正在寻找的用例。

我确实找到了这篇文章https://backendless.com/how-to-implement-mobile-to-web-cross-login-using-a-qr-code/这就是给我“交叉登录”这个词的原因。然而,这篇文章严重倾向于这个特定的供应商。

我正在寻找对概念的“理解”,而不依赖于供应商实现的细节。

我不是在寻找什么

如果我的问题措辞不当并被误解,我将本节包含在内以明确我不寻找的内容。

我不是在寻找二维码作为身份验证器应用程序的 2FA 确认的用例。

我还没有查看代码示例。我只想首先清楚地了解移动和网络应用程序之间的工作方式。尽管我在猜测,但我相信 JWT 是必需的。

工作流比实际代码更受欢迎,因为我想首先了解它是如何工作的。

django qr-code jwt-auth

6
推荐指数
2
解决办法
1804
查看次数

类型错误:load_pem_private_key() 缺少 1 个必需的位置参数:“后端”

我正在尝试使用 adobe API2.0 提取 adobe 分析数据,我是这方面的新手,因此在此repo 之后,我确实提供了所有详细信息,例如 APIKEY、techaccountID、org_id、客户端机密、修改后的 config.ini。在生成 JWT 令牌时,我收到以下错误。

TypeError: load_pem_private_key() missing 1 required positional argument: 'backend'
Run Code Online (Sandbox Code Playgroud)

这是我的代码,

def get_jwt_token(config):
    with open(config["key_path"], 'r') as file:
        private_key = file.read()

    return jwt.encode({
        "exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30),
        "iss": config["orgid"],
        "sub": config["technicalaccountid"],
        "https://{}/s/{}".format(config["imshost"], config["metascopes"]): True,
        "aud": "https://{}/c/{}".format(config["imshost"], config["apikey"])
    }, private_key, algorithm='RS256')


config = dict(config_parser["default"])
jwt_token = get_jwt_token(config)
logger.info("JWT Token: {}".format(jwt_token))
access_token = get_access_token(config, jwt_token)
logger.info("Access Token: {}".format(access_token))
Run Code Online (Sandbox Code Playgroud)

这是错误消息,

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-8c61bcf6ee58> in <module>
      1 config …
Run Code Online (Sandbox Code Playgroud)

python adobe adobe-analytics jwt-auth

6
推荐指数
1
解决办法
2367
查看次数

Tymon\JWTAuth::toUser 错误:需要令牌

我有一个使用 Tymon\JWTAuth 对用户进行身份验证的 Larvel API。

它工作正常。

出于某些原因,我还有一条不受保护的路线web.php

Route::get('myroute', 'MyController@mymethod');
Run Code Online (Sandbox Code Playgroud)

MyController@mymethod 的代码如下:

$user = JWTAuth::toUser($request->input('token'));

// I tried also this:
// JWTAuth::setToken($request->input('token'));
// $user = JWTAuth::authenticate();
Run Code Online (Sandbox Code Playgroud)

我在浏览器中使用这个 url 调用路由: /myroute?token=eyJ0eXAiOiJKV1QiLCJhbGci....

问题是我在 JWT.php 中有一个异常:

Tymon \ JWTAuth \ Exceptions \ JWTException 需要一个令牌

JWT.php

protected function requireToken()
{
    if (! $this->token) {
        throw new JWTException('A token is required');
    }
}
Run Code Online (Sandbox Code Playgroud)

如何解码作为 URL 参数传递而不是在请求标头中的令牌?

authentication jwt laravel laravel-5 jwt-auth

5
推荐指数
1
解决办法
7060
查看次数

应该存储哪些 JWT 令牌以备后用?

我正在查看用于用户登录的已实现 Cognito,并希望更好地了解验证 JWT 的过程。

有问题的应用程序在 asp.net 4.5 MVC 上,与 .NET Core 无关。我可以在网上找到的有关 AWS Cognito 的唯一信息与 .NET 核心有关。

我理解此处记录的每种令牌类型的含义:https : //docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html# amazon-cognito-user-pools-using-the-id-token

我也了解验证 JWT 所需的步骤:https : //docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html

我的问题是需要验证哪个 JWT 以及在什么阶段?

示例 1.
用户登录,一旦登录,他们将返回访问、ID 和刷新令牌。
此时需要验证所有令牌还是仅需要验证访问令牌?

刷新令牌是否仅在尝试使用之前进行验证(以获得新的访问和 ID 令牌)?
或者是否应该根据任何授权的内容请求验证所有令牌?

哪些令牌应该存储在 FormsAuthentication Cookie 中以备后用?我们[Authorize]在 asp.net中使用标准模式。

authentication asp.net-mvc jwt amazon-cognito jwt-auth

5
推荐指数
1
解决办法
425
查看次数