[JAVA] Jouez avec le client Jersey OAuth 2

C'est le 17e jour du Java EE Advent Calendar 2016.

Aperçu

Jersey, l'implémentation de référence de JAX-RS, possède une extension qui prend en charge les clients OAuth 2. Cette fois, j'ai fait un échantillon en l'utilisant. Au fait, j'ai créé le serveur d'authentification avec Spring.

Un exemple de code est disponible sur GitHub.

Exemple de description

L'application elle-même est aussi simple que d'afficher "Hello, !". La partie correspondant à ce nom d'utilisateur est affichée en acquérant le nom de l'utilisateur authentifié par le serveur d'authentification. OAuth 2 autorise la récupération des informations utilisateur.

Essayez d'abord d'ouvrir http: // localhost: 8080 / helloworld.

open-helloworld.png

Ensuite, vous serez redirigé vers le serveur d'authentification et invité à vous connecter.

authentication.png

Une fois connecté, il vous sera demandé si vous souhaitez autoriser l'application helloworld à récupérer les informations utilisateur.

oauth-approval.png

Après avoir donné votre autorisation, vous serez renvoyé à l'application helloworld avec un message d'accueil.

helloworld.png

Description du code

Si le jeton d'accès n'est pas stocké dans la session, l'application helloworld déterminera qu'il n'est pas autorisé et utilisera la méthode start de ʻOAuth2CodeGrantFlow` pour obtenir le code d'autorisation pour obtenir le jeton d'accès. Construire un URI de redirection](https://github.com/backpaper0/javaeeac2016/blob/qiita/helloworld/src/main/java/com/example/UaaFilter.java#L74-L80).

OAuth2CodeGrantFlow flow = OAuth2ClientSupport.authorizationCodeGrantFlowBuilder(
        clientIdentifier, authorizationUri, accessTokenUri)
        .redirectUri(redirectUri)
        .client(client)
        .property(Phase.ALL, OAuth2Parameters.STATE, state.getValue())
        .build();
URI location = URI.create(flow.start());

Après autorisation, vous serez redirigé vers l'URI défini dans la méthode redirectUri ci-dessus, mais à ce moment, le code d'autorisation sera joint en tant que paramètre de requête avec le nom code. Après avoir analysé l'URI de la requête pour obtenir le code, [passez-le à la méthode finish de ʻOAuth2CodeGrantFlow` pour obtenir le jeton d'accès](https://github.com/backpaper0/javaeeac2016/blob/qiita/helloworld /src/main/java/com/example/UaaFilter.java#L61-L68).

OAuth2CodeGrantFlow flow = OAuth2ClientSupport.authorizationCodeGrantFlowBuilder(
        clientIdentifier, authorizationUri, accessTokenUri)
        .redirectUri(redirectUri)
        .client(client)
        .property(Phase.ALL, OAuth2Parameters.STATE, state.getValue())
        .build();
String state = queryParameters.getFirst("state");
TokenResult tokenResult = flow.finish(code, state);

Lors de la récupération des informations utilisateur, le jeton d'accès est intégré dans l'en-tête ʻAuthorization, mais c'est la [méthode ʻOAuth2ClientSupport`` feature] qui crée une Feature qui le fait pour vous (https: // github.com/backpaper0/javaeeac2016/blob/qiita/helloworld/src/main/java/com/example/OAuth2ClientFactory.java#L30). Enregistrez cette «fonctionnalité» dans «Client».

public Client client() {
    return ClientBuilder.newBuilder()
            .register(HttpAuthenticationFeature.basic(clientId, clientSecret))
            .register(OAuth2ClientSupport.feature(accessToken.getValue()))
            .build();
}

Résumé

En utilisant ʻoauth2-client de Jersey, j'ai pu créer une application client en utilisant OAuth 2. Cependant, comme vous pouvez le voir à partir de l'exemple de code, j'ai dû le faire à sa manière (bien que mon ʻoauth2-client puisse manquer de compétence). De plus, j'ai essayé de le faire fonctionner pour le moment, donc je pense qu'il y a plus de choses à considérer lors de sa mise en œuvre.

De cette façon, j'aurais aimé pouvoir le faire facilement, mais j'étais satisfait car je pouvais faire un échantillon émouvant.

Ci-dessus ⛄️

Recommended Posts

Jouez avec le client Jersey OAuth 2
Intégration API de Java avec Jersey Client
Java pour jouer avec Function
Client GraphQL commençant par Ruby
J'ai essayé d'implémenter un client OAuth avec Spring Boot / Security (connexion LINE)
[Java EE] Implémenter le client avec WebSocket
Double soumission de mesures avec Play Framework
Authentification Oauth2 avec Spring Cloud Gateway
Tweak Markdown avec Java flexmark-java
Traitement d'image: jouons avec l'image