2017-06-08 3 views
1

Le scénario actuel sur lequel je travaille nécessite l'intégration de SAML ou de l'authentification unique dans une application Angular avec un backend de rails. Pour commencer, j'ai été capable d'envoyer une requête à mon IdP et j'ai reçu une réponse sous forme de XML que j'analyse en utilisant nokogiri et j'ai quelques identifiants avec lesquels je peux créer l'utilisateur dans la base de données. Le problème est cependant que je suis incapable de signer l'utilisateur et de les garder connectés une fois qu'ils sont créés.L'intégration de SAML à Angular JS avec des rails back end

I ont ng-token-auth mis en place sur l'extrémité avant et devise_token_auth sur l'extrémité arrière. J'ai utilisé omniauth-saml gem pour envoyer une requête à l'IdP qui répond avec une demande de poste et j'ai un contrôleur séparé héritant :: DeviseTokenAuth :: OmniauthCallbacksController et ayant la route de publication où je consomme la réponse de l'IdP . Une fois que je l'ai fait et que l'utilisateur est créé dans la base de données, je n'arrive pas à comprendre comment signer l'utilisateur. Je fais ce qui suit et je peux voir le nombre de connexion incrémenter sur l'arrière, mais sur le côté client l'utilisateur reste déconnecté.

@resource = User.find_or_create_user(idp_response) 
if @resource.persisted? 
    set_token_on_resource 
    create_auth_params 
    sign_in(:user, @resource, store: false, bypass: false) 
    yield @resource if block_given? 
    render_data_or_redirect('deliverCredentials', @auth_params.as_json, @resource.as_json) 

Il semble que j'aie atteint l'état d'impasse depuis quelque temps maintenant. Je ne suis pas sûr de savoir comment je peux authentifier l'utilisateur sur le frontal manuellement en tant que réponse de mon fournisseur d'identité. Toute aide serait appréciée.

+0

vous utilisez les en-têtes retournés dans la réponse? –

+0

de l'IdP? Je reçois un fichier xml en réponse à partir duquel j'analyse et récupère quelques champs clés juste suffisants pour créer un utilisateur dans ma base de données. – Hassan

+0

puisque vous utilisez 'devise_token_auth', après la création de @resource, il envoie peu d'en-têtes en réponse comme' Access-Token', 'Client' et autres qui doivent être envoyés avec chaque requête pour informer le serveur que l'utilisateur est signé en –

Répondre

0

Dans votre contrôleur où le signe demande est frappé ..

response = SIGN_IN_REQUEST_API 
session[:api_tokens] = response.headers 

Dans votre application_layout.html.haml,

- if (tokens = session[:api_tokens]).present? 
    :javascript 
    myApp.controller('cookieController', function($scope, $resource, $http, $mdDialog, $auth, ipCookie) { 
     ipCookie('auth_headers', '{"access-token": "{token["access-token"]}","token-type": "Bearer","client": "#{token["client"]}","expiry": "#{token["expiry"]}","uid": "#{token["uid"]}"}", {path: "/",expires: 9999,expirationUnit: "days",secure: false}'); 
     ipCookie('currentConfigName', 'default', {path: '/',expires: 9999,expirationUnit: 'days',secure: false}); 
    }); 
    - session.delete(:api_tokens) 
    %div{'ng-controller'=>'cookieController'} 

Reference

+0

Merci beaucoup pour toute l'aide que j'essaie cette solution maintenant. – Hassan

+0

J'espère que cela fonctionne, non testé .. –

+0

Je vous le ferai savoir dès que je l'ai fait dans les deux cas et j'apprécie vraiment tout le temps que vous avez épargné pour m'aider. – Hassan