我需要通过签名和加密来保护我的网络令牌.我编写了下一行代码:
var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, owner.Name),
new Claim(ClaimTypes.Role, owner.RoleClaimType),
new Claim("custom claim type", "custom content")
}),
TokenIssuerName = "self",
AppliesToAddress = "http://www.example.com",
Lifetime = new Lifetime(now, now.AddSeconds(60 * 3)),
EncryptingCredentials = new X509EncryptingCredentials(new X509Certificate2(cert)),
SigningCredentials = new X509SigningCredentials(cert1)
};
var token = (JwtSecurityToken)tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
Run Code Online (Sandbox Code Playgroud)
所以,我正在使用一些生成的证书makecert.exe.然后我用另一个读取令牌字符串JwtSecurityTokenHandler:
var tokenHandlerDecr = new JwtSecurityTokenHandler();
var tok = tokenHandlerDecr.ReadToken(tokenString);
Run Code Online (Sandbox Code Playgroud)
并且令牌内容未加密(我可以tok在调试器下看到变量中的json ).我究竟做错了什么?如何加密令牌数据?
我正在iOS(7)客户端实现JSON Web Token身份验证.它工作得很好.我的应用程序接收令牌,并可以使用它们对我的服务器进行经过身份验证的调用.
现在,我希望我的客户端代码检查令牌上的到期日期,以便它可以知道何时重新进行身份验证.检查JWT身份验证令牌的到期日期非常简单.授权令牌是3个base64编码的JSON blob,用'.'分隔.- 到期时间戳位于中间blob中,在一个名为的字段中ext.这是unix时代以来的几秒钟.
所以我的代码看起来像这样:
- (NSDate*) expirationDate
{
if ( !_tokenAppearsValid ) return nil;
if ( !_parsedExpirationDate )
{
//
// Token is three base64 encoded payloads separated by '.'
// The payload we want is the middle one, which is a JSON dict, with
// 'exp' being the unix seconds timestamp of the expiration date
// Returning nil is appropriate if no 'exp' is findable
//
NSArray *components = [self.token componentsSeparatedByString:@"."];
NSString *payload = …Run Code Online (Sandbox Code Playgroud) 据我所知,OAuth 2.0规范在access token应采取的形式方面非常模糊:
令牌可以表示用于检索授权信息的标识符,或者可以以可验证的方式自包含授权信息(即,由一些数据和签名组成的令牌串).可能需要额外的身份验证凭据(超出本规范的范围),以便客户端使用令牌.
访问令牌提供抽象层,用资源服务器理解的单个令牌替换不同的授权构造(例如,用户名和密码).这种抽象使得发布访问令牌比用于获取它们的授权授权更具限制性,并且消除了资源服务器理解各种身份验证方法的需要.
访问令牌可以具有基于资源服务器安全性要求的不同格式,结构和利用方法(例如,加密属性). 访问令牌属性和用于访问受保护资源的方法超出了本规范的范围,并由协议规范(如RFC6750)定义.
(重点补充)
链接的RFC6750没有提供更多的进一步特异性.有一个示例HTTP响应正文显示:
{
"access_token":"mF_9.B5f-4.1JqM",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA"
}
Run Code Online (Sandbox Code Playgroud)
这似乎表明access_token可以是不透明的ASCII文本,例如编码的JSON Web令牌(JWT)
从我的角度来看,似乎JWT-as-access_token具有一些理想的属性:
它是一个已知的规范,具有相当广泛的采用和许多语言的客户端库.
它允许使用经过审查的加密库轻松签名和验证.
因为它可以解码为JSON,所以它允许我们在令牌本身中包含有关令牌的元数据和信息.
我的问题是:首先,允许访问令牌是JWT吗?其次,如果根据规范是允许的,那么使用JWT作为访问令牌会有什么额外的考虑因素吗?
我有一种感觉,这将是一个快速的答案,但我似乎无法在网上找到任何明确的答案 - jsonwebtoken npm包和express-jwt npm包之间的区别是什么?我认为 express-jwt是在jsonwebtoken之上编写的,只是验证传入的令牌并设置req.user为JWT上的用户有效负载.
那是对的吗?很抱歉,如果这是一个总的noob问题...我刚刚开始学习身份验证和node/express,所以这对我来说都是新手.
我有一个像这样的jwt令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
Run Code Online (Sandbox Code Playgroud)
我如何解码这个,以便我可以像这样得到有效载荷
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Run Code Online (Sandbox Code Playgroud)
我使用过这个 库,却找不到办法做我想做的事
我正在JWT(JsonWebToken)计划的帮助下实现登录系统.基本上在用户登录/登录后,服务器签署JWT并将其传递给客户端.
然后,客户端返回每个请求的令牌,服务器在发回响应之前验证令牌.
这几乎是你所期望的,但我对这个过程的逻辑有一些问题.从我读过的所有数学文章来看,似乎RSA签名使用非对称密钥进行签名.正如其名称所示,公钥暴露给客户端并且私钥保留在服务器上,使用发送到客户端的公钥对JWT进行签名并使用服务器端验证它是有意义的.私钥.
然而,在每个示例和库中,我看到它似乎是另一种方式,任何想法为什么它是这样的?如果JWT使用私钥签名并与公共密钥进行验证,那么这一点是什么?
JOSE、JWA、JWE、JWK、JWS 和 JWT 之间有什么区别?它们之间有何关系?
在尝试验证令牌时,我得到以下异常的原因是什么?
TokenValidationParameters validationParameters = new TokenValidationParameters();
validationParameters.ValidIssuers = new List<string>() { "http://www.company.com" };
validationParameters.IssuerSigningToken = new RsaSecurityToken(
(System.Security.Cryptography.RSACryptoServiceProvider) Certificate.Get().PublicKey.Key);
SecurityToken securityToken = null;
var claimsPrincipal =
(FederatedAuthentication
.FederationConfiguration
.IdentityConfiguration
.SecurityTokenHandlers
.First() as JwtSecurityTokenHandler)
.ValidateToken(tokenString, validationParameters, out securityToken);
Run Code Online (Sandbox Code Playgroud)
错误:
IDX10500: Signature validation failed. Unable to resolve SecurityKeyIdentifier:
'SecurityKeyIdentifier
(
IsReadOnly = False,
Count = 2,
Clause[0] = X509ThumbprintKeyIdentifierClause(
Hash = 0x6B7ACC520305BFDB4F7252DAEB2177CC091FAAE1),
Clause[1] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
)
',
token: '{"typ":"JWT","alg":"RS256","
Run Code Online (Sandbox Code Playgroud) 我正在使用Identity Server 4和Implicit Flow,并且想要向访问令牌添加一些声明,新的声明或属性是"tenantId"和"langId".
我已将langId添加为我的范围之一,如下所示,然后通过身份服务器请求,但我也获得了tenantId.怎么会发生这种情况?
这是范围列表和客户端配置:
public IEnumerable<Scope> GetScopes()
{
return new List<Scope>
{
// standard OpenID Connect scopes
StandardScopes.OpenId,
StandardScopes.ProfileAlwaysInclude,
StandardScopes.EmailAlwaysInclude,
new Scope
{
Name="langId",
Description = "Language",
Type= ScopeType.Resource,
Claims = new List<ScopeClaim>()
{
new ScopeClaim("langId", true)
}
},
new Scope
{
Name = "resourceAPIs",
Description = "Resource APIs",
Type= ScopeType.Resource
},
new Scope
{
Name = "security_api",
Description = "Security APIs",
Type= ScopeType.Resource
},
};
}
Run Code Online (Sandbox Code Playgroud)
客户:
return new List<Client>
{
new Client
{
ClientName = "angular2client", …Run Code Online (Sandbox Code Playgroud) c# jwt thinktecture-ident-server openid-connect identityserver4
我将把JWT应用到我使用Java-Jersey开发的REST API中.我正在为JWT使用这个库 - https://github.com/auth0/java-jwt
关于JWT - Secret,我几乎没有问题
Secret必须是独一无二的吗?