Как работает веб-токен JSON при загрузке Spring? - PullRequest
0 голосов
/ 13 июня 2018

Я хочу написать службу REST и выбрать JWT для защиты этой службы отдыха.Я заявляю 1 минуту для токена, после чего я должен сделать?Я должен обновить токен или что-то еще?

Если я должен обновить токен, пользователь может вызвать метод сервиса с этим токеном?

Код токена

package com.example.demo.config;

import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.ArrayList;
import java.util.Arrays;

public class TokenAuthenticationService {

    //field of conf
    static final long EXPIRATIONTIME = 60_000; // 1 min
    static final String SECRET = "msg";
    static final String TOKEN_PREFIX = "Bearer";
    static final String HEADER_STRING = "Authorization";

    //generate token
    public static void addAuthentication(HttpServletResponse res, Authentication auth) {
        String concattedRoles = "";
        for (GrantedAuthority ga : auth.getAuthorities()) {
            if (!"".equals(concattedRoles))
                 concattedRoles += "," + ga.getAuthority();
             else
                 concattedRoles += ga.getAuthority();
        }
        String JWT = Jwts.builder().setSubject(auth.getName()).claim("roles", concattedRoles)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME))
                .signWith(SignatureAlgorithm.HS512, SECRET).compact();
        res.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT);
    }

    //get token from request header.
    public static Authentication getAuthentication(HttpServletRequest request) {
        try {
            System.out.println("(Authentication getAuthentication(HttpServletRequest request)");
            String token = request.getHeader(HEADER_STRING);
            System.out.println("token=>"+token);
            if (token != null) {
                Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token.replace(TOKEN_PREFIX, "")).getBody();
                String user = claims.getSubject();
                String roles = (String) claims.get("roles");

                if(claims.getExpiration().before(new Date(System.currentTimeMillis())))
                    throw new Exception(); //Here trow exception.
                List<String> roleList = Arrays.asList(roles.split("\\s*,\\s*"));
                List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
                for (int i = 0; i < roleList.size(); i++) {
                    System.out.println(roleList.get(i));
                    SimpleGrantedAuthority abv = new SimpleGrantedAuthority(roleList.get(i));
                    grantedAuths.add(abv);
                }
                System.out.println(grantedAuths);
                return user != null ? new UsernamePasswordAuthenticationToken(user, null, grantedAuths) : null;
            }
            return null;
        }catch (Exception e){
            System.out.println(e);
            return null;
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

В основном refresh_token используется для возврата действительного access_token пользователю по запросу.И refresh_tokens обычно являются долгоживущими, а не недолговечными.

Лично мой дизайн защиты RESTful API - просто позволить им запросить access_token к моей конечной точке, то есть https://api.example.com/oauth/token каждый раз я не даю refresh_token, потому что идея для меня - просто впустить их в ресурс, и ничего больше.И обычно запрашивающий ресурс не будет оставаться так долго в определенном сеансе.Что касается других проблем, связанных с тем, что сервер получает слишком много запросов для одного и того же пользователя / сеанса, вы можете внедрить rate-limiting для своих серверов или конечной точки токена.

Я основал свои реализации безопасности API на PayPal и JHipster .Они не предоставляют refresh_tokens для своих соответствующих реализаций API RESTful, потому что, в конце концов, refresh_tokens является необязательным для использования, и это просто вопрос того, чего вы хотите достичь при защите ваших конечных точек RESTful.

Для получения дополнительной информации о refresh_token вы можете получить следующие ссылки: Когда использовать токены JWT и Понимание токенов обновления .

0 голосов
/ 13 июня 2018

Как мы это реализовали -

  1. При первом входе пользователя в систему мы отправляем ему токен и токен обновления.
  2. Затем клиентская сторона использует маркер в заголовке для дальнейших вызовов API.
  3. На стороне клиента мы поддерживаем обратный отсчет в течение 15 минут (что меньше времени истечения основного токена), после чего со стороны клиента мы отправляем запрос на сервер с токеном и токеном обновления,
  4. После получения действительного токена обновления вместе с основным токеном сервер отправляет обратно новый токен с увеличенным временем действия.

Надеюсь, это поможет.

...