标签: jwt

jwt web令牌应该加密吗?

我正在阅读有关JWT Web令牌的文章作为响应用户的访问令牌.其中一些提到网络令牌应该能够由用户解码.

这是否意味着解密整个Web令牌不是一个好习惯?例如,我想将以下JWT Web令牌返回给用户,在这里可以解码这条信息.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
Run Code Online (Sandbox Code Playgroud)

但是,我觉得我不想让用户能够解码他/她的访问令牌,因此我使用另一种加密算法将所有内容加密到另一种形式,如下所示并传回给用户.

因此,当我在服务器中获取此访问令牌并对其进行解码时,我会解密此新文本.

如果我不希望向用户公开声明中的某些可用值(例如用户ID),是否建议以这种方式执行此操作?如果没有,有哪些替代方案?

encryption oauth oauth-2.0 jwt asp.net-web-api

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

使用 Apple 登录(iOS 应用程序 + 后端验证)API 返回错误“invalid_client”

我正在尝试使用 iOS 应用程序和后端实现使用 Apple 登录。目标是这样的:

  1. 用户登录 iOS 应用
  2. 在得到肯定响应后,应用程序调用后端的端点并移交 authorizationCode
  3. 后端现在需要authorizationCode通过另一个对苹果服务器的调用来验证。

在这里我很困惑。为了进行这个调用,后端需要提供一堆参数:

网址

https://appleid.apple.com/auth/token
Run Code Online (Sandbox Code Playgroud)

查询参数

client_id     = com.mycompany.appname
client_secret = ...
code          = ... // `authorizationCode` from the signin in the iOS app
grant_type    = authorization_code
Run Code Online (Sandbox Code Playgroud)

我已经产生JWTclient_secret

JWT 属性

header:
    kid: <key id, created on Apple Dev Portal>
claims:
    iss: <team id>
    iat: <current timestamp>
    exp: <current timestamp + 180 days>
    aud: "https://appleid.apple.com"
    sub: "com.mycompany.appname"
Run Code Online (Sandbox Code Playgroud)

昨天我在 Dev Portal 上为两个应用程序(A 和 B)创建了两个密钥,用它来生成秘密,今天应用程序 A …

oauth ios jwt apple-id sign-in-with-apple

17
推荐指数
3
解决办法
1万
查看次数

jwks是什么?jwks 的刷新和访问令牌到底有什么作用?

我正在开发一个具有访问和刷新令牌以及JWTJWKS 的身份验证系统。我的问题是我不知道JWKS的功能是什么。JWKS在使用JWT以及刷新令牌和访问令牌的身份验证系统中的功能是什么?该系统中的公钥和私钥是什么?JWKS需要连接数据库吗?

authentication oauth node.js jwt nestjs

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

在 python 中使用 PyJWT 解码 jwt 令牌给出错误 算法不支持

我正在使用 PyJWT 解码来自 keycloak 的 JWT 令牌。

eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ6MWpiUExrTndMVTBkTHk3a0NIT1pyS2FJd3FPMXFrbThDeGtvVHg2QzFBIn0..aksSjBU5hJ1rtn43NtbMt8E6gaGmJXDrtGDI7j0T7eo6PA cnUxG4spYNNhyksXVr3ZFvua2WyTKnZirqaJUI3zzdLj-XkE7zYCYWoJpjXITmmlj5oszD3pcRdGeyUVyQV49tIiUfUFi1KoIt9K016mH2s_beFrN3TYSjuLh5Epdk_dpNBh9YE_1f3opwsEbN2Jgz_j -VB6cQHq17RzWQIVSd6ZvftAWDWdc6nobOvTy1mZAA_DgsXwdjuNC8Qv36ztuDzkT-raCnuLH479ciBOFQZ0946obIE4ddJKpr7lnVupcbQZ6lDM_QZHz1hwkYqgSU-Ui8NHaWlqt4HJ5-9A

我的代码

import jwt
import traceback


try:
    public_key = """-----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhlOIQLHXwZoS3w9SBtvZ1ea4ftWmWnP+HCwlvs7XoJ9EhS+ZQEP7Z25tjW3I8mjUVL0XETrOOjQsD8O2nRBqizJsRaB8L9xsXdJmPHVTx7nphaBPtY5YHxxYqpwEC5rAKtx54YJxw6Ggeicmv+xXtaaDf/VALh5xxpa1U6yP5oqk3yV27yA0beQFVsdugkcfYN0C2FldaUcF9yTUf/KNHTYSu3Ar7iN9U+qEHwaznrLShwh7iknldTKTgEw3liHL8K/5ZlqxHPsL02InwZMaIRic3zNIgVvwedroM6nqZBB4mi1+T0dZn4qsNkG4D0w7IE7MTRgyyYARqrGEq5yOFwIDAQAB
    -----END PUBLIC KEY-----"""

    secret_key = "base-flask-oidc-secret-key"
    token = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ6MWpiUExrTndMVTBkTHk3a0NIT1pyS2FJd3FPMXFrbThDeGtvVHg2QzFBIn0.eyJleHAiOjE2MjE0MjQwMjEsImlhdCI6MTYyMTQyMzk2MSwiYXV0aF90aW1lIjoxNjIxNDIxNzc0LCJqdGkiOiIwYzY2Y2I0My1lMGY1LTQzNjItYTc2MS1lN2M2OWVhNDM5MjUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjpbIm1hc3Rlci1yZWFsbSIsImFjY291bnQiXSwic3ViIjoiN2Y2ODBlN2MtZGM4Yy00ZGJiLWJiZDEtMTE0ZGJhYjA2Zjc1IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiYW11bmRzZW4tZnJvbnRlbmQiLCJzZXNzaW9uX3N0YXRlIjoiYTM5YzJlNmUtZGNjMS00OTM5LTg0ODItYzk2NGE5ODMxNmYyIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjUwMDAiLCJsb2NhbGhvc3Q6NTAwMCJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiY3JlYXRlLXJlYWxtIiwib2ZmbGluZV9hY2Nlc3MiLCJhZG1pbiIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsibWFzdGVyLXJlYWxtIjp7InJvbGVzIjpbInZpZXctcmVhbG0iLCJ2aWV3LWlkZW50aXR5LXByb3ZpZGVycyIsIm1hbmFnZS1pZGVudGl0eS1wcm92aWRlcnMiLCJpbXBlcnNvbmF0aW9uIiwiY3JlYXRlLWNsaWVudCIsIm1hbmFnZS11c2VycyIsInF1ZXJ5LXJlYWxtcyIsInZpZXctYXV0aG9yaXphdGlvbiIsInF1ZXJ5LWNsaWVudHMiLCJxdWVyeS11c2VycyIsIm1hbmFnZS1ldmVudHMiLCJtYW5hZ2UtcmVhbG0iLCJ2aWV3LWV2ZW50cyIsInZpZXctdXNlcnMiLCJ2aWV3LWNsaWVudHMiLCJtYW5hZ2UtYXV0aG9yaXphdGlvbiIsIm1hbmFnZS1jbGllbnRzIiwicXVlcnktZ3JvdXBzIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJuYW1lIjoiYWRtaW5maXJzdCBhZG1pbmxhc3QiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImdpdmVuX25hbWUiOiJhZG1pbmZpcnN0IiwiZmFtaWx5X25hbWUiOiJhZG1pbmxhc3QiLCJlbWFpbCI6ImFkbWludGVzdEBnbWFpbC5jb20ifQ.aksSjBU5hJ1rtn43NtbMt8E6gaGmJXDrtGDI7j0T7eo6PAcnUxG4spYNNhyksXVr3ZFvua2WyTKnZirqaJUI3zzdLj-XkE7zYCYWoJpjXITmmlj5oszD3pcRdGeyUVyQV49tIiUfUFi1KoIt9K016mH2s_beFrN3TYSjuLh5Epdk_dpNBh9YE_1f3opwsEbN2Jgz_j-VB6cQHq17RzWQIVSd6ZvftAWDWdc6nobOvTy1mZAA_DgsXwdjuNc8Qv36ztuDzkT-raCnuLH479ciBOFQZ0946obIE4ddJKpr7lnVupcbQZ6lDM_QZHz1hwkYqgSU-Ui8NHaWlqt4HJ5-9A"
    # token_json = jwt.decode(token, secret_key, algorithms=['HS256', 'RS256'], audience='account')
    token_json = jwt.decode(token, public_key, algorithms=['HS256', 'RS256'], audience='account')
    print(access_token_json)
    
except Exception:
    print(traceback.print_exc())
Run Code Online (Sandbox Code Playgroud)

根据 jwt.io,它显示标题

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "z1jbPLkNwLU0dLy7kCHOZrKaIwqO1qkm8CxkoTx6C1A"
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用公钥和秘密密钥,两者都给我错误

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/jwt/api_jws.py", line 232, in _verify_signature
    alg_obj = self._algorithms[alg]
KeyError: 'RS256'

During handling of …
Run Code Online (Sandbox Code Playgroud)

python jwt keycloak pyjwt

17
推荐指数
1
解决办法
3万
查看次数

JWT(Json网络令牌)与自定义令牌

我正在查看问题,但我找不到任何可以解决我怀疑的问题.我发现了有关JWT的大量信息,但在比较JWT在生成自定义令牌和针对REST服务的身份验证请求方面的优势时,并没有太多信息.

使用JWT(Json Web Token)生成自定义生成令牌有什么好处?要生成自定义令牌,我可以使用一些散列策略或一些独特的随机数生成器.

如果我生成自定义令牌,我可以有任何安全问题吗?您会建议使用任何其他身份验证机制吗?

谢谢!

security jwt rest-security

16
推荐指数
1
解决办法
7294
查看次数

在JWT中更新/更改角色声明(或任何其他声明)

我将用户角色存储在JWT中(以限制API端点).管理员可以更改角色.

如果角色发生了变化.我怎么能在所有代币中反映这一点?我考虑过几个解决方案:

  • 如果我使用刷新令牌,则用户必须等到访问令牌的到期日期到期.

  • 我可以记录已更改的用户ID并检查每个请求,然后在用户更改后返回新令牌.

有没有标准的方法来做到这一点?

authentication oauth jwt asp.net-core asp.net-core-webapi

16
推荐指数
2
解决办法
4978
查看次数

JSON Web令牌到期

在大多数JWT(JSON Web Token)教程(例如:this and this)中,一旦经过验证,您可以使用传入令牌获取客户端信息,而无需从DB验证它.

我的问题是,如何维护无效的用户情况呢?我的意思是,假设一个客户端只有一个JWT令牌,它在一周内到期.但由于非常具体的原因,我们可以说我们决定使用户无效,并且不希望用户访问我们的API.但该用户仍然有一个有效的令牌,用户可以访问该API.

当然,如果我们为每个请求进行数据库往返,那么我们可以验证该帐户是有效还是无效.我的问题是,对于长寿代币来说,处理这种情况的最佳方法是什么.

提前致谢.

security oauth spring-security oauth-2.0 jwt

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

如何检查令牌过期和注销用户?

用户可以在他/她点击退出按钮时注销,但如果令牌过期,他/她无法注销,因为在我的应用程序中,令牌在服务器端和前端都使用.当用户单击注销按钮时,如果令牌有效,则清除服务器和浏览器中的令牌.当用户没有注销并且他/她的令牌过期但未在浏览器中清除时,有可能.为了解决这种情况,每次用户访问我的应用程序时如何检查令牌过期,如果令牌过期,请从浏览器中清除令牌?

我尝试在每次用户刷新页面或切换到另一页时在后台观看的saga.我不认为这是一种有效的方式.我认为中间件开始发挥作用.

function* loadInitialActions() {
  var dateNow = new Date();
  console.log(jwtDecode(token).exp < dateNow.getTime() - jwtDecode(token).iat);
  const token =
    JSON.parse(localStorage.getItem("user")) &&
    JSON.parse(localStorage.getItem("user"))["token"];
  if (
    token &&
    jwtDecode(token).exp < dateNow.getTime() - jwtDecode(token).iat
  ) {
    yield put(LOGOUT_SUCCESS);
  }
}

function* initialize() {
  const watcher = yield fork(loadInitialActions);
  yield take([INITIALIZE_ERROR, INITIALIZE_SUCCESS]);
  yield cancel(watcher);
}

function* rootSaga() {
  console.log("rootSaga");
  yield takeLatest(INITIALIZE, initialize);
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如果令牌从中间件到期,我如何使用令牌过期逻辑和注销用户?

javascript jwt reactjs redux redux-saga

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

IDX10603:算法:'HS256'要求SecurityKey.KeySize大于'128'位.KeySize报道:'32'.参数名称:key.KeySize

我只是使用Asp.Net Core Web API,并实现身份验证.我从Angular应用程序调用此API.但我总是得到如下错误.

IDX10603:算法:'HS256'要求SecurityKey.KeySize大于'128'位.KeySize报道:'32'.参数名称:key.KeySize

下面是我ConfigureServicesStartup.cs文件中的代码.

public IServiceProvider ConfigureServices(IServiceCollection services)
            {
                services.AddDbContext<APIContext>(option => option.UseInMemoryDatabase("AngularApp"));

                services.AddCors(options => options.AddPolicy("Cors", builder =>
                {
                    builder.AllowAnyOrigin().
                    AllowAnyMethod().
                    AllowAnyHeader();
                }
                ));

                var signinKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Secret phase"));

                services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                }).AddJwtBearer(cfg =>
                {
                    cfg.RequireHttpsMetadata = false;
                    cfg.SaveToken = true;
                    cfg.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
                    {
                        IssuerSigningKey = signinKey,
                        ValidateAudience = false,
                        ValidateIssuer = false,
                        ValidateLifetime = false,
                        ValidateIssuerSigningKey = true,
                        ValidateActor = false,
                        ClockSkew = TimeSpan.Zero
                    }; …
Run Code Online (Sandbox Code Playgroud)

c# jwt asp.net-core

16
推荐指数
2
解决办法
9573
查看次数

不记名错误 - invalid_token - 未找到签名密钥

我有一个与 .Net Core 2.2 API 后端接口的 Angular 7 应用程序。这是与 Azure Active Directory 的接口。

在 Angular 7 方面,它正在使用 AAD 正确进行身份验证,并且我在jwt.io上得到了一个有效的 JWT 验证。

在 .Net Core API 方面,我创建了一个简单的测试 API [Authorize]

当我从 Angular 调用此方法时,在添加不记名令牌后,我得到(如 Chrome 调试工具、网络选项卡、“标题”中所示):

WWW-Authenticate: Bearer error="invalid_token", error_description="未找到签名密钥"

使用HTTP/1.1 401 Unauthorized

简单的测试 API 是:

    [Route("Secure")]
    [Authorize]
    public IActionResult Secure() => Ok("Secure works");
Run Code Online (Sandbox Code Playgroud)

Angular 调用代码也很简单:

    let params : any = {
        responseType: 'text',
        headers: new HttpHeaders({
            "Authorization": "Bearer " + token,
            "Content-Type": "application/json"
        })
    }

    this.http
        .get("https://localhost:5001/api/azureauth/secure", …
Run Code Online (Sandbox Code Playgroud)

c# jwt azure-active-directory asp.net-core angular

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