3

我正在尝试在 Torii 中使用 github-oauth2 提供程序,但我不知道应该如何设置一些回调。我将跟踪我正在使用的代码以及我对它的理解,希望这可以帮助查明我哪里出错了。

首先,在我的行动中,我正在调用 torii 的open方法,正如它在文档中所说的那样:

this.get('torii').open('github-oauth2').then((data) => {
  this.transitionTo('dashboard')
})

而且,当然,我的设置中有以下设置config/environment.js

var ENV = {
  torii: {
    // a 'session' property will be injected on routes and controllers
    sessionServiceName: 'session',
    providers: {
      'github-oauth2': {
        apiKey:      'my key',
        redirectUri: 'http://127.0.0.1:3000/github_auth'
      }
    }
  },
}

redirectUri 用于我的 Rails 服务器。我在我的 github 应用程序上有相同的 redirectUri 设置,所以它们匹配。

这是我的服务器上的内容。很可能这就是问题所在。我会在最后谈到症状。

def github
  client_id = 'my id'
  client_secret = 'my secret'
  code = params[:code]
  @result = HTTParty.post("https://github.com/login/oauth/access_token?client_id=#{client_id}&client_secret=#{client_secret}&code=#{code}")
  @access_token = @result.parsed_response.split('&')[0].split('=')[1]
  render json: {access_token: @access_token}  
end

所以我按照我应该做的那样发布到 github 的 access_token 端点,然后我得到一个带有访问令牌的结果。然后我将该访问令牌打包为 json。

这样做的结果是 torii 弹出窗口转到 rails 页面:

在此处输入图像描述

不幸的是,我希望的是 torii 弹出窗口消失,为我的应用程序提供access_token,并让代码继续前进并执行我的then块中的代码。

我哪里错了?

4

1 回答 1

5

非常感谢 Kevin Pfefferle,他帮助我解决了这个问题,并将代码分享到了他的应用程序 ( gitzoom ),他在那里实现了一个解决方案。

所以第一个修复是清除我的redirectUri,并在 github 上将其设置为localhost:4200. 这使应用程序重定向,使其成为重定向到的 Ember 应用程序。

第二个修复是创建一个自定义的 torii 提供程序

//app/torii-providers/github.js
import Ember from 'ember';
import GitHubOauth2Provider from 'torii/providers/github-oauth2';

export default GitHubOauth2Provider.extend({
  ajax: Ember.inject.service(),
  fetch(data) {
    return data;
  },
  open() {
    return this._super().then((toriiData) => {
      const authCode = toriiData.authorizationCode;
      const serverUrl =  `/github_auth?code=${authCode}`;

      return this.get('ajax').request(serverUrl)
        .then((data) => {
          toriiData.accessToken = data.token;
          return toriiData;
        });
    });
  }
});

不知道为什么then会触发,但then我之前使用的没有。无论如何,它会抓取数据并将其返回,然后我之前使用的 promise 会正确获取数据。

this.get('torii').open('github-oauth2').then((data) => {
  //do signon stuff with the data here
  this.transitionTo('dashboard')
})

所以我们开始吧!希望这可以帮助其他被困在未来的人。

于 2016-05-16T21:16:54.580 回答