基于Token的API接口认证机制

2017-06-07  本文已影响1986人  FX_SKY

Cookie Auth

Cookie认证机制就是为一次请求认证在服务端创建一个Session对象,同时在客户端的浏览器端创建了一个Cookie对象;通过客户端带上来Cookie对象来与服务器端的session对象匹配来实现状态管理的。默认的,当我们关闭浏览器的时候,cookie会被删除。但可以通过修改cookie 的expire time使cookie在一定时间内有效。

Token Auth的优点

Token机制相对于Cookie机制相比有以下优势:

认证过程

下面我们从一个实例来看如何运用JWT机制实现认证:

登录授权

请求认证

基于Token的认证机制会在每一次请求中都带上完成签名的Token信息,这个Token信息可能在COOKIE
中,也可能在HTTP的Authorization头中。

过程如下:

基于JWT的Token认证机制实现

JWT

Java中对JWT的支持可以考虑使用JJWT开源库。
maven依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>

JWT Token生成&验证代码:

import io.jsonwebtoken.*;
import io.jsonwebtoken.impl.crypto.MacProvider;
import org.apache.commons.codec.Charsets;
import org.junit.Before;
import org.junit.Test;

import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;

/**
 * ${DESCRIPTION}
 *
 * @author Ricky Fung
 */
public class JwtTokenTest {

    private Key key;
    private SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

    @Before
    public void init() {

        String secret = "ricky";
        //We will sign our JWT with our ApiKey secret
        byte[] apiKeySecretBytes = secret.getBytes(Charsets.UTF_8);
        key = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
    }

    @Test
    public void testEncode() {

        long ttl = 7200 * 1000;
        Date now = new Date();
        Date exp = new Date(now.getTime() + ttl);

        //Let's set the JWT Claims
        JwtBuilder builder = Jwts.builder().setId("ucode")
                .setIssuedAt(now)
                .setExpiration(exp)
                .setSubject("sub")
                .setIssuer("iss")
                .setAudience("aud")
                .setHeaderParam(Header.TYPE, Header.JWT_TYPE)
                .signWith(signatureAlgorithm, key);

        String compactJws = builder.compact();
        System.out.println(compactJws);
    }

    @Test
    public void testDecode() {
        String compactJws = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJ1Y29kZSIsImlhdCI6MTQ5NzIzOTE2NiwiZXhwIjoxNDk3MjQ2MzY2LCJzdWIiOiJzdWIiLCJpc3MiOiJpc3MiLCJhdWQiOiJhdWQifQ.gc0OcIlBQND8TlPN6q1nUQf852aIxK4mgkHBBrYMLZ4";

        try {
            Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws).getBody();

            //OK, we can trust this JWT
            System.out.println("ID: " + claims.getId());
            System.out.println("Subject: " + claims.getSubject());
            System.out.println("Issuer: " + claims.getIssuer());
            System.out.println("Audience: " + claims.getAudience());
            System.out.println("Expiration: " + claims.getExpiration());
        } catch (SignatureException e) {
            //don't trust the JWT!
        }
    }

    @Test
    public void testSimple() {

        Key key = MacProvider.generateKey();

        String compactJws = Jwts.builder()
                .setSubject("Joe")
                .signWith(SignatureAlgorithm.HS512, key)
                .compact();

        System.out.println(compactJws);
    }
}
上一篇下一篇

猜你喜欢

热点阅读