4

В настоящее время я пытаюсь обойти этап утверждения/отказа авторизации доступа процесс в Spring Security OAuth2, поскольку ранее разрешенный доступ (для определенного client_id и user_id) должен быть сохранен в памяти и разрешить перенаправление OAuth-приложения на клиент-приложение без запроса пользователя каждый раз для его утверждения.Как обойти шаг подтверждения доступа в Spring безопасности OAuth2, если пользователь ранее разрешил доступ?

<version.spring-security>3.2.0.RELEASE</version.spring-security> 
    <version.spring-security-oauth>1.0.5.RELEASE</version.spring-security-oauth> 

Так у меня есть AccessConfirmationController, который имеет отображение для/OAuth/confirm_access конечной точки:

@RequestMapping("/oauth/confirm_access") 
    public ModelAndView getAccessConfirmation(@ModelAttribute final AuthorizationRequest clientAuth) 
    { 
     final ClientDetails client = this.clientDetailsService.loadClientByClientId(clientAuth.getClientId()); 
     final TreeMap<String, Object> model = Maps.newTreeMap(); 
     model.put("auth_request", clientAuth); 
     model.put("client", client); 
     return new ModelAndView("access_confirmation", model); 
    } 

очень классический способ обработки подтверждения доступа.

Теперь я знаю, что мне нужно проверить (где-то в этом методе), был ли ранее аутентифицированный пользователь (Принципал) ранее одобрил доступ, и если да, мы должны просто получить связанный с пользователем токен и, возможно, просто отправить ему токен через redirect_uri.

Существует внутренняя конечная точка в Spring Security, которая позволяет токенам извлечения:

@FrameworkEndpoint 
    @RequestMapping(value = "/oauth/token") 
    public class TokenEndpoint extends AbstractEndpoint { 

     @RequestMapping 
     public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, 
       @RequestParam(value = "grant_type", required = false) String grantType, 
       @RequestParam Map<String, String> parameters) { 
     // the logic here 
     } 
    } 

Как я могу назвать эту рамочную конечную точку внутри моего контроллера? и это даже лучший способ (~ передовая практика?) сделать это?

заранее спасибо,

+0

В соответствии с '@ RequestMapping' документации, если вы не передать' value' атрибут является относительно корневой URL, что означает его можно получить непосредственно на '/ oauth/token' –

+0

@NikhilTalreja Вы не понимаете, что я имею в виду, мне нужно вызвать метод ResponseEntity getAccessToken (...) из моего AccessConfirmationController, и я не знаю как действовать. – kaffein

ответ

2

может просто послать ему маркер через redirect_uri.

Вы не можете сделать это со стандартными типами грантов, но я не уверен, что вам нужно. Все, что вам нужно, это проверить, одобрил ли пользователь разрешение и отправил клиенту то, что он запросил (то есть код авторизации). Затем нормальный грант продолжается, но без шага утверждения.

В версии 2.0 Spring OAuth существует ApprovalStore, которую можно явно использовать для такого поведения, и несколько реализаций, которые должны облегчить его работу из коробки. В более старых версиях (которые вы, кажется, используете, даже если они очень старые сейчас), вам придется добавить некоторые настройки через UserApprovalHandler и, возможно, также AuthorizationRequestManager.

10

Вам просто нужно установить autoAprove = истина в вашей конфигурации

@Configuration 
@EnableAuthorizationServer 
public class OAuth2Config extends AuthorizationServerConfigurerAdapter { 
    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.inMemory() 
       .withClient("my-client") 
         .secret("secret") 
         .authorizedGrantTypes("authorization_code") 
         .autoApprove(true) 
       .scopes("scope"); 
    } 
} 
+0

К сожалению, он не работает для предыдущей версии Spring OAuth (1.0.5-) –