1

Je construis une application avec Rails 5 API et ExtJs. Mon application ExtJs une seule page chargée via le public/index.html.Comment revenir à mon application Js après l'authentification avec un serveur Oauth via l'API Rails?

Je suis redirigé vers la page de connexion Oauth avec les paramètres requis via un clic de bouton dans l'application ExtJs.

Ensuite, le serveur Oauth appelle mon application Rails et passe par l'authentification pour récupérer le jeton.

Tout fonctionne bien. Mon problème est que maintenant j'ai mon utilisateur chargé, mis à jour, access_token prêt mais j'ai besoin de charger l'application d'une seule page dans le navigateur et transmettre le access_token. D'une manière ou d'une autre, je ne peux pas gérer cela.

def login 
if params[:code] 
    response = request_token(params[:code]) 

    if response.header.code == '200' 
    token_data = JSON.parse response.body 

    user_info = JWT.decode(token_data['id_token'],nil,false).first 
    @user = User.find_by email: user_info['email'] 
    @user ? @user : @user = User.new 

    @user.name = "#{user_info['given_name']} #{user_info['family_name']}" 
    @user.access_token = token_data['access_token'] 
    @user.access_token_created_at = Time.zone.now 
    @user.token_data = response.body 
    @user.save 


    render file: '/public/index.html' 
    else 
    redirect_to('/', status: response.header.code, alert: response.header.message) 
    end 
elsif params[:error] 
    redirect_to('/', status: 401, alert: params[:error]) 
end 
end 

Je soit coincé dans une fenêtre de navigateur vide avec le localhost: 3000 URL et le code param ou si je réoriente je reçois un message avec Vous allez être redirigé qui recharge la fenêtre mais je pense que les paramètres ne sont pas transmis.

Répondre

0

J'utilise généralement doorkeeper gem pour créer un serveur OAuth et enregistrer redirect_uri dans la session [: return_to].

resource_owner_authenticator do 
    session[:return_to] = request.fullpath 
    current_user || redirect_to(new_user_session_url) 
end 

Puis, après authentification, injecter un code JavaScript

window.location = redirect_uri + params

OU créer XMLHttpRequest au serveur d'authentification, puis analyser la réponse comme ceci:

parseAccessToken: function(response) { 
    return { 
     accessToken: response.match(/access_token=([^&]*)/)[1], 
     expiresIn: response.match(/expires=([^&]*)/)[1] 
    }; 
}