我正在尝试使用Ember Torii和Ember Simple Auth对Twitter进行身份验证 . 但是,一旦用户通过身份验证,我不确定如何正确关闭身份验证弹出窗口 . 我的代码:
//app/authenticators/torii.js
import {inject as service} from '@ember/service';
import Torii from 'ember-simple-auth/authenticators/torii';
export default Torii.extend({
torii: service(),
ajax: service(),
authenticate() {
const ajax = this.get('ajax');
return this._super(...arguments).then((data) => {
console.log('Authorization data:');
console.log(data);
if(data.provider === "twitter" && data.code) {
return {
accessToken: data.code,
provider: data.provider
};
}
//This is for OAuth2 providers e.g. Facebook
return ajax.request(
'http://localhost:8080/api/1/auth', {
type: 'POST',
dataType: 'json',
crossDomain: true,
contentType: 'application/json',
data: {'provider': data.provider, 'authorizationCode': data.authorizationCode}
}).then((response) => {
return {
accessToken: response.token,
provider: data.provider
};
});
});
}
});
//config/environment.js
.......
providers: {
'facebook-oauth2': {
apiKey: 'xxxxxxxxxxxxxx',
scope: 'public_profile,email'
},
'twitter': {
requestTokenUri: 'http://localhost:8080/api/1/auth/twitter/'
},
//app/torii-providers/facebook-oauth2.js
import { computed } from '@ember/object';
import FacebookOauth2Provider from 'torii/providers/facebook-oauth2';
export default FacebookOauth2Provider.extend({
redirectUri: computed(function() {
return [
window.location.protocol,
'//',
window.location.host,
'/torii/redirect.html'
].join('');
}),
fetch(data) {
return data;
}
});
根据我的理解,使用Twitter进行身份验证时会发生以下情况:
-
用户单击UI元素以启动身份验证流程 . Ember Torii创建一个弹出窗口并向
requestTokenUri
发出GET请求 . API后端生成Twitter所需的oauth_token
,并使用oauth_token
作为查询参数重定向到Twitter登录页面 . -
用户登录 . 假设登录成功,Twitter随后将浏览器弹出窗口重定向到API后端的已配置
Callback URL
以及oauth_token
和oauth_verifier
参数 . -
后端API的
Callback URL
接收这些参数,并为存储在后端的oauth_token
和oauth_token_secret
交换这些参数 .
我的问题基本上是,接下来会发生什么以及如何干净安全地关闭弹出窗口并初始化会话:
我的后端将上面3中生成的令牌转换为内部JWT令牌,并将浏览器弹出窗口重定向到 torii/redirect.html?code=<<JWTTOKEN>>
. 但是,当浏览器弹出窗口关闭时,Torii会尝试通过调用authenticate方法重新验证给定的令牌,这不是必需的 . 我在 app/authenticators/torii.js
中显示了上面显示的解决方法 . 它是否正确?有没有更好的办法?