使用ember-simple-auth和torii,尽管服务器响应成功,模态永远不会关闭,会话永远不会更新

时间:2015-08-03 15:03:53

标签: ember.js devise ember-cli ember-simple-auth torii

我试图在我的rails后端使用ember-cli,ember-simple-auth,torii和devise来允许多个oauth提供者。一切似乎都有效,但模式永远不会关闭,客户端中的会话永远不会更新。

重新制作的步骤:

  1. 点击通过google-oauth2提供商
  2. 登录的链接
  3. 使用帐户登录选项列表
  4. 观察模态打开
  5. 选择帐户并登录
  6. 观察模式重定向到本地rails服务器以进行令牌交换(http://localhost:3000/login_profiles/auth/google_oauth2/callback?state=STATE&code=string
  7. 观察填充了本地rails服务器发出的json响应的模式窗口

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

  8. 观察模态保持打开状态。如果手动关闭,浏览器会报告错误:

    错误:弹出窗口已关闭,授权被拒绝,或者在窗口关闭之前未收到验证消息。

  9. 不观察客户会话对象的更新

  10. 下面是我的lib版本和我的应用程序代码的相关部分。任何帮助将不胜感激。

    DEBUG:Ember:1.13.3

    DEBUG:Ember数据:1.13.5

    DEBUG:jQuery:2.1.4

    DEBUG:Ember Simple Auth:0.8.0

    DEBUG: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"
      }
    }
    

    的package.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"
      }
    }
    

1 个答案:

答案 0 :(得分:3)

重定向实际上不应该由Rails应用程序处理,而是通过torii来处理,它将从查询字符串中读取auth代码并将其发送回父窗口(您可以在自定义验证器中将其用于交换它以用于交换它您的API的访问令牌) - 检查Torii的来源 Oauth 2.0提供商的open方法供参考:https://github.com/Vestorly/torii/blob/master/lib/torii/providers/oauth2-code.js#L118