9
votes

Service d'authentification de l'utilisateur reposant

Heyks, cela semble avoir été une discussion assez souvent, mais je veux faire une question simple, arrosée de faire une authentification avec des services reposants. Le scénario est comme suit:

  • Il existe un système qui abrite des utilisateurs enregistrés pour une application. Le système expose une API reposante pour accéder à ces utilisateurs.
  • Il y a une application frontale qui a une forme de connexion. L'application peut être interne ou externe.
  • L'application frontale doit utiliser les données du système utilisateur pour authentifier un utilisateur.

    La question est maintenant de savoir comment authentifier un utilisateur dont les informations d'identification (nom d'utilisateur / mot de passe) sont entrées dans l'application cliente par rapport aux données du système utilisateur de telle qu'elle est sécurisée et performante? Par souci de cette question, supposons que l'application client soit interne à une sorte d'intranet, mais les applications ne résident pas sur la même machine et ne peuvent communiquer que par le service.

    Je comprends l'idée d'avoir la demande "hypermédia conduite", mais nous devrions pouvoir fournir des services de filtrage / de recherche. Par exemple, envisagez les ressources et les API ci-dessous:

    • http://example.com/users
      • obtenez - récupère tous les utilisateurs (paginé, hypermedia piloté)
      • POST - Crée un nouvel utilisateur
      • Met / Supprimer Non pris en charge
      • http://example.com/users/[id]
        • obtenez - retourne une représentation complète d'un utilisateur avec id = {id}
        • Met - Mise à jour de l'utilisateur, prend tout type de support prédéfini
        • Supprimer - Supprime l'utilisateur (avec autorisation appropriée)
        • Post non pris en charge

          Basé sur ce qui précède, mon idée serait que l'application cliente obtiendrait la liste des utilisateurs, le filtrage par nom d'utilisateur. Le service retournera le mot de passe haché et le sel au client, le client effectuera l'authentification.

          pensées?


1 commentaires

Pouvez-vous être plus précis sur ce que la question est la question? J'ai une période difficile à comprendre quel type de commentaires souhaitez-vous.


5 Réponses :


3
votes

Tout d'abord, vous ne voulez pas que le client effectue l'authentification, car il serait alors trivial pour écrire un client qui se présente dans votre service.

Au lieu de cela, utilisez simplement un mécanisme d'authentification comme HTTP BASIC ou HTTP Digest .

Notez que si vous utilisez Java, le Restlet framework fournit des intercepteurs, appelés gardes, qui soutiennent ces mécanismes et autres. Je recommande vivement la restauration.


0 commentaires

6
votes

Si je comprends votre question correctement, vous souhaitez implémenter un service générique qui gérera l'authentification, de sorte que vous puissiez la réutiliser pour différentes applications.

Je vous suggère de regarder OAuth qui a été construit pour ce domaine de problème précisément.


0 commentaires

4
votes

Passer le nom d'utilisateur et le back de sel est inutile et un risque de sécurité réel. strong>

Peut-être que vous pourriez envisager cette approche: p>

Demandez au client le nom d'utilisateur et le mot de passe au serveur via Authentification de base P>

Le serveur récupère le mot de passe crypté pour Le nom d'utilisateur le long du sel p>

Le serveur crypte le mot de passe donné à l'aide de la méthode de cryptage, à l'aide du sel pour aider l'algorithme (le code Ruby suit): P>

def User.authenticate(login, password)
    ok = false

    user = User.find_by_login(login)

    if user
        #
        #   user contains the salt, it isn't passed from the client
        #  
        expected_password = hash_password(password, user.salt)

        ok = (user.password == expected_password)
    end

    return ok
end


0 commentaires

0
votes

Mozilla Persona

Étant donné que cette question a été publiée, le Fondation Mozilla (le fabricant de Firefox navigateur) a pris le problème de l'authentification utilisateur simple. Leur solution est Mozilla Persona , "Un système de connexion pour le web". Conçu pour être facile pour les utilisateurs et pour les développeurs. L'identité de l'utilisateur est une adresse email. Voir Article Wikipedia .

Mise à jour

Mozilla a essentiellement abandonné son travail sur la persona mais Pas tout à fait tué le projet.


0 commentaires

4
votes

Stormpath

Stormpath société dédiée à la fourniture d'une API de gestion de la connexion à l'utilisateur et de service des développeurs. Ils utilisent un Rest JSON approche.

Il existe d'autres sociétés qui semblent se briser dans ce nouveau domaine d'authentification-AS-AS-SERVICE, mais StormPath est le seul que je connaisse de cela se consacre.


0 commentaires