web-dev-qa-db-fra.com

Comment obtenir un mot de passe à partir de l'authentification HTTP de base

J'utilise l'authentification HTTP BASIC avec Java.

Mon servlet envoie un message JMS mais je dois fournir l'utilisateur et le mot de passe pour m'authentifier lors de la création de la connexion:

javax.jms.ConnectionFactory.createConnection(String username, String password)

Je peux récupérer le nom d'utilisateur de HttpServletRequest.getUserPrincipal (). Mais il semble qu'il n'y ait aucun moyen de récupérer le mot de passe. Comment résoudre ce problème?

30
Jin Kim

Le mot de passe auquel vous faites référence est très probablement différent de celui fourni par les utilisateurs lors de la connexion. Bien que le cas d'utilisation ne ressorte pas clairement de la question, il semble que vous essayez d'utiliser le nom d'utilisateur/mot de passe fourni par des utilisateurs externes pour créer une connexion à JMS Connection Factory. Cela ne me semble pas sûr du point de vue architectural. Vous ne devez utiliser qu'un seul identifiant pour vous connecter à ConnectionFactory qui doit être protégé (le traiter comme des connexions db). Il vaut mieux utiliser JNDI pour rechercher ConnectionFactory et contourner la gestion de nom d'utilisateur/mot de passe.

Cependant, si vous devez utiliser la technique, vous pouvez utiliser le bloc de code suivant.Je le copie depuis le projet Gitblit car il était ouvert dans mon Eclipse

Utilisation de la classe Java8 Base64:

final String authorization = httpRequest.getHeader("Authorization");
if (authorization != null && authorization.toLowerCase().startsWith("basic")) {
    // Authorization: Basic base64credentials
    String base64Credentials = authorization.substring("Basic".length()).trim();
    byte[] credDecoded = Base64.getDecoder().decode(base64Credentials);
    String credentials = new String(credDecoded, StandardCharsets.UTF_8);
    // credentials = username:password
    final String[] values = credentials.split(":", 2);
}
82
Akhilesh Singh

Le nom d'utilisateur et le mot de passe ont été initialement envoyés dans l'en-tête HTTP Authorization (encodé en base64) afin que vous puissiez l'utiliser; mais si l'utilisateur maintient une session à l'aide de cookies, il n'enverra pas nécessairement cet en-tête à chaque fois.

1
artbristol