1

我正在用Rails 5 API和ExtJs构建应用程序。 我的ExtJs单页应用程序通过public/index.html加载。如何在通过Rails API与Oauth服务器进行身份验证后返回到我的Js应用程序?

我通过ExtJs应用程序中的按钮单击按钮,将其重定向到带有所需参数的Oauth登录页面。

然后Oauth服务器调用我的Rails应用程序并通过身份验证并获取令牌。

所有工作正常。 我的问题是,现在我有我的用户加载,更新,access_token准备好,但我需要在浏览器中加载单页面应用程序,并传递access_token。不知何故,我无法管理这一点。

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 

我要么会卡在与本地主机空的浏览器窗口:3000网址和代码PARAM或者如果我重定向我得到一个消息,你将被重定向重新加载窗口,但我认为参数不传递。

回答

0

我通常使用守门人gem创建OAuth服务器并将redirect_uri保存到会话[:return_to]。

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

认证后然后,注入的JavaScript

window.location = redirect_uri + params

或创建XMLHttpRequest到认证服务器,然后解析响应这样的:

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