<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>jwt &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/jwt/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Tue, 16 Jan 2018 10:00:32 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>jwt &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Implementar JSON Web Tokens con NodeJS</title>
		<link>https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/</link>
					<comments>https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 16 Jan 2018 10:00:32 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[express]]></category>
		<category><![CDATA[jwt]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2003</guid>

					<description><![CDATA[<p>JSON Web Tokens o simplemente JTW, es una herramienta que nos permite autenticarnos con el servidor mediante Tokens de una forma simple y segura. Los Tokens son una cadena de alfanumérica, que es generada por el servidor y es enviada al cliente para autenticaciones futuras, evitando tener que enviar credenciales en cada invocación. Te recomiendo [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/">Implementar JSON Web Tokens con NodeJS</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="aligncenter size-full wp-image-2009" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/implementando-JSON-Web-Tokens-con-NodeJS-Cuarta-parte.png" alt="implementando JSON Web Tokens con NodeJS - Cuarta parte" width="724" height="406" />JSON Web Tokens o simplemente JTW, es una herramienta que nos permite autenticarnos con el servidor mediante Tokens de una forma simple y segura. Los Tokens son una cadena de alfanumérica, que es generada por el servidor y es enviada al cliente para autenticaciones futuras, evitando tener que enviar credenciales en cada invocación.<span id="more-2003"></span></p>
<p><em>Te recomiendo que te des una venta a mi artículo <a href="https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/"><strong>Autenticación con JSON Web Tokens</strong></a>, el cual abordo toda la teoría, por si no estás familiarizado con el concepto de Tokens y la forma de trabajar.</em></p>
<p><em>Este artículo es parte de una colección de artículo en donde explico cómo <a href="https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/"><strong>Construir un API REST con NodeJS</strong></a>, por lo que si estas interesado puede regresar desde el comienzo.</em></p>
<h2>Implementando JWT en un API REST</h2>
<p>Lo primero será instalar el módulo de JWT, para lo cual, ejecutaremos el comando <span class="lang:default decode:true crayon-inline">npm install &#8211;save jsonwebtoken body-parser</span> , una vez hecho esto, tendremos que implementar un servicio de autenticación tradicional, el cual reciba usuario y contraseña y nos regrese un token en caso de éxito. El servicio quedaría de la siguiente manera:</p>
<pre class="lang:js decode:true ">var jwt = require('jsonwebtoken')
var bodyParser = require('body-parser')

app.use(bodyParser.urlencoded({extended: false}))
app.use(bodyParser.json({limit:'10mb'}))

app.post('/login', (req, res) =&gt; {
  var username = req.body.user
  var password = req.body.password

  if( !(username === 'oscar' &amp;&amp; password === '1234')){
    res.status(401).send({
      error: 'usuario o contraseña inválidos'
    })
    return
  }

  var tokenData = {
    username: username
    // ANY DATA
  }

  var token = jwt.sign(tokenData, 'Secret Password', {
     expiresIn: 60 * 60 * 24 // expires in 24 hours
  })

  res.send({
    token
  })
})</pre>
<p>La función login recibe como parámetro el usuario (<span class="lang:default decode:true crayon-inline ">req.body.user</span> ) y el password (<span class="lang:default decode:true crayon-inline ">req.body.password</span> ), los cuales los tendremos que validar contra nuestros usuarios, sin embargo, en este caso, para hacerlo más simple, lo hemos validado contra el usuario oscar/1234, si la autenticación falla, entonces regresamos un error al cliente. Por otra parte, si todo sale bien, creamos un token al usuario, el cual tiene una vigencia de 24 horas, para finalmente retornarlo.</p>
<p>Veamos un ejemplo de autenticación:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2004" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Creando-el-Token-JWS.png" alt="Creando el Token JWS" width="938" height="762" /></p>
<p>En la imagen pasada hemos enviado las credenciales correctas para que nos genere un token, sin embargo, no se puede ver correctamente debido a su longitud, es por ello que lo ponemos por a continuación:</p>
<pre class="lang:js decode:true">{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im9zY2FyIiwiaWF0IjoxNTE2MDY4OTI4LCJleHAiOjE1MTYxNTUzMjh9.zucLW085AiZ8VWojwNFFcMz0yv1H4RbeCMQy7lVjS7s"
}</pre>
<p>Este token deberá ser guardado por el usuario para futuras invocaciones al API.</p>
<h2>Autenticándonos mediante Tokens</h2>
<p>El siguiente paso será crear un servicio protegido que valida la existencia del token, de lo contrario, evitará el acceso, para ello crearemos un servicio de prueba llamado secure:</p>
<pre class="lang:js decode:true">app.get('/secure', (req, res) =&gt; {
    var token = req.headers['authorization']
    if(!token){
        res.status(401).send({
          error: "Es necesario el token de autenticación"
        })
        return
    }

    token = token.replace('Bearer ', '')

    jwt.verify(token, 'Secret Password', function(err, user) {
      if (err) {
        res.status(401).send({
          error: 'Token inválido'
        })
      } else {
        res.send({
          message: 'Awwwww yeah!!!!'
        })
      }
    })
})</pre>
<p>Como podemos observar, lo primero que tenemos que hacer, es recuperar el header correspondiente al token, es decir, el token “<span class="lang:default decode:true crayon-inline ">authorization</span> ”, si este header no se encuentra, entonces retornamos un código 401 (No autorizado) y regresamos el motivo del error.</p>
<p>El siguiente paso es algo confuso, pues al token hay que retirarla el substring “<span class="lang:default decode:true crayon-inline ">Baerer </span> “, este String es parte de las especificaciones de HTTP, y es agredo de forma automática, por lo que no entraremos en detalles, simplemente lo retiramos.</p>
<p>Finalmente, validamos el token mediante el método verify, el cual validará que el token sea válido y además que no esté caducado, en cualquiera de estos dos casos, un error 401 es retornado junto con el mensaje de error. Finalmente, si todo sale bien, procedemos con la operación de negocio.</p>
<p>El siguiente request es enviado son el header, retornando un error 401 y su mensaje de error correspondiente:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2005" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Validacion-fallida-del-token-JWT.png" alt="Validacion fallida del token JWT" width="926" height="651" /></p>
<p>Este nuevo request es enviado con el header ‘<span class="lang:default decode:true crayon-inline ">authorization</span> ’ el cual corresponde a un token válido generado por el servicio de login:<img loading="lazy" class="aligncenter size-full wp-image-2006" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Validacion-exitosa-del-token-JWT.png" alt="" width="926" height="661" /></p>
<p>NOTA: Siempre será mejor usar un middleware para validar el token, de esta forma, evitamos tener que validar el token en cada invocación, sin embargo, lo hemos hecho así para hacer más fácil el ejemplo.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/">Implementar JSON Web Tokens con NodeJS</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2003</post-id>	</item>
	</channel>
</rss>
