【问题标题】:Append firebase JWT in Ember-simple-auth在 Ember-simple-auth 中附加 firebase JWT
【发布时间】:2017-05-24 20:52:27
【问题描述】:

我正在尝试在我的 Ember App(2.10) 中进行授权。我的工作流程是

  1. 用户点击Facebook登录按钮然后
  2. 我正在使用 torii 获取访问令牌/我的用户数据库在 firebase 上/
  3. 然后我通过 facebook 提供商将令牌发送到 firebase.auth。它返回 JWT 令牌。

问题是我获得了 JWT 令牌,现在我必须登录到我的 emberapp。我正在尝试在这里自定义 torii 验证器。我如何在 ember 应用程序中实现这一点。以下是我的身份验证器:

authenticate() {
return this._super(...arguments).then((torii) => {
    const serverTokenEndpoint = this.get('serverTokenEndpoint');
    return this.get('ajax').request(serverTokenEndpoint, {
        type: 'POST',
        data: {
        'type': torii.provider,
        'client_id': this.client,
        'token': torii.authorizationCode
        }
    }).then((token) => {
        var provider = new firebase.auth.FacebookAuthProvider();
        firebase.auth().signInWithPopup(provider).then(function(result) {
        // This gives Facebook Access Token.
        // JWT-token=result.user.Cd
        // JWT-token.iat at=result.user.ea.Sa
        // JWT-token-refresh = result.user.refreshToken
        console.log(result)
        //   token = result.user.Cd;
        // const expiresAt = this._absolutizeExpirationTime(result.user.ea.Sa);
        token = Ember.assign(token, { 'expires_at': result.user.ea.Sa });
        // this._scheduleAccessTokenRefresh(result.user.ea.Sa, expiresAt, result.user.refreshToken, torii);
        return Ember.assign(token, {'torii': torii});
        });
    });
    });  
}

【问题讨论】:

    标签: facebook authentication ember.js firebase torii


    【解决方案1】:

    查看 ESA 存储库中的 this guide。它涵盖了 torii 和 Github 身份验证,但一般概念对于您的用例是相同的。

    【讨论】:

    • 到目前为止,我确实进行了身份验证,但我该如何处理令牌刷新?我使用 firebase.auth() 并获得响应,将响应令牌分配给 Ember 解析 access_token 并出现第二个问题。令牌过期了怎么办?
    【解决方案2】:

    @marcoow 我确实尝试过这个并且它进行了身份验证,但是当令牌过期时我无法刷新令牌。似乎这不是正确的方法,我如何使用 firebase 刷新令牌

    export default ToriiAuthenticator.extend({
        torii: Ember.inject.service(),
        ajax: Ember.inject.service(),
        refreshAccessTokens: true,
        rejectWithResponse: false,
    
        restore(data) {
            return new RSVP.Promise((resolve, reject) => {
                const now = (new Date()).getTime();
                const refreshAccessTokens = this.get('refreshAccessTokens');
                if (!isEmpty(data['expires_at']) && data['expires_at'] < now) {
                    // if (refreshAccessTokens) {
                    this._refreshAccessToken(data['expires_in'], data['refresh_token']).then(() => {
                        resolve();
                    }).catch(function(error) {
                        reject();
                    });
    
                    // } else {
                    // reject();
                    // }
                } else {
                    if (!this._validate(data)) {
                        reject();
                    } else {
                        this._scheduleAccessTokenRefresh(data['expires_in'], data['expires_at'], data['refresh_token']);
                        resolve(data);
                    }
                }
            });
        },
        authenticate() {
            return new Ember.RSVP.Promise((resolve, reject) => {
                var provider = new firebase.auth.FacebookAuthProvider();
                firebase.auth().signInWithPopup(provider).then((result) => {
                    var expires_in = this._absolutizeExpirationTime(result.user.ea.Sa);
                    var expiresAt = result.user.ea.Sa;
                    result = Ember.assign(result, { 'expires_at': expiresAt, 'expires_in': expires_in, 'access_token': result.user.Cd, 'refresh_token': result.refresh_token });
                    resolve(result)
                });
                // const useResponse = this.get('rejectWithResponse');
                // const provider = new firebase.auth.FacebookAuthProvider();
                // firebase.auth().signInWithPopup(provider).then((result) => {
                //     let expires_in = result.user.ea.Sa;
                //     const expiresAt = this._absolutizeExpirationTime(expires_in);
                //     this._scheduleAccessTokenRefresh(expires_in, expiresAt, result.refresh_token);
                //     if (!isEmpty(expiresAt)) {
                //         result = Ember.assign(result, { 'expires_at': expiresAt, 'expires_in': expires_in, 'access_token': result.user.Cd, 'refresh_token': result.refresh_token });
                //     }
                //     // resolve(result);
                // }, (response) => {
                //     Ember.run(null, reject, useResponse ? response : response.responseJSON);
                // }).catch(function(error) {
                //     console.log(error);
                // });
            });
        },
        invalidate(data) {
            const serverTokenRevocationEndpoint = this.get('serverTokenRevocationEndpoint');
            return new RSVP.Promise((resolve) => {
                if (isEmpty(serverTokenRevocationEndpoint)) {
                    resolve();
                } else {
                    if (!Ember.isEmpty(data.access_token)) {
                        delete data.access_token;
                        firebase.auth().signOut();
                        resolve();
                    }
                }
            });
        },
        _scheduleAccessTokenRefresh(expiresIn, expiresAt, refreshToken) {
            console.log('sched')
            const refreshAccessTokens = this.get('_refreshAccessTokens');
            if (refreshAccessTokens) {
                const now = (new Date()).getTime();
                if (isEmpty(expiresAt) && !isEmpty(expiresIn)) {
                    expiresAt = new Date(now + expiresIn * 1000).getTime();
                }
                const offset = this.get('tokenRefreshOffset');
                if (!isEmpty(refreshToken) && !isEmpty(expiresAt) && expiresAt > now - offset) {
                    run.cancel(this._refreshTokenTimeout);
                    delete this._refreshTokenTimeout;
                    if (!testing) {
                        this._refreshTokenTimeout = run.later(this, this._refreshAccessToken, expiresIn, refreshToken, expiresAt - now - offset);
                    }
                }
            }
        },
    
        _refreshAccessToken(expiresIn, refreshToken) {
            console.log('refresh');
            const data = { 'grant_type': 'refresh_token', 'refresh_token': refreshToken };
            firebase.auth().currentUser.getToken(/ forceRefresh / true).then((response) => {
                return new RSVP.Promise((resolve, reject) => {
                    // firebase.auth().currentUser.getToken(true).then((response) => {
                    expiresIn = response.user.ea.Sa || expiresIn;
                    refreshToken = response.refresh_token || refreshToken;
                    const expiresAt = this._absolutizeExpirationTime(expiresIn);
                    const data = assign(response, { 'expires_in': expiresIn, 'expires_at': expiresAt, 'refresh_token': refreshToken });
                    this._scheduleAccessTokenRefresh(expiresIn, null, refreshToken);
                    this.trigger('sessionDataUpdated', data);
                    resolve(data);
                }, (response) => {
                    warn(`Access token could not be refreshed - server responded with ${response.responseJSON}.`);
                    reject();
                });
            });
        },
    
        _absolutizeExpirationTime(expiresIn) {
            if (!isEmpty(expiresIn)) {
                return new Date((new Date().getTime()) + expiresIn * 1000).getTime();
            }
        },
    
        _validate(data) {
            return !isEmpty(data['access_token']);
        }
    });
    

    【讨论】:

    • 我不知道令牌刷新如何与 Firebase 配合使用。在 ESA 中,您需要在首次进行身份验证或稍后恢复会话时安排刷新(身份验证器的 authenticaterestore 方法)。
    • 是的,我明白,在 Firebase 中,他们说使用 firebase.auth().currentUser.getToken(true) 会提供 JWT,如果过期,他们会提供刷新的令牌。我也在 authenticate 方法和 restore 方法中使用了 refreshAccessToken。这就是问题所在。它不会刷新令牌。
    • 就我而言,我不能简单地使用 emberfire 仅通过 firebase 进行身份验证。在 firebase 上只有我的帐户数据库,而不是我的主要内容。所以这就是发生在我身上的事
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多