Ember-Cli, Rails and Torii Session 400 Bad Request

215 views Asked by At

I am new to ember-cli, currently I am having trouble with oauth2 with LinkedIn, the server side is rails. This is also my first question so please let me know if there's any other information needed or if it's too verbose. When i attempt to sign in I get the linkedin popup but then get the following error:

POST http://localhost:9000/v1/sessions 400 (Bad Request) jQuery.ajaxTransport.send @ jquery.js:9664jQuery.extend.ajax @ jquery.js:9215exports.default.Ember.default.Object.extend._fetchSession @ application.js:22initializePromise @ ember.debug.js:45486Promise @ ember.debug.js:47114_fetchSession @ application.js:21fetch @ application.js:15(anonymous function) @ session.js:72tryCatch @ ember.debug.js:45439invokeCallback @ ember.debug.js:45451(anonymous function) @ ember.debug.js:47350(anonymous function) @ ember.debug.js:26472Queue.invoke @ ember.debug.js:878Queue.flush @ ember.debug.js:943DeferredActionQueues.flush @ ember.debug.js:748Backburner.end @ ember.debug.js:173Backburner.run @ ember.debug.js:228Backburner.join @ ember.debug.js:247run.join @ ember.debug.js:15904run.bind @ ember.debug.js:15966jQuery.Callbacks.fire @ jquery.js:3148jQuery.Callbacks.self.fireWith @ jquery.js:3260jQuery.extend.ready @ jquery.js:3472completed @ jquery.js:3503


I get the same response when I actually hit the 'sign in with linkedin' button.

Here is my code for ember-cli:

app/adapters/application.js

    import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  namespace: 'v1'
});

app/routes/application.js

    import Ember from 'ember';
//takes place of App.IndexRoute =
export default Ember.Route.extend({
  //allow session to persist after page refreshes & fetch wehn activated
  //shoudl only happen once
  activate: function() {
    this.get('session').fetch();
  },

  actions: {
    signInViaLinkedin: function(){
      var route = this;

       this.get('session').open('linked-in-oauth2').then(function(authorization){
        // do the things after login, like redirect to dashboard
      }, function(error) {
        route.controller.set('error', 'Could not sign you in: ' + error.message);
      });
    }
  }
});

config/environment.js

    module.exports = function(environment) {
  var ENV = {
    modulePrefix: 'fetch',
    environment: environment,
    baseURL: '/',
    locationType: 'auto',
    EmberENV: {
      FEATURES: {
        // Here you can enable experimental features on an ember canary build
        // e.g. 'with-controller': true
      }
    },

    APP: {
      // Here you can pass flags/options to your application instance
      // when it is created
    }
  };
  ...
  if (environment === 'development') {
    // ENV.APP.LOG_RESOLVER = true;
    ENV.APP.LOG_ACTIVE_GENERATION = true;
    // ENV.APP.LOG_TRANSITIONS = true;
    // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
    ENV.APP.LOG_VIEW_LOOKUPS = true;
    ENV.puppifi = {
      sessionUrl: 'http://localhost:9000/v1/sessions'
    };

    ENV.torii = {
      sessionServiceName: 'session',
      providers: {
        'linked-in-oauth2': {
          apiKey: 'LINKED_IN_CLIENT_ID',
          redirectUri: 'http://localhost:4200',
        }
      }
    };

  if (environment === 'test') {
    // Testem prefers this...
    ENV.baseURL = '/';
    ENV.locationType = 'none';

    // keep test console output quieter
    ENV.APP.LOG_ACTIVE_GENERATION = false;
    ENV.APP.LOG_VIEW_LOOKUPS = false;

    ENV.APP.rootElement = '#ember-testing';
  }

  if (environment === 'production') {
    ENV.torii = {
      sessionServiceName: 'session',
      providers: {
        'linked-in-oauth2': {
          apiKey: 'LINKED_IN_CLIENT_ID',
          redirectUri: 'http://http://development.fetch.divshot.io',
        }
      }
    };
    ENV.puppifi ={
      sessionUrl: '/__/proxy/v1/sessions'
    };
  }
  return ENV;
  }
};

Rails App


app/controller/v1/sessions_controller.rb

module V1
  # session controller can fetch old sessions 
  class SessionsController < ApplicationController
    # skipped because ember and rails are on different domains
    skip_before_action :verify_authenticity_token

    def create
      linkedin_authenticator = LinkedinAuthenticator.new(linkedin_auth_code)
      user_factory = UserFactory.new(linkedin_authenticator)
      user_factory.find_or_create_user

      render json: user, status: :created
    end


    private

    def linkedin_auth_code 
      params.require(:'linkedin_auth_code')
    end
  end

end

services/linkedin_authenticator.rb

require "net/http"
require "net/https"

class LinkedinAuthenticator 
  LINKED_IN_OAUTH_PATH = "https://linkedin.com/uas/oauth2/authorization?response_type=code"

  def initialize(auth_code)
    @auth_code = auth_code
  end

  def name
    linkedin_user[:login]
  end


  private

  def linkedin_user
    @linkedin_user ||= linkedin_client.user
  end

  def linkedin_client
    OAuth2::Client.new(access_token: access_token)
  end

  def access_token
    linkedin_response["access_token"]
  end

  def token_type
    linkedin_response["token_type"]
  end

  def scope
    linkedin_response["scope"]
  end

  def linkedin_response
    @linkedin_response ||= JSON.parse(res.body)
  end

  def res
    http.request(req)
  end

  def req
    req = Net::HTTP::Post.new(uri.path)
    req.set_form_data(post_data)
    req["Accept"] = "application/json"
    req
  end

  def http
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http
  end

  def uri
    URI.parse(LINKED_IN_OAUTH_PATH)
  end

  def post_data
    {
      "client_id" => ENV["LINKED_IN_CLIENT_ID"],
      "client_secret" => ENV["LINKED_IN_CLIENT_SECRET"],
      "code" => @auth_code
    }
  end
end
0

There are 0 answers