Process Backchannel Authentication Request
This API parses request parameters of a backchannel authentication request and returns necessary data for the authorization server implementation to process the backchannel authentication request further.
Description
This API is supposed to be called from within the implementation of the backchannel authentication endpoint of the service. The endpoint implementation must extract the request parameters from the backchannel authentication request from the client application and pass them as the value of parameters request parameter for Authlete's /backchannel/authentication API. The value of parameters is the entire entity body (which is formatted in application/x-www-form-urlencoded) of the request from the client application. The following code snippet is an example in JAX-RS showing how to extract request parameters from the backchannel authentication request.
@POST
@Consumes(MediaType.APPLICATION\_FORM\_URLENCODED)
public Response post(String parameters)
{
// 'parameters' is the entity body of the backchannel authentication request.
......
}
The endpoint implementation does not have to parse the request parameters from the client application because Authlete's /backchannel/authentication API does it. The response from /backchannel/authentication API has various parameters. Among them, it is action parameter that the authorization server implementation should check first because it denotes the next action that the authorization server implementation should take. According to the value of action, the service implementation must take the steps described below. INTERNAL_SERVER_ERROR When the value of action is INTERNAL\_SERVER\_ERROR, it means that the request from the authorization server implementation was wrong or that an error occurred in Authlete. In either case, from the viewpoint of the client application, it is an error on the server side. Therefore, the service implementation should generate a response to the client application with HTTP status of "500 Internal Server Error" and application/json. The value of responseContent is a JSON string which describes the error, so it can be used as the entity body of the response. The following illustrates the response which the service implementation should generate and return to the client application.
HTTP/1.1 500 Internal Server Error
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{responseContent}
BAD_REQUEST When the value of action is BAD\_REQUEST, it means that the request from the client application is invalid. The authorization server implementation should generate a response to the client application with "400 Bad Request" and application/json. The value of responseContent is a JSON string which describes the error, so it can be used as the entity body of the response. The following illustrates the response which the service implementation should generate and return to the client application.
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{responseContent}
UNAUTHORIZED When the value of action is UNAUTHORIZED, it means that client authentication of the backchannel authentication request failed. Note that client authentication is always required at the backchannel authentication endpoint. This implies that public clients are not allowed to use the backchannel authentication endpoint. The authorization server implementation should generate a response to the client application with "401 Unauthorized" and application/json. The value of responseContent is a JSON string which describes the error, so it can be used as the entity body of the response. The following illustrates the response which the service implementation must generate and return to the client application.
HTTP/1.1 401 Unauthorized
WWW-Authenticate: (challenge)
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{responseContent}
USER_IDENTIFICATION When the value of action is USER\_IDENTIFICATION, it means that the backchannel authentication request from the client application is valid. The authorization server implementation has to follow the steps below. [1] END-USER IDENTIFICATION The first step is to determine the subject (= unique identifier) of the end-user from whom the client application wants to get authorization. According to the CIBA specification, a backchannel authentication request contains one (and only one) of the login\_hint\_token, id\_token\_hint and login\_hint request parameters as a hint by which the authorization server identifies the subject of an end-user. The authorization server implementation can know which hint is included in the backchannel authentication request by the hintType parameter. For example, when the value of the parameter LOGIN\_HINT, it means that the backchannel authentication request contains the login\_hint request parameter as a hint. The value of the hint parameter is the value of the hint. For example, when the value of the hintType parameter is LOGIN\_HINT, The value of the hint parameter is the value of the login\_hint request parameter. It is up to the authorization server implementation how to determine the subject of the end-user from the hint. Only when the id\_token\_hint request parameter is used, authorization server implementation can use the sub response parameter, which holds the value of the sub claim in the id\_token\_hint request parameter. [2] END-USER IDENTIFICATION ERROR There are some cases where the authorization server implementation encounters an error during the user identification process. In any error case, the service implementation has to return an HTTP response with the error response parameter to the client application. The following is an example of such error responses.
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{ "error":"unknown\_user\_id" }
Authlete provides /backchannel/authentication/fail API that builds the response body (JSON) of an error response. However, because it is easy to build an error response manually, you may choose not to call the API. One good thing in using the API is that the API call can trigger deletion of the ticket which has been issued from Authlete's /backchannel/authentication API. If you don't call /backchannel/authentication/fail API, the ticket will continue to exist in the database until it is cleaned up by the batch program after the ticket expires. Possible error cases that the authorization server implementation itself has to handle are as follows. Other error cases have already been covered by /backchannel/authentication API.
- expired\_login\_hint\_token The authorization server implementation detected that the hint presented by the login\_hint\_token request parameter has expired. Note that the format of login\_hint\_token is not described in the CIBA Core spec at all and so there is no consensus on how to detect expiration of login\_hint\_token. Interpretation of login\_hint\_token is left to each authorization server implementation.
- unknown\_user\_id The authorization server implementation could not determine the subject of the end-user by the presented hint.
- unauthorized\_client The authorization server implementation has custom rules to reject backchannel authentication requests from some particular clients and found that the client which has made the backchannel authentication request is one of the particular clients. Note that /backchannel/authentication API does not return action=USER\_IDENTIFICATION in cases where the client does not exist or client authentication has failed. Therefore, the authorization server implementation will never have to use the error code unauthorized\_client unless the server has intentionally implemented custom rules to reject backchannel authentication requests based on clients.
- missing\_user\_code The authorization server implementation has custom rules to require that a backchannel authentication request include a user code for some particular users and found that the user identified by the hint is one of the particular users. Note that /backchannel/authentication API does not return action=USER\_IDENTIFICATION when both the backchannel\_user\_code\_parameter\_supported metadata of the server and the backchannel\_user\_code\_parameter metadata of the client are true and the backchannel authentication request does not include the user_code request parameter. In this case, /backchannel/authentication API returns action=BAD_REQUEST with JSON containing "error":"missing\_user\_code". Therefore, the authorization server implementation will never have to use the error code missing\_user\_code unless the server has intentionally implemented custom rules to require a user code based on users even in the case where the backchannel\_user\_code\_parameter metadata of the client which has made the backchannel authentication request is false.
- invalid\_user\_code The authorization server implementation detected that the presented user code is invalid. Note that the format of user_code is not described in the CIBA Core spec at all and so there is no consensus on how to judge whether a user code is valid or not. It is up to each authorization server implementation how to handle user codes.
- invalid\_binding\_message The authorization server implementation detected that the presented binding message is invalid. Note that the format of binding_message is not described in the CIBA Core spec at all and so there is no consensus on how to judge whether a binding message is valid or not. It is up to each authorization server implementation how to handle binding messages.
- invalid\_target The authorization server implementation rejects the requested target resources. The error code invalid_target is from "Resource Indicators for OAuth 2.0". The specification defines the resource request parameter. By using the parameter, client applications can request target resources that should be bound to the access token being issued. If the authorization server wants to reject the request, call /backchannel/authentication/fail API with INVALID\_TARGET.
- access\_denined The authorization server implementation has custom rules to reject backchannel authentication requests without asking the end-user and respond to the client as if the end-user had rejected the request in some particular cases and found that the backchannel authentication request is one of the particular cases. The authorization server implementation will never have to use the error code access\_denied at this timing unless the server has intentionally implemented custom rules to reject backchannel authentication requests without asking the end-user and respond to the client as if the end-user had rejected the request. [3] AUTH_REQ_ID ISSUE If the authorization server implementation has successfully determined the subject of the end-user, the next action is to return an HTTP response to the client application which contains auth\_req\_id. Authlete provides /backchannel/authentication/issue API which generates a JSON containing auth\_req\_id, so, your next action is (1) call the API, (2) receive the response from the API, (3) build a response to the client application using the content of the API response, and (4) return the response to the client application. See the description of /backchannel/authentication/issue API for details. [4] END-USER AUTHENTICATION AND AUTHORIZATION After sending a JSON containing auth\_req\_id back to the client application, the service implementation starts to communicate with an authentication device of the end-user. It is assumed that end-user authentication is performed on the authentication device and the end-user confirms the content of the backchannel authentication request and grants authorization to the client application if everything is okay. The authorization server implementation must be able to receive the result of the end-user authentication and authorization from the authentication device. How to communicate with an authentication device and achieve end-user authentication and authorization is up to each authorization server implementation, but the following request parameters of the backchannel authentication request should be taken into consideration in any implementation.
- acr\_values A backchannel authentication request may contain an array of ACRs (Authentication Context Class References) in preference order. If multiple authentication devices are registered for the end-user, the authorization server implementation should take the ACRs into consideration when selecting the best authentication device.
- scope A backchannel authentication request always contains a list of scopes. At least, openid is included in the list (otherwise /backchannel/authentication API returns action=BAD\_REQUEST). It would be better to show the requested scopes to the end-user on the authentication device or somewhere appropriate. If the scope request parameter contains address, email, phone and/or profile, they are interpreted as defined in "5.4. Requesting Claims using Scope Values of OpenID Connect Core 1.0". That is, they are expanded into a list of claim names. The claimNames parameter returns the expanded result.
- binding\_message A backchannel authentication request may contain a binding message. It is a human readable identifier or message intended to be displayed on both the consumption device (client application) and the authentication device.
- user\_code A backchannel authentication request may contain a user code. It is a secret code, such as password or pin, known only to the end-user but verifiable by the authorization server. The user code should be used to authorize sending a request to the authentication device. [5] END-USER AUTHENTICATION AND AUTHORIZATION COMPLETION After receiving the result of end-user authentication and authorization, the authorization server implementation must call Authlete's /backchannel/authentication/complete API to tell Authlete the result and pass necessary data so that Authlete can generate an ID token, an access token and optionally a refresh token. See the description of the API for details. [6] CLIENT NOTIFICATION When the backchannel token delivery mode is either ping or push, the authorization server implementation must send a notification to the pre-registered notification endpoint of the client after the end-user authentication and authorization. In this case, the action parameter in a response from /backchannel/authentication/complete API is NOTIFICATION. See the description of /backchannel/authentication/complete API for details. [7] TOKEN REQUEST When the backchannel token delivery mode is either ping or poll, the client application will make a token request to the token endpoint to get an ID token, an access token and optionally a refresh token. A token request that corresponds to a backchannel authentication request uses urn:openid:params:grant-type:ciba as the value of the grant\_type request parameter. Authlete's /auth/token API recognizes the grant type automatically and behaves properly, so the existing token endpoint implementation does not have to be changed to support CIBA.
Path parameters
A service ID.