Clients Web et mobiles pour Spring Security OAuth2

Maksim:

J'essaie de faire le tour de OAuth2 et de Spring Security OAuth, en particulier le service OAuth Provider. J'essaie d'implémenter les éléments suivants:

  1. Fournisseur OAuth
  2. Serveur de ressources (services Web RESTful qui doivent être protégés à l'aide du fournisseur OAuth (1))
  3. Client Web (une application client Web sécurisée à l'aide de Spring Security mais qui doit utiliser le fournisseur OAuth (1) pour authentifier l'utilisateur
  4. Clients mobiles natifs (Android et iOS) qui devraient également utiliser le fournisseur OAuth (1) pour l'authentification

Tous ces modules sont indépendants les uns des autres, c'est-à-dire séparés dans différents projets et seront hébergés sur différents domaines, tels que (1) http://oauth.web.com , (2) http://rest.web.com , (3) http://web.com

Mes deux questions sont:

A. Comment puis-je implémenter un projet de client Web afin que lorsque l'utilisateur se connecte sur la page protégée ou clique sur le bouton Connexion, être redirigé vers l'URL du fournisseur OAuth, se connecter et être authentifié sur le client Web avec tous les rôles d'utilisateur et également besoin également de savoir quel client a été utilisé. @EnableResourceServer(de la même manière que Resource Server est implémenté; voir le code ci-dessous) dans ce projet pour obtenir les détails de l'utilisateur? Dois-je gérer le jeton d'accès et l'inclure toujours dans l'appel au serveur de ressources ou cela peut se faire automatiquement d'une manière ou d'une autre?

B. Quelle est la meilleure façon de mettre en œuvre la sécurité sur les applications mobiles que je développerai. Dois-je utiliser le mot de passe grand pour cette authentification, car les applications seront créées par moi-même où j'aurai un nom d'utilisateur et un mot de passe sur l'écran natif, puis envoyées au serveur en tant qu'authentification de base sur SSL? Y a-t-il des exemples que je peux jeter un oeil à cette conversation avec Spring Security OAuth et retourner les détails de l'utilisateur.

Voici ma mise en œuvre du projet OAuth (1) et du projet de ressources (2):

1. Fournisseur OAuth

Configurations du serveur OAuth2 (la plupart du code provient de ICI )

@Configuration
@EnableAuthorizationServer
public class OAuth2ServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;

    @Autowired
    DataSource dataSource;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                .tokenStore(tokenStore())
                .approvalStore(approvalStore())
                .authorizationCodeServices(authorizationCodeServices())
        ;
    }

    @Bean
    public JdbcClientDetailsService clientDetailsService() {
        return new JdbcClientDetailsService(dataSource);
    }

    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource);
    }

    @Bean
    public ApprovalStore approvalStore() {
        return new JdbcApprovalStore(dataSource);
    }

    @Bean
    public AuthorizationCodeServices authorizationCodeServices() {
        return new JdbcAuthorizationCodeServices(dataSource);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(clientDetailsService());
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {

        oauthServer.checkTokenAccess("permitAll()");
    }
}

Configuration de la sécurité Web

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable(); // TODO. Enable this!!!

        http.authorizeRequests()
                .and()
                .formLogin()
//                .loginPage("/login") // manually defining page to login
//                .failureUrl("/login?error") // manually defining page for login error
                .usernameParameter("email")
                .permitAll()

                .and()
                .logout()
//                .logoutUrl("/logout")
                .logoutSuccessUrl("/")
                .permitAll();
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(customUserDetailsService)
                .passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

UserDetailsService (customUserDetailsService)

@Service
public class CustomUserDetailsService implements UserDetailsService{

    private final UserService userService;

    @Autowired
    public CustomUserDetailsService(UserService userService) {
        this.userService = userService;
    }

    public Authority loadUserByUsername(String email) throws UsernameNotFoundException {
        User user = userService.getByEmail(email)
                .orElseThrow(() -> new UsernameNotFoundException(String.format("User with email=%s was not found", email)));
        return new Authority(user);
    }
}

2. Serveur de ressources (WS RESTful)

Configuration ( la plupart du code squelette a été extrais CET exemple)

@Configuration
@EnableResourceServer
public class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter{

    @Autowired
    DataSource dataSource;

    String RESOURCE_ID = "data_resource";

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        TokenStore tokenStore = new JdbcTokenStore(dataSource);
        resources
                .resourceId(RESOURCE_ID)
                .tokenStore(tokenStore);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                // For some reason we cant just "permitAll" OPTIONS requests which are needed for CORS support. Spring Security
                // will respond with an HTTP 401 nonetheless.
                // So we just put all other requests types under OAuth control and exclude OPTIONS.
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/**").access("#oauth2.hasScope('read')")
                .antMatchers(HttpMethod.POST, "/**").access("#oauth2.hasScope('write')")
                .antMatchers(HttpMethod.PATCH, "/**").access("#oauth2.hasScope('write')")
                .antMatchers(HttpMethod.PUT, "/**").access("#oauth2.hasScope('write')")
                .antMatchers(HttpMethod.DELETE, "/**").access("#oauth2.hasScope('write')")
                .and()

                // Add headers required for CORS requests.
                .headers().addHeaderWriter((request, response) -> {
            response.addHeader("Access-Control-Allow-Origin", "*");

            if (request.getMethod().equals("OPTIONS")) {
                response.setHeader("Access-Control-Allow-Methods", request.getHeader("Access-Control-Request-Method"));
                response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
            }
        });    
    }
}

Contrôleur WS:

@RestController
@RequestMapping(value = "/todos")
public class TodoController {

    @Autowired
    private TodoRepository todoRepository;

    @RequestMapping(method = RequestMethod.GET)
    public List<Todo> todos() {
        return todoRepository.findAll();
    }

   // other methods
}
MangEngkus:

Comment puis-je implémenter un projet de client Web afin que lorsque l'utilisateur se connecte sur la page protégée ou clique sur le bouton de connexion, être redirigé vers l'URL du fournisseur OAuth, se connecter et être authentifié sur le client Web avec tous les rôles d'utilisateur et également besoin de savoir quel client a été utilisé

Vous souhaitez utiliser OAuth comme SSO.

Option 1, utilisez le nuage de printemps https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v

Option 2, gérer manuellement le processus SSO:

dans votre client Web, configurez la page de connexion au serveur OAuth à l'aide de l'autorisation d'autorisation.

protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable(); // TODO. Enable this!!!
    http.authorizeRequests()
    .and()
    .formLogin()
    .loginPage("http://oauth.web.com/oauth/authorize?response_type=code&client_id=webclient&redirect_uri=http://web.com") // manually defining page to login
    //.failureUrl("/login?error") // manually defining page for login error
    .usernameParameter("email")
    .permitAll()   
    .and()
    .logout()
    //.logoutUrl("/logout")
    .logoutSuccessUrl("/")
    .permitAll();
}

une fois le processus d'authentification et d'autorisation terminé, vous serez redirigé vers le client Web avec le code d'autorisation http://web.com/?code=jYWioI. votre client Web doit échanger ce code avec un accès par jeton sur votre serveur oauth. Sur votre serveur Oauth, créez un point de terminaison pour récupérer les informations utilisateur

@RestController
public class UserRestService {

  @RequestMapping("/user")
  public Principal user(Principal user) {
    // you can also return User object with it's roles
    // {"details":...,"principal":{"username":"user",...},"name":"user"}
    return user;
  }

}

Ensuite, votre client Web peut accéder aux informations sur les détails de l'utilisateur en envoyant une demande avec l'accès par jeton au point de terminaison de repos ci-dessus et authentifier l'utilisateur en fonction de la réponse.

Dois-je gérer le jeton d'accès et l'inclure toujours dans l'appel au serveur de ressources ou cela peut se faire automatiquement d'une manière ou d'une autre?

Chaque demande doit inclure un accès par jeton. Si vous voulez le faire automatiquement, Spring a fourni le client Oauth 2 http://projects.spring.io/spring-security-oauth/docs/oauth2.html

Quelle est la meilleure façon de mettre en œuvre la sécurité sur les applications mobiles que je développerai. Dois-je utiliser le mot de passe grand pour cette authentification, car les applications seront créées par moi-même où j'aurai un nom d'utilisateur et un mot de passe sur l'écran natif, puis envoyées au serveur en tant qu'authentification de base sur SSL?

Étant donné que vous utilisez l'écran natif, l'octroi de mot de passe est suffisant, mais vous pouvez stocker le jeton d'actualisation, cela vous permettra de demander l'accès au jeton sans répéter le processus d'authentification.

Y a-t-il des exemples que je peux jeter un oeil à cette conversation avec Spring Security OAuth et retourner les détails de l'utilisateur.

voir l'exemple de code ci-dessus ou jetez un œil à ce https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

API Spring REST pour les clients Web et mobiles

Spring Security Oauth2 pour le site Web Spring

Microservices et Spring Security OAuth2

Authentification Spring Security Oauth2 pour Javascript WebApp

Authentification gRPC et OAuth2 avec Spring Security

Spring Security OAuth2 prend-il en charge le flux de code d'autorisation avec PKCE pour les clients de navigateur (angulaire)?

Meilleure façon d'utiliser Spring pour les applications Web et mobiles

Comment configurer Spring Boot et Spring Security pour prendre en charge la connexion par formulaire et la connexion Google OAuth2

Comment utiliser Spring Security 5 et OAuth2 Client pour obtenir des jetons d'actualisation et passer des appels API?

Comment activer OAuth2 pour certaines classes uniquement dans mon application Spring Boot Security OAuth2 ?

Comment rafraîchir OAuth2 jeton avec Spring Security 5 client OAuth2 et RestTemplate

Spring security oauth2 'dependencies.dependency.version' est manquant pour Spring Boot 2.0.3

Échec de l'autorisation OpenID (OAuth2) avec Spring Boot et Spring Security

Solution pour envoyer des données du serveur aux clients (web, appareils mobiles) dans AWS ?

Spring Security - UserDetailsService pour la mise en œuvre d'oAuth2 ?

Autorisation incrémentielle pour la connexion à Google OAuth2 avec Spring Security

Spring Security OAuth2 danse et obtient les paramètres

Spring Security OAuth2 et FormLogin dans une seule application

Contrôle des redirections d'authentification avec JHipster, Spring Security et oauth2

Authentification Spring Security OAuth2 et Ldap au même recours

Spring Security Oauth2 et configuration de la connexion par formulaire

Connexion Spring security oauth2 et serveur de ressources dans la même application

Implémentation d'Oauth2 avec Spring Security dans une application Web

Spring security oauth2: obtenir le nom d'utilisateur dans le service Web REST

Spring Security OAuth2: InsufficientAuthenticationException

Spring Security OAuth2 | InsufficientAuthenticationException

Spring Security OAuth2 UserRedirectRequiredException

Spring Security: jeton JWT pour API et session pour le Web

Configuration XML Spring OAuth2 pour le client et le serveur de ressources

TOP liste

  1. 1

    Filtrer le dataframe basé sur plusieurs colonnes d'un autre dataframe

  2. 2

    Laravel SQLSTATE [HY000] [1049] Base de données inconnue 'previous_db_name'

  3. 3

    Enregistrer le chemin de l'image de la galerie vers la base de données de la salle et l'afficher dans la liste des recycleurs

  4. 4

    Comment afficher du texte au milieu de div avec une couleur d'arrière-plan différente?

  5. 5

    Microsoft.WebApplication.targets

  6. 6

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  7. 7

    Échec de l'exécution de 'insertBefore' sur 'Node': le paramètre 1 n'est pas de type 'Node'

  8. 8

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  9. 9

    Comment analyser un fichier avec un tableau d'objets JSON en utilisant Node.js?

  10. 10

    comment afficher un bouton au-dessus d'un autre élément ?

  11. 11

    Comment centrer un div tout en utilisant la transition et transformer avec l'échelle

  12. 12

    Filtrer les données en fonction des conditions d'une trame de données

  13. 13

    ESP8266 HADRWARE MINUTERIE, USA pour cocher une macro étrange

  14. 14

    Comment définir du texte dans un QLabel et afficher les caractères '<>'?

  15. 15

    System.Data.SqlClient.SqlException: 'Nom de colonne non valide' ApplicationRoleId '.'

  16. 16

    Pourquoi Phantomjs ne fonctionne pas avec ce site ?

  17. 17

    Stop jQuery execution after one time execution

  18. 18

    Concaténer des variables dans ansible

  19. 19

    Comment calculer la probabilité du graphique de densité?

  20. 20

    php ajouter et fusionner des données de deux tables

  21. 21

    Redirection HTTP vers HTTPS dans Java à l'aide de HTTPURLConnection

chaudétiquette

Archive