使令牌失效 API

编辑

使一个或多个访问令牌或刷新令牌失效。

请求

编辑

DELETE /_security/oauth2/token

描述

编辑

获取令牌 API 返回的访问令牌具有有限的有效期限,超过该期限后,它们将不再可用。该时间段由 xpack.security.authc.token.timeout 设置定义。有关更多信息,请参阅令牌服务设置

获取令牌 API 返回的刷新令牌仅在 24 小时内有效。它们也只能使用一次。

如果要立即使一个或多个访问令牌或刷新令牌失效,请使用此使令牌失效 API。

请求主体

编辑

以下参数可以在 DELETE 请求的主体中指定,并与使令牌失效相关

token
(可选,字符串) 访问令牌。如果使用 refresh_tokenrealm_nameusername 中的任何一个,则不能使用此参数。
refresh_token
(可选,字符串) 刷新令牌。如果使用 refresh_tokenrealm_nameusername 中的任何一个,则不能使用此参数。
realm_name
(可选,字符串) 身份验证域的名称。此参数不能与 refresh_tokentoken 一起使用。
username
(可选,字符串) 用户的用户名。此参数不能与 refresh_tokentoken 一起使用

虽然所有参数都是可选的,但至少需要其中一个。更具体地说,需要 tokenrefresh_token 参数中的一个。如果未指定这两个参数中的任何一个,则需要指定 realm_name 和/或 username

响应主体

编辑

成功的调用将返回一个 JSON 结构,其中包含已失效的令牌数、已失效的令牌数以及在使特定令牌失效时可能遇到的错误列表。

示例

编辑

例如,如果使用 client_credentials 授权类型创建令牌,如下所示

resp = client.security.get_token(
    grant_type="client_credentials",
)
print(resp)
const response = await client.security.getToken({
  grant_type: "client_credentials",
});
console.log(response);
POST /_security/oauth2/token
{
  "grant_type" : "client_credentials"
}

获取令牌 API 返回有关访问令牌的以下信息

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "authentication" : {
    "username" : "test_admin",
    "roles" : [
      "superuser"
      ],
    "full_name" : null,
    "email" : null,
    "metadata" : { },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "file",
      "type" : "file"
      },
    "lookup_realm" : {
      "name" : "file",
      "type" : "file"
      },
    "authentication_type" : "realm"
  }
}

此访问令牌现在可以立即失效,如以下示例所示

resp = client.security.invalidate_token(
    token="dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
)
print(resp)
const response = await client.security.invalidateToken({
  token:
    "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
});
console.log(response);
DELETE /_security/oauth2/token
{
  "token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ=="
}

如果使用 password 授权类型获取用户的令牌,则响应也可能包含刷新令牌。例如

resp = client.security.get_token(
    grant_type="password",
    username="test_admin",
    password="x-pack-test-password",
)
print(resp)
const response = await client.security.getToken({
  grant_type: "password",
  username: "test_admin",
  password: "x-pack-test-password",
});
console.log(response);
POST /_security/oauth2/token
{
  "grant_type" : "password",
  "username" : "test_admin",
  "password" : "x-pack-test-password"
}

获取令牌 API 返回以下信息

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "refresh_token": "vLBPvmAB6KvwvJZr27cS",
  "authentication" : {
    "username" : "test_admin",
    "roles" : [
      "superuser"
      ],
    "full_name" : null,
    "email" : null,
    "metadata" : { },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "file",
      "type" : "file"
      },
    "lookup_realm" : {
      "name" : "file",
      "type" : "file"
      },
    "authentication_type" : "realm"
  }
}

刷新令牌现在也可以立即失效,如以下示例所示

resp = client.security.invalidate_token(
    refresh_token="vLBPvmAB6KvwvJZr27cS",
)
print(resp)
const response = await client.security.invalidateToken({
  refresh_token: "vLBPvmAB6KvwvJZr27cS",
});
console.log(response);
DELETE /_security/oauth2/token
{
  "refresh_token" : "vLBPvmAB6KvwvJZr27cS"
}

以下示例立即使 saml1 域的所有访问令牌和刷新令牌失效

resp = client.security.invalidate_token(
    realm_name="saml1",
)
print(resp)
const response = await client.security.invalidateToken({
  realm_name: "saml1",
});
console.log(response);
DELETE /_security/oauth2/token
{
  "realm_name" : "saml1"
}

以下示例立即使所有域中用户 myuser 的所有访问令牌和刷新令牌失效

resp = client.security.invalidate_token(
    username="myuser",
)
print(resp)
const response = await client.security.invalidateToken({
  username: "myuser",
});
console.log(response);
DELETE /_security/oauth2/token
{
  "username" : "myuser"
}

最后,以下示例立即使 saml1 域中用户 myuser 的所有访问令牌和刷新令牌失效

resp = client.security.invalidate_token(
    username="myuser",
    realm_name="saml1",
)
print(resp)
const response = await client.security.invalidateToken({
  username: "myuser",
  realm_name: "saml1",
});
console.log(response);
DELETE /_security/oauth2/token
{
  "username" : "myuser",
  "realm_name" : "saml1"
}
{
  "invalidated_tokens":9, 
  "previously_invalidated_tokens":15, 
  "error_count":2, 
  "error_details":[ 
    {
      "type":"exception",
      "reason":"Elasticsearch exception [type=exception, reason=foo]",
      "caused_by":{
        "type":"exception",
        "reason":"Elasticsearch exception [type=illegal_argument_exception, reason=bar]"
      }
    },
    {
      "type":"exception",
      "reason":"Elasticsearch exception [type=exception, reason=boo]",
      "caused_by":{
        "type":"exception",
        "reason":"Elasticsearch exception [type=illegal_argument_exception, reason=far]"
      }
    }
  ]
}

作为此请求的一部分而失效的令牌数。

已经失效的令牌数。

使令牌失效时遇到的错误数。

有关这些错误的详细信息。当 error_count 为 0 时,此字段不会出现在响应中。