2016-03-13 131 views
3

我想利用cookies來登錄的用戶在Loopback中設置訪問令牌Cookie?

在此頁面here他們說

使用Cookie進行身份驗證,添加以下server.js (啓動前):

app.use(loopback.token({ model: app.models.accessToken })); 

看起來很簡單。我認爲cookie在登錄過程中是由Loopback自動設置的,但它仍然不起作用,我在Chrome開發工具中檢查了我的cookie,並且沒有設置cookie。

我錯過了什麼嗎?否則,鉤入登錄方法以設置cookie/header的最佳方式是什麼?

我在loopback.token()方法here上找到了文檔,它說明它在哪裏檢查令牌。

+0

我已經成功地用'res.setHeader('Set-Cookie','access_token ='+ token.id')設置cookie;'並在瀏覽器中看到它,但我必須承認,我不知道如何在回送中實際使用令牌。儘管cookie已設置,但Loopback不會獲取與Cookie關聯的用戶。 – user465342

回答

1

我得到它的工作。該cookie沒有被簽名。

我對Express和更低級別的東西都很新穎。我記得讀到cookie必須簽名,但它讓我想起我必須通過「簽名:真」。

My issue on Github如果有幫助其他人。

+0

好吧,但你實際上做了什麼才能讓cookie被簽名? – anonymouse

+0

@anonymouse我用我的代碼片段回覆了對Github的評論:https://github.com/strongloop/loopback/issues/2142 – Zuko

+0

但是如果我們有一個內置用戶模型,那麼在哪個文件中我們可以設置曲奇餅。 – ashishSober

0

下面是詳細的步驟:

  1. npm install --save cookie-parser
  2. npm install --save express-session
  3. 修改您server.js讓你添加cookieParser並定義了一個Cookie祕密,

    var cookieParser = require('cookie-parser');

    app.use(cookieParser('a random quote'));

此代碼應該出現之前

app.set('views', './server/views'); 
app.set('view engine', 'ejs'); 

當你登錄用戶創建簽名的cookie,它是重要的,它是一個簽署的cookie,因爲環路將無法讀取無符號的餅乾。例如:

router.post('/login', function(req, res) { 
     User.login({ 
      email: req.body.email, 
      password: req.body.password 
     }, 'user', function(err, token) { 
      if (err) { 
       if (err.details && err.code === 'LOGIN_FAILED_EMAIL_NOT_VERIFIED') { 
        res.render('reponseToTriggerEmail', { 
         title: 'Login failed', 
         content: err, 
         redirectToEmail: '/api/users/' + err.details.userId + '/verify', 
         redirectTo: '/', 
         redirectToLinkText: 'Click here', 
         userId: err.details.userId 
        }); 
       } else { 
        res.render('response', { 
         title: 'Login failed. Wrong username or password', 
         content: err, 
         redirectTo: '/', 
         redirectToLinkText: 'Please login again', 
        }); 
       } 
       return; 
      } 

     res.cookie('access_token', token.id, { signed: true , maxAge: 300000 }); 

     res.render('engine', { 
      email: req.body.email, 
      accessToken: token.id, 
      redirectUrl: '/api/users/change-password?access_token=' + token.id 
     }); 
    }); 
}); 

而那就是它。