2016-07-11 6 views
0

Ich arbeite mit einem JWT-Token, um die Benutzerregistrierung zu validieren. Eine eindeutige URL wird an die E-Mail-Adresse des Benutzers gesendet und diese wird an die Authentifizierungsseite weitergeleitet. Das Token wird auf der Serverseite decodiert und ich muss diese JSON-Daten an die Client-Seite senden. Wie kann ich dies tun, indem ich token als Abfrageparameter benutze und ihn mit ngResource abrufe?Wie bekomme ich JWT-Token von Express zu Angular mit ngResource?

server.js

'use strict'; 

var express = require('express'); 
var app = express(); 
var router = express.Router(); 
var bodyParser = require('body-parser'); 
var nodemailer = require('nodemailer'); 
var jwt = require('jsonwebtoken'); 
var moment = require('moment'); 

var port = process.env.PORT || 5000; 

app.use(express.static('./src/client/')); 
app.use(express.static('./')); 
app.use(express.static('./.tmp')); 
app.use('/*', express.static('./src/client/index.html')); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 

// sign with default (HMAC SHA256) 
var expires = moment().add(12, 'hours').valueOf(); 
var token = jwt.sign({ 
    user: 'userdata', 
    iat: Math.floor(Date.now()/1000), 
    expireIn: expires 
}, 'thisismysecretstring'); 


// nodemailer sendMail function 
app.post('/sendMail', function(req, res) { 
    var transporter = nodemailer.createTransport('smtp://b204bf8f6ede15:[email protected]:2525'); 
    var data = req.body; 
    var mailOptions = { 
    from: '[email protected]', 
    to: data.email, 
    subject: 'Email sent by ' + data.displayName, 
    html: '<p>Please click on url below to register</p><br><a href="http://localhost:3000/auth/?token='+token+'">CLICK HERE</a>' 
    }; 
    transporter.sendMail(mailOptions, function(error, info) { 
    if (error) { 
     return console.log(error); 
    } 
    console.log('Message sent: ' + info.response); 
    }); 
    res.json(token); 
}); 

// decode token from url parameter 
app.get('/auth', function(req, res) { 
    var token = req.query.token; 
     try { 
      var decoded = jwt.verify(token, 'thisismysecretstring'); 
      if (decoded.exp <= Date.now()) { 
      res.end('Access token has expired', 400); 
      } 
      res.json(decoded); 
     } catch (err) { 
      console.log(err); 
      res.json(err); 
     } 
}); 

// router.use(function(req, res, next) { 
//  var token = req.query.token; 
//  try { 
//   var decoded = jwt.verify(token, 'thisismysecretstring'); 
//   res.json(decoded); 
//  } catch (err) { 
//   console.log(err); 
//   res.json(err); 
//  } 
// }); 
// app.use('/auth', router); 

app.listen(port, function() { 
    console.log('Express app listening on port: ' + port); 
    console.log(__dirname); 
}); 

token.js

(function() { 
    'use strict'; 
    angular 
     .module('xfire.token', ['ngResource']) 
     .factory('Token', function($resource) { 
      return $resource('auth/:token', { 
       token: '@token' 
      }); 
     }); 
})(); 

url Format:

http://localhost:3000/auth/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZ2NmYWJyaSIsImlhdCI6MTQ2ODI0NDI1NCwiZXhwaXJlSW4iOjIxNjAwMDAwfQ.5rs1rlWMTTcap4idG-XOU-UiwbU0YzlnAYjm9Vwz-B0 
+0

Können Sie Ihren AngularJS-Code anzeigen? –

Antwort

0

ich es in der Regel in einem Header senden, am häufigsten nenne ich es x-auth-header.

Ich benutze aber nicht, ich empfehle niemand (außer herumspielen), ngResource zu verwenden, da es einschränkend ist.

Persönlich verwende ich restangular, mit Anfrage/Antwort-Interzeptoren.

Antwortabfangvorrichtung, um das Token zu erfassen und zu decodieren, und Abfangvorrichtung auffordern, die Anforderung mit "Bearer" + tokenString zu autorisieren.

Verwandte Themen