123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- [role="xpack"]
- [[security-api-get-token]]
- === Get token API
- ++++
- <titleabbrev>Get token</titleabbrev>
- ++++
- .New API reference
- [sidebar]
- --
- For the most up-to-date API details, refer to {api-es}/group/endpoint-security[Security APIs].
- --
- Creates a bearer token for access without requiring basic authentication.
- [[security-api-get-token-request]]
- ==== {api-request-title}
- `POST /_security/oauth2/token`
- [[security-api-get-token-prereqs]]
- ==== {api-prereq-title}
- * To use this API, you must have the `manage_token` cluster privilege.
- [[security-api-get-token-desc]]
- ==== {api-description-title}
- The tokens are created by the {es} Token Service, which is automatically enabled
- when you configure TLS on the HTTP interface. See <<encrypt-http-communication>>. Alternatively,
- you can explicitly enable the `xpack.security.authc.token.enabled` setting. When
- you are running in production mode, a bootstrap check prevents you from enabling
- the token service unless you also enable TLS on the HTTP interface.
- The get token API takes the same parameters as a typical OAuth 2.0 token API
- except for the use of a JSON request body.
- A successful get token API call returns a JSON structure that contains the access
- token, the amount of time (seconds) that the token expires in, the type, and the
- scope if available.
- The tokens returned by the get token API have a finite period of time for which
- they are valid and after that time period, they can no longer be used. That time
- period is defined by the `xpack.security.authc.token.timeout` setting. For more
- information, see <<token-service-settings>>.
- If you want to invalidate a token immediately, you can do so by using the
- <<security-api-invalidate-token,invalidate token API>>.
- [[security-api-get-token-request-body]]
- ==== {api-request-body-title}
- The following parameters can be specified in the body of a POST request and
- pertain to creating a token:
- `grant_type`::
- (Required, string) The type of grant.
- Supported grant types are: `password`, `_kerberos`,
- `client_credentials` and `refresh_token`.
- `client_credentials`:::
- This grant type implements the Client Credentials Grant of OAuth2. It is geared
- for machine to machine communication and is not suitable or designed for the
- self-service user creation of tokens. It generates only access tokens that
- cannot be refreshed. The premise is that the entity that uses
- `client_credentials` has constant access to a set of (client, not end-user)
- credentials and can authenticate itself at will.
- `_kerberos`:::
- This grant type is supported internally and implements SPNEGO based Kerberos
- support. The `_kerberos` grant type may change from version to version.
- `password`:::
- This grant type implements the Resource Owner Password Credentials Grant of
- OAuth2. In this grant, a trusted client exchanges the end user's credentials
- for an access token and (possibly) a refresh token. The request needs to be made
- by an authenticated user but happens _on behalf_ of another authenticated user
- (the one whose credentials are passed as request parameters). This grant type is
- not suitable or designed for the self-service user creation of tokens.
- `refresh_token`:::
- This grant type implements the Refresh Token Grant of OAuth2.
- In this grant a user exchanges a previously issued refresh token for a new access token and a new refresh token.
- `password`::
- (Optional^*^, string) The user's password. If you specify the `password` grant type, this
- parameter is required. This parameter is not valid with any other supported
- grant type.
- `kerberos_ticket`::
- (Optional^*^, string) The base64 encoded kerberos ticket. If you specify the
- `_kerberos` grant type, this parameter is required. This parameter is not valid
- with any other supported grant type.
- `refresh_token`::
- (Optional^*^, string) The string that was returned when you created the token,
- which enables you to extend its life. If you specify the `refresh_token` grant
- type, this parameter is required. This parameter is not valid with any other
- supported grant type.
- `scope`::
- (Optional, string) The scope of the token. Currently tokens are only issued for a scope of
- `FULL` regardless of the value sent with the request.
- `username`::
- (Optional^*^, string) The username that identifies the user. If you specify the `password`
- grant type, this parameter is required. This parameter is not valid with any
- other supported grant type.
- [[security-api-get-token-example]]
- ==== {api-examples-title}
- The following example obtains a token using the `client_credentials` grant type,
- which simply creates a token as the authenticated user:
- [source,console]
- --------------------------------------------------
- POST /_security/oauth2/token
- {
- "grant_type" : "client_credentials"
- }
- --------------------------------------------------
- The following example output contains the access token, the amount of time (in
- seconds) that the token expires in, and the type:
- [source,console-result]
- --------------------------------------------------
- {
- "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"
- }
- }
- --------------------------------------------------
- // TESTRESPONSE[s/dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==/$body.access_token/]
- // TESTRESPONSE[s/superuser/_es_test_root/]
- The token returned by this API can be used by sending a request with an
- `Authorization` header with a value having the prefix "Bearer " followed
- by the value of the `access_token`.
- [source,shell]
- --------------------------------------------------
- curl -H "Authorization: Bearer dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==" http://localhost:9200/_cluster/health
- --------------------------------------------------
- // NOTCONSOLE
- The following example obtains a token for the `test_admin` user using the
- `password` grant type. This request needs to be made by an authenticated user with sufficient privileges that may
- or may not be the same as the one whose username is passed in the `username` parameter:
- [source,console]
- --------------------------------------------------
- POST /_security/oauth2/token
- {
- "grant_type" : "password",
- "username" : "test_admin",
- "password" : "x-pack-test-password"
- }
- --------------------------------------------------
- The following example output contains the access token, the amount of time (in
- seconds) that the token expires in, the type, and the refresh token:
- [source,console-result]
- --------------------------------------------------
- {
- "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"
- }
- }
- --------------------------------------------------
- // TESTRESPONSE[s/dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==/$body.access_token/]
- // TESTRESPONSE[s/vLBPvmAB6KvwvJZr27cS/$body.refresh_token/]
- // TESTRESPONSE[s/superuser/_es_test_root/]
- [[security-api-refresh-token]]
- To extend the life of an existing token obtained using the `password` grant type,
- you can call the API again with the refresh token within 24 hours of the token's
- creation. For example:
- [source,console]
- --------------------------------------------------
- POST /_security/oauth2/token
- {
- "grant_type": "refresh_token",
- "refresh_token": "vLBPvmAB6KvwvJZr27cS"
- }
- --------------------------------------------------
- // TEST[s/vLBPvmAB6KvwvJZr27cS/$body.refresh_token/]
- // TEST[continued]
- The API will return a new token and refresh token. Each refresh token may only
- be used one time.
- [source,console-result]
- --------------------------------------------------
- {
- "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" : "token"
- }
- }
- --------------------------------------------------
- // TESTRESPONSE[s/dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==/$body.access_token/]
- // TESTRESPONSE[s/vLBPvmAB6KvwvJZr27cS/$body.refresh_token/]
- // TESTRESPONSE[s/superuser/_es_test_root/]
- The following example obtains a access token and refresh token using the `kerberos` grant type,
- which simply creates a token in exchange for the base64 encoded kerberos ticket:
- [source,js]
- --------------------------------------------------
- POST /_security/oauth2/token
- {
- "grant_type" : "_kerberos",
- "kerberos_ticket" : "YIIB6wYJKoZIhvcSAQICAQBuggHaMIIB1qADAgEFoQMCAQ6iBtaDcp4cdMODwOsIvmvdX//sye8NDJZ8Gstabor3MOGryBWyaJ1VxI4WBVZaSn1WnzE06Xy2"
- }
- --------------------------------------------------
- // NOTCONSOLE
- The API will return a new token and refresh token if kerberos authentication is successful.
- Each refresh token may only be used one time. When the mutual authentication is requested in the Spnego GSS context,
- a base64 encoded token will be returned by the server in the `kerberos_authentication_response_token`
- for clients to consume and finalize the authentication.
- [source,js]
- --------------------------------------------------
- {
- "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
- "type" : "Bearer",
- "expires_in" : 1200,
- "refresh_token": "vLBPvmAB6KvwvJZr27cS"
- "kerberos_authentication_response_token": "YIIB6wYJKoZIhvcSAQICAQBuggHaMIIB1qADAg",
- "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"
- }
- }
- --------------------------------------------------
- // NOTCONSOLE
|