9

Tôi muốn phát triển hai dịch vụ độc lập, một cho các công cụ kinh doanh và một cho xác thực người dùng sử dụng Spring OAuth 2Xuân OAuth: Server với Authorization server backend

Hãy gọi cho họ kinh doanh-dịch vụ và OAuth-Service Resource.

Bây giờ tôi muốn đại biểu dịch vụ kinh doanh cho OAuth-Service nếu yêu cầu không được xác thực. Ứng dụng khách (một ứng dụng Android) không nên biết về dịch vụ ưu tiên của OAuth, nó chỉ được ủy quyền cho nó bởi Business-Service với chuyển hướng HTTP 302 cho yêu cầu không được xác thực. Để chính xác, tôi muốn trang đích API của mình cung cấp liên kết đến http://businessservice.com/login và khi ứng dụng khách của tôi quyết định theo liên kết này, nó sẽ được chuyển hướng đến OAuth-Service.

Nếu tôi chú thích Dịch vụ doanh nghiệp với @EnableOAuth2Resource, tất cả tài nguyên của nó được bảo vệ trở lại 401 khi tôi cuộn chúng mà không có mã thông báo truy cập. Càng xa càng tốt. Nếu tôi cung cấp mã thông báo truy cập như sau:

curl -v http://localhost:8667/resource/ -H "Authorization: Bearer $TOKEN" 

Tôi có thể truy cập tài nguyên. Vẫn tốt.

Tuy nhiên, nếu tôi chú thích Dịch vụ doanh nghiệp với @EnableOAuth2Sso để bật chuyển hướng đến dịch vụ OAuth, nó sẽ mất khả năng truy cập tài nguyên bằng mã thông báo truy cập (giống như trên), nó chỉ trả lại 302 cho thông tin đăng nhập trang http://localhost:8667/login

Nếu tôi sử dụng cả các chú thích, các @ EnableOAuth2Resource luôn luôn có vẻ để "giành chiến thắng", như các công trình xác thực nhưng gọi http://localhost:8667/login trả về một 404.

vì vậy, đúng cách để tạo ra một máy chủ tài nguyên mà các đại biểu là những gì tới máy chủ auth cho các cuộc gọi không được xác thực?

Trả lời

4

Sau khi thử khoảng vài giờ, tôi đã tìm được giải pháp.

The Business Server (Resource Server) bây giờ trông như sau:

@SpringBootApplication 
@EnableOAuth2Sso 
@EnableOAuth2Resource 
public class BusinessService { 

    public static void main(final String[] args) { 
     final ConfigurableApplicationContext context = SpringApplication.run(BusinessService.class, args); 
    } 

} 

với hai cấu hình, một cho SSO:

@Configuration 
public class OAuth2SsoConfiguration extends OAuth2SsoConfigurerAdapter { 

    @Override 
    public void match(final RequestMatchers matchers) { 
     matchers.antMatchers("/"); 
    } 

    @Override 
    public void configure(final HttpSecurity http) throws Exception { 
     http.authorizeRequests().anyRequest().permitAll(); 
    } 

} 

và một cho các tài nguyên:

@Configuration 
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(final HttpSecurity http) throws Exception { 
     http.requestMatchers().antMatchers("/resource/**").and().authorizeRequests().anyRequest().authenticated().antMatchers("/").permitAll(); 

    } 

} 



này kết quả trong những điều sau đây:

curl -v http://localhost:8667/ 

lợi nhuận

HTTP/1.1 200 OK 
{"links":[{"rel":"login","href":"http://localhost:8667/login"}]} 



curl -v http://localhost:8667/resource/ 

lợi nhuận

HTTP/1.1 401 Unauthorized 
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"} 



curl -v http://localhost:8667/login 

lợi nhuận

HTTP/1.1 302 Found 
Location: http://localhost:8666/user/oauth/authorize?client_id=clientId&redirect_uri=http%3A%2F%2Flocalhost%3A8667%2Flogin&response_type=code&state=YmmNO9 

Vì vậy servie doanh nghiệp của tôi được bảo đảm bằng như một máy chủ tài nguyên trả lại một 401 cho tất cả các nguồn lực kinh doanh. Gốc của dịch vụ được áp dụng cho tất cả khách hàng để họ có thể khám phá mối quan hệ đăng nhập và nếu họ theo dõi mối quan hệ này, họ được chuyển hướng đến máy chủ Ủy quyền

+1

bạn có thể chia sẻ cách bạn nhận thông tin người dùng trong máy chủ tài nguyên sau người dùng được xác thực bởi oauth2? – Kane

+0

@Kane, quá muộn, nhưng có thể giúp đỡ người khác. Bạn có thể sử dụng các thông số sau trong điểm cuối: @RequestHeader (giá trị = "Ủy quyền") Ủy quyền chuỗiHeader, Dòng chínhNgười dùng – Sourabh

Các vấn đề liên quan