Используя ember-simple-auth и torii, модальное окно никогда не закрывается, а сеанс никогда не обновляется, несмотря на успешный ответ сервера.

Я пытаюсь разрешить нескольким провайдерам oauth использовать ember-cli, ember-simple-auth, torii и devise на моем бэкэнде rails. Вроде все работает, но модал никогда не закрывается и сессия в клиенте никогда не обновляется.

Шаги для воспроизведения:

  1. Нажмите на ссылку, чтобы войти через провайдера google-oauth2.
  2. Наблюдайте за открытием модального окна со списком параметров входа в учетную запись.
  3. Выберите учетную запись и войдите
  4. Соблюдайте модальное перенаправление на локальный сервер rails для обмена токенами (http://localhost:3000/login_profiles/auth/google_oauth2/callback?state=STATE&code=string)
  5. Наблюдайте за модальным окном, заполненным ответом json, выданным локальным сервером rails

    { "access_token": "8gmvGfHsUx_1mrEAG1Vu", "login_profile_id": 1 }

  6. Обратите внимание, что модальное окно остается открытым. При закрытии вручную браузер сообщает об ошибке:

    Ошибка: всплывающее окно было закрыто, авторизация была отклонена или сообщение аутентификации не было получено до закрытия окна.

  7. Наблюдайте за отсутствием обновлений объекта клиентского сеанса

Ниже приведены мои версии lib и соответствующие фрагменты кода моего приложения. Любая помощь будет принята с благодарностью.

ОТЛАДКА: Эмбер: 1.13.3

ОТЛАДКА: данные Ember: 1.13.5

ОТЛАДКА: jQuery: 2.1.4

ОТЛАДКА: Ember Simple Auth: 0.8.0

ОТЛАДКА: Ember Simple Auth Torii: 0.8.0

Сервер:

class LoginProfiles::OmniauthCallbacksController < Devise::OmniauthCallbacksController

def google_oauth2
  login_profile = LoginProfile.find_or_create_by_google_oauth2(request.env['omniauth.auth'])

  render json: { access_token: login_profile.authentication_token, login_profile_id: login_profile.id }
end

def facebook
  login_profile = LoginProfile.find_or_create_by_facebook_oauth2(request.env['omniauth.auth'])

  render json: { access_token: login_profile.authentication_token, login_profile_id: login_profile.id }
end

конец

Клиент:

конфиг/environment.js

torii: {
  providers: {
    'google-oauth2': {
      clientId: 'string',
      redirectUri: 'http://localhost:3000/login_profiles/auth/google_oauth2/callback'
    },
    'facebook-oauth2': {
      clientId: 'string',
      redirectUri: 'http://localhost:3000/login_profiles/auth/facebook/callback'
    }

  }
},

'simple-auth': {
  authenticationRoute: 'sign-in',
  routeAfterAuthentication: 'index',
  authorizer: 'authorizer:application',
  crossOriginWhitelist: ['http://localhost:3000', 'http://localhost:4200']
},

маршруты/application.coffee

`import Ember from 'ember'`
`import ApplicationRouteMixin from 'simple-auth/mixins/application-route-mixin'`

ApplicationRoute = Ember.Route.extend ApplicationRouteMixin,
  actions:

    authenticateWithFacebook: ->      
      @get('session').authenticate('simple-auth-authenticator:torii', 'facebook-oauth2')

    authenticateWithGooglePlus: ->
      @get('session').authenticate('simple-auth-authenticator:torii', 'google-oauth2')

`export default ApplicationRoute`

шаблоны/application.hbs

<p>
  Sign in with
   <a {{action "authenticateWithGooglePlus"}}>Google</a>
    or
   <a {{action "authenticateWithFacebook"}}>Facebook</a>
   or
   {{#link-to 'register' id="register"}}register a new account.{{/link-to}}
 </p>

Bower.json

{
  "name": "brand-management-client",
  "dependencies": {
    "ember": "1.13.3",
    "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.3",
    "ember-cli-test-loader": "ember-cli-test-loader#0.1.3",
    "ember-data": "1.13.5",
    "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.5",
    "ember-qunit": "0.4.1",
    "ember-qunit-notifications": "0.0.7",
    "ember-resolver": "~0.1.18",
    "jquery": "^2.1.4",
    "loader.js": "ember-cli/loader.js#3.2.0",
    "qunit": "~1.17.1",
    "foundation": "~5.5.0",
    "ember-simple-auth": "0.8.0"
  }
}

пакет.json

{
  "name": "brand-management-client",
  "version": "0.0.0",
  "description": "Small description for brand-management-client goes here",
  "private": true,
  "directories": {
    "doc": "doc",
    "test": "tests"
  },
  "scripts": {
    "start": "ember server",
    "build": "ember build",
    "test": "ember test"
  },
  "repository": "",
  "engines": {
    "node": ">= 0.10.0"
  },
  "author": "",
  "license": "MIT",
  "devDependencies": {
    "broccoli-asset-rev": "^2.0.2",
    "broccoli-clean-css": "1.0.0",
    "ember-cli": "1.13.1",
    "ember-cli-app-version": "0.4.0",
    "ember-cli-babel": "^5.0.0",
    "ember-cli-coffeescript": "0.11.0",
    "ember-cli-dependency-checker": "^1.0.0",
    "ember-cli-foundation-sass": "1.1.1",
    "ember-cli-htmlbars": "0.7.9",
    "ember-cli-htmlbars-inline-precompile": "^0.1.1",
    "ember-cli-ic-ajax": "^0.2.1",
    "ember-cli-inject-live-reload": "^1.3.0",
    "ember-cli-qunit": "0.3.15",
    "ember-cli-release": "0.2.3",
    "ember-cli-sass": "3.1.0",
    "ember-cli-simple-auth": "0.8.0",
    "ember-cli-simple-auth-torii": "0.8.0",
    "ember-cli-uglify": "^1.0.1",
    "ember-data": "1.13.5",
    "ember-disable-proxy-controllers": "^1.0.0",
    "ember-export-application-global": "^1.0.2",
    "torii": "^0.5.1"
  }
}

person inknerd    schedule 03.08.2015    source источник


Ответы (1)


На самом деле перенаправление должно обрабатываться не приложением Rails, а torii, который будет считывать код аутентификации из строки запроса и отправлять его обратно в родительское окно (где вы можете использовать его в пользовательском аутентификаторе, чтобы обменять его на токен доступа для ваш API) — проверьте источник метода open поставщика Oauth 2.0 torii для справки: https://github.com/Vestorly/torii/blob/master/lib/torii/providers/oauth2-code.js#L118

person marcoow    schedule 05.08.2015
comment
Спасибо, что нашли время, чтобы помочь, но я думаю, что мой оригинальный пост, возможно, упустил некоторый контекст. Я добавил свою конфигурацию и образец, который я вижу в модальном окне. Я делаю, как вы предлагаете, и устанавливаю перенаправление в моей конфигурации для обработки torii, токен, который появляется в json в модальном режиме, является обменным токеном, возвращаемым обратным вызовом rails. Я видел, что в некоторых старых сообщениях упоминается рабочий процесс кода и токена для поставщиков по умолчанию torii. Возможно ли, что мне нужен собственный поставщик, чтобы установить рабочий процесс на токен вместо кода? Простите за неуместные вопросы и еще раз спасибо за помощь. - person inknerd; 06.08.2015
comment
Теперь я понимаю. redirectUri должен указывать на приложение ember, а не на сервер rails. По какой-то причине я думал, что вызов сервера для обмена был абстрагирован, и для этого будет использоваться redirectUri. Я просто пропускаю шаг. Еще раз спасибо. - person inknerd; 06.08.2015