Создать токен доступа и обновить токен без имени пользователя и пароля - PullRequest
0 голосов
/ 29 января 2019

Я реализую oauth2 с помощью Spring-Security с помощью Springboot2.

Я аутентифицирую пользователя, используя только Spring-Security, и возвращаю пользовательский объект обратно, используя имя пользователя и пароль.(http://localhost:8181/login)

Здесь пользователей может быть несколько с одной и той же почтой. Поэтому снова из объекта пользователя, который я получил, я принимаю ID пользователя и отправляю (http://localhost:8181/oauth/token)

здесь я хочу передать толькоgrant_type и userId снова не username и password для генерации токена доступа и обновления токена с использованием oauth2.

Как мне это получить.

можно ли получить имя пользователя и пароль из предыдущего запроса. И какя могу настроить в oauth2, чтобы выполнить мое требование.

, пожалуйста, помогите.

В приведенном ниже коде я проверяю подлинность одного пользователя, сохраняя лимит 1 позже, я получаю всех пользователей с одинаковым идентификатором почты. парольодинаково для всех.

@Override
    @Transactional
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        User user = new User();

        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();

        String stringuserId = request.getParameter("userId");
        Long userId = 0L;
        try {
            if (stringuserId != null) {
                userId = Long.parseLong(stringuserId);
                System.out.println(userId);
                System.out.println(request.getParameter("username"));
                user = userRepository.findByUserId(userId).orElseThrow(
                        () -> new UsernameNotFoundException("User Not Found with -> username or email : " + email));

                System.out.println(user.toString());

                return UserPrinciple.build(user);
            } else {
                Set<GrantedAuthority> authorities = new HashSet<>();
                CustomUser userDetails = new CustomUser(email, "", authorities);


                String checkUser = "SELECT \"USER_ID\",\"EMAIL_ID\",\"PASSWORD\" FROM \"TU_IOT_PLATFORM_PROD\".\"USER_MASTER\" WHERE \"EMAIL_ID\"='john@test.com' LIMIT 1;";

                List<Map<String, Object>> toValues = new ArrayList<Map<String, Object>>();

                toValues = jdbcTemplate.queryForList(checkUser);

                if(toValues.size()>0) {
                    for (Map<String, Object> map : toValues) {
                        userDetails.setUserId((int) map.get("USER_ID"));
                        userDetails.setEmail((String)map.get("EMAIL_ID"));
                        userDetails.setPassword((String)map.get("PASSWORD"));
                    }
                }else {
                    throw new UsernameNotFoundException("User Not Found with -> username or email : " + email);
                }

                System.out.println(userDetails.toString());
                return userDetails;
            }
        } catch (NumberFormatException e) {
            userId = 0L;
            user = userRepository.findByEmail(email).orElseThrow(
                    () -> new UsernameNotFoundException("User Not Found with -> username or email : " + email));
        }
        return UserPrinciple.build(user);

    }
}

1 Ответ

0 голосов
/ 31 марта 2019
            var tokenExpiration = Startup.TokenExpiration;  //超期时长
        var data = new Dictionary<string, string>
            {
                {"as:client_id", clientId },
                {"userID",user.Id},
                {"commID","0" }
            };

        var IssueTime = DateTime.UtcNow;
        var properties = new AuthenticationProperties(data)
        {
            IssuedUtc = IssueTime,
            ExpiresUtc = IssueTime.Add(tokenExpiration),
        };
        var oAuthIdentity = _userManager.CreateIdentity(user, "JWT");
        var ticket = new AuthenticationTicket(oAuthIdentity, properties);
        var accessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket);
        //var accessToken = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);

        //var rToken=  Startup.OAuthOptions.RefreshTokenFormat.Protect(ticket);
        var context = new AuthenticationTokenCreateContext(Request.GetOwinContext(), Startup.OAuthOptions.AccessTokenFormat, ticket);
        //await Startup.OAuthOptions.AccessTokenProvider.CreateAsync(context);
        //accessToken = context.Token;

        var refreshTkLifeTime = ;
        context.OwinContext.Set("as:clientAllowedOrigin", "*");
        context.OwinContext.Set("as:clientRefreshTokenLifeTime", refreshTkLifeTime.ToString());
        await Startup.OAuthOptions.RefreshTokenProvider.CreateAsync(context);
        var refreshToken = context.Token;

        return new JObject(
            new JProperty("access_token", accessToken),
            new JProperty("refresh_token", refreshToken),
            new JProperty("token_type", "bearer"),
            new JProperty("expires_in", tokenExpiration.TotalSeconds.ToString()),
            new JProperty(".issued", IssueTime.ToString()),
            new JProperty(".expires", IssueTime.Add(tokenExpiration).ToString())    
        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...