问题: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) 嗨,我有一个使用 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) 在 JWT 令牌中,我们在标头中发送用于签署 JWT 的算法类型,它只是 base64 编码的。任何人都可以轻松了解算法。例如
{ "alg":"HS256" }
Run Code Online (Sandbox Code Playgroud)
为什么我们将它发送给客户,因为客户不需要知道它。发送算法不是更安全吗?
我正在尝试在生产(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
在 Angular 8 中,有哪些不同的方法可以检查 JWT 令牌是否已过期。到期时间为1小时。工作代码/示例将不胜感激。
我在 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) 我正在为我的 web 应用程序使用 Django 2.2。
而且我一直在寻找适合使用移动应用程序通过二维码交叉登录到 webapp 的教程。
基本上工作流程是这样的:
我不太明白后端的移动和网络应用程序如何相互协作以无缝实现这一目标。
我确实找到了这个似乎不再维护的库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 是必需的。
工作流比实际代码更受欢迎,因为我想首先了解它是如何工作的。
我正在尝试使用 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) 我有一个使用 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 参数传递而不是在请求标头中的令牌?
我正在查看用于用户登录的已实现 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中使用标准模式。
jwt-auth ×10
jwt ×4
adobe ×1
angular ×1
asp.net-core ×1
asp.net-mvc ×1
bearer-token ×1
c# ×1
cryptography ×1
django ×1
flask ×1
java ×1
laravel ×1
laravel-5 ×1
pyjwt ×1
python ×1
qr-code ×1