How do I wire up spring oauth using spring eureka?

2019-07-23 17:16发布

问题:

I have created a Single Page Application using the Spring Tutorial for making one with AngularJS and OAuth and such found here: https://spring.io/guides/tutorials/spring-security-and-angular-js/#_multiple_ui_applications_and_a_gateway_single_page_application_with_spring_and_angular_js_part_vi

This is the application.yml files for the SPA application:

security:
  user:
    password: none
  oauth2:
    client:
      accessTokenUri: localhost:7777/uaa/oauth/token
      userAuthorizationUri: localhost:7777/uaa/oauth/authorize
      clientId: acme
      clientSecret: acmesecret
    resource:
      user-info-uri: localhost:7777/uaa/user


zuul:
  routes:
    resource:
      path: /resource/**
      url: localhost:9000/resource
    user:
      path: /user/**
      url: localhost:7777/uaa/user

eureka:
  client:
    serviceUrl:
      defaultZone: ${vcap.services.eureka-service.credentials.uri:127.0.0.1:8761}/eureka/

---
spring:
  profiles: cloud
eureka:
  instance:
    hostname: ${APPLICATION_DOMAIN}
    nonSecurePort: 80

I want to know how I would change the zuul routes and the user-info-uri so that I don't have to specify the urls and all this can be done by using the service-id. I looked at the tutorial for using eureka here:

https://spring.io/blog/2015/01/20/microservice-registration-and-discovery-with-spring-cloud-and-netflix-s-eureka

but I don't quite understand how I can achieve my goal without adding all the java to my code, because the basic eureka server already seems to register all my services.

回答1:

If I do understand your question correct you can just use the config file in this pattern:

zuul:
  routes:
    <service_id>:
      path: /path/**

For example (if your oauth-service is registered as auth):

zuul:
  routes:
    auth:
      path: /user/**

Zuul will leverage Eureka and find the endpoints for the services. In addition to that it will provide client-side load-balancing.



回答2:

Had issue with using eureka service id, userInfoUri used to throw UnknownHost Exception all the time, @LoadBallanced restTemplate did not solve my issue, solution was to set prefer-token-info to false ( if true - no load ballancing for oauth )

security.oauth2.resource.service-id={Service ID as at eureka server registered}
security.oauth2.resource.userInfoUri= http://${security.oauth2.resource.service-id}/user/me
security.oauth2.resource.loadBalanced=true
security.oauth2.resource.prefer-token-info=false

no port number needed if service ID used , but needed if ip or host used