Firebase JS SDK中的会话令牌的显式更新

时间:2018-12-23 07:30:40

标签: javascript reactjs firebase firebase-authentication

我已经使用Firebase Auth为几个提供商实现了登录方法:

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL).then(() => {
  let provider = new firebase.auth.GoogleAuthProvider(); // + facebook, gitHub
  provider.addScope('profile');
  provider.addScope('email');
  firebase.auth().signInWithPopup(provider).then(result => {
    // app logic here

但是此代码为我提供了60分钟的持续会话,我想学习如何自动更新当前用户会话,而不必每小时强制登录。

我还使用此代码“监听”当前的用户会话状态。

firebase.auth().onAuthStateChanged(user => if (!user) //goto LoginPage

但是它本身并不“监听”,仅当我尝试浏览或更新页面时才起作用。因此,我不知道如何使用Firebase方法在确切的时间量(例如最多15分钟)内限制访问。

文档说有一个getIdToken方法,但是我无法确定该代码的使用位置。应该在到期前每60分钟调用一次还是应该在登录时进行设置?请提供一些提示或有关此情况的任何教程。

编辑:

一段时间不活动(我认为不到1小时)后,我也会在控制台中获得以下代码:

auth.esm.js:121 POST https://securetoken.googleapis.com/v1/token?key=AIza... 403

2 个答案:

答案 0 :(得分:1)

Firebase令牌设置为在60分钟后过期。然后它会自动为您刷新。无法配置到期时间,因此不需要在前端代码中做任何特殊的事情。

唯一的窍门是,您需要授予应用程序API密钥使用令牌服务API的权限,以便一旦过期就可以为您铸造新的id令牌。这是在GCP控制台,API和服务(凭据)中完成的。

因此,代码应如下所示

  1. 添加用户authentication state change Listener

    public ControllerTestsBase(WebApplicationContext webApplicationContext,
                               FilterChainProxy springSecurityFilterChain) {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
            .addFilter(springSecurityFilterChain)
            .build();
    }
    
  2. 实施登录逻辑

    
    fbAuth.onAuthStateChanged(user => {
      if (user) {
        // User is logged in
        // Proceed with your logged in user logic
      } else {
        // USer is not logged in
        // Redirect to the login page
      }
    })
    

您可以根据使用情况auth-state-persistence设置登录前的身份验证状态持久性。

  1. 确保您的应用程序API密钥可以访问GCP控制台中的令牌服务API 这是在 GCP控制台| API和服务| Credentials 然后,为您的部署环境编辑相应的密钥,以向API密钥授予对令牌服务API的访问权限。

祝你好运;)

答案 1 :(得分:0)

首先,我要对我英语不好的人表示抱歉。我不太了解firebase,但我认为如果您编写这样的内容,它应该可以工作:

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION).then(() => {
let provider = new firebase.auth.GoogleAuthProvider(); // + facebook, gitHub
provider.addScope('profile');
provider.addScope('email');
firebase.auth().signInWithPopup(provider).then(result => {
// app logic here

我的意思是您应该将firebase.auth.Auth.Persistence.SESSION插入为LOCAL