[JAVA] Construction d'un serveur d'autorisation utilisant Authlete et communication depuis le client OAuth (application Web)

Un mémo lors de l'utilisation du service cloud Authlete pour créer rapidement un serveur OAuth.

Authlete est un service cloud permettant de créer un serveur OAuth2.0 et un fournisseur OpenID. Pour construire un serveur prenant en charge OAuth 2.0 et OpenID Connect avec Honki, c'est une évidence, mais en déléguant le processus Mendokusai à Authlete, vous pouvez facilement créer un serveur d'autorisation.

Conditions préalables

Pour simplifier l'article, nous supposerons que vous avez une certaine connaissance d'OAuth / OpenID Connect. Connaissez-vous la séquence de traitement du flux d'octroi de code d'autorisation?

environnement

Mac OS X 10.12.6 (macOS Sierra) Apache Maven 3.2.3 Java version: 1.8.0_25 git version 2.11.0 (Apple Git-81)

Je le fais dans, mais si maven et git fonctionnent, je pense que tout ce qui y compris le système d'exploitation est OK

De plus, les personnages tels que divers serveurs sont les suivants:

Nom du serveur Utilisation URL
java-oauth-server Un serveur qui gère les informations d'autorisation pour chaque ID utilisateur. Appelé un serveur d'autorisation http://oauth.example.com:8080/
java-resource-server Un serveur avec des données et des fonctions pour chaque ID utilisateur. Appelé un serveur de ressources http://resource.example.com:8081/
java-oauth-client Application Web qui utilise les ressources du serveur de ressources http://client.example.com:8082/

Dans cet environnement, chaque serveur va être démarré localement, veuillez donc résoudre le nom en 127.0.0.1 avec / etc / hosts selon le cas. Bien sûr, vous pouvez le donner à n'importe quel endroit tel que EC2 d'AWS.

Écoulement brutal

Le flux général est le suivant.

  1. Inscrivez-vous pour Authlete
  2. Enregistrement du serveur d'autorisation / enregistrement du client
  3. Construction d'un serveur d'autorisation et d'un serveur de ressources
  4. Communication depuis les applications Web

Fonctionnement sur l'écran de gestion Authlete

Inscription et enregistrement / création d'informations sur le serveur d'autorisation

Tout d'abord, inscrivez-vous pour utiliser Authlete. Inscrivez-vous depuis l'épaule droite de https://www.authlete.com/.

01.png

Sur l'écran suivant, entrez votre identifiant / mot de passe / adresse comme indiqué ci-dessous.

02.png

Une fois l'inscription terminée, la première page s'affiche.

03.png

Il semble qu'un compte a été créé et qu'un serveur d'autorisation (Service 385xxxxxxxx) a déjà été créé.

La clé API et le secret API sont affichés, mais comme ils seront utilisés plus tard lors de la création d'un serveur d'autorisation et d'un serveur de ressources,

Clé API Secret de l'API
385xxxxxxxx NeE89hxxxxxxxxxxxxxxxxxxx

Prenez-en note.

À propos, la prochaine connexion sera https://so.authlete.com/ Connectez-vous avec votre identifiant / mot de passe Cocokara.

Inscription / création du client

Si vous accédez à l'URL de "Client App Developer Console" dans la capture ci-dessus, vous verrez un écran de connexion pour les développeurs clients, qui est différent de celui ci-dessus. Il s'agit de l'écran de gestion du client OAuth et vous pouvez vous connecter avec la clé API ci-dessus (385xxxxxxxx) et le secret API (NeE89hxxxxxxxxxxxxxxxxxxxx).

04.png

Lorsque vous vous connectez, le nom du client (Client 4455xxxx) s'affiche comme ci-dessus, et l'ID client et le secret client de ce client s'affichent. Notez-les car ils seront utilisés plus tard lors de la création d'un client OAuth ou d'une application Web.

identité du client Secret du client
4455xxxx FZlETE9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Organiser

Eh bien, une fois organisé jusqu'à présent,

A été payé. Lorsque vous créez un compte pour Authlete, un serveur d'autorisation (Service 385xxxxxxxx) est créé et un client (Client 4455xxxxx) qui lui est associé semble être créé automatiquement.

Construction du serveur d'autorisation et du serveur de ressources

Ensuite, créez un serveur d'autorisation qui autorise le client OAuth à accéder aux informations utilisateur et un serveur de ressources qui reçoit les demandes du client OAuth et exécute le traitement conformément aux autorisations.

Dans cette construction, j'utiliserai le code suivant fourni par Authlete.

Pour créer, tout ce que vous avez à faire est de supprimer le code ci-dessus de GitHub et d'écrire la clé d'API et le secret d'API qui ont été émis lors de votre inscription au fichier de configuration.

Construire un serveur d'autorisation

Créez un serveur d'autorisation. Tout ce que vous avez à faire est de cloner le référentiel et de définir la clé API et le secret API dans le fichier de paramètres (authlete.properties).

$ git clone https://github.com/authlete/java-oauth-server.git
$ cd java-oauth-server
$ cat authlete.properties
service.api_key =385xxxxxxxx ← Veuillez changer la clé API correcte
service.api_secret =NeE89hxxxxxxxxxxxxxxxxxxx ← Veuillez changer le bon secret API
$ mvn clean jetty:run

Construire un serveur de ressources

Ensuite, créez un serveur de ressources. Tout ce que vous avez à faire est de cloner le référentiel et de définir la clé API et le secret API dans le fichier de paramètres (authlete.properties). C'est le même travail que le serveur d'autorisation.

$ git clone https://github.com/authlete/java-resource-server.git
$ cd java-resource-server/
$ cat authlete.properties
service.api_key =385xxxxxxxx ← Veuillez changer la clé API correcte
service.api_secret =NeE89hxxxxxxxxxxxxxxxxxxx ← Veuillez changer le bon secret API
$ mvn clean jetty:run

À propos, le serveur de ressources est

curl http://resource.example.com:8081/api/country/JP -H "Authorization: Bearer xxxxxxxxxxx" -G

Si vous demandez l'autorisation avec un jeton d'accès, si le jeton d'accès est correct,

{
  "name": "Japan",
  "alpha2": "JP",
  "alpha3": "JPN",
  "numeric": 392,
  "currency": "JPY"
}

Il est fait pour renvoyer une réponse comme.

Ceci termine la construction du serveur d'autorisation et du serveur de ressources.

Communication depuis les applications Web

Ensuite, communiquez depuis l'application Web. L'application Web a une URL http://client.example.com:8082/RedirectServlet Supposer que Essayez d'utiliser le même servlet http://client.example.com:8082/RedirectServlet comme destination de redirection après avoir obtenu le code d'autorisation.

À propos, la séquence de traitement du flux d'octroi de code d'autorisation est la suivante. Lorsque Authlete est invité par le serveur d'autorisation à émettre un code d'autorisation, émet un jeton d'accès basé sur le code d'autorisation, ou lorsque le serveur de ressources reçoit un jeton d'accès d'une application Web, le jeton d'accès est-il correct? Il vous dira à qui le jeton est associé.

sequence.png

Enregistrement de la destination de redirection

Enregistrez l'URI de destination de la redirection de cette application Web dans Authlete. Ouvrez la console de développement d'application client et cliquez sur le bouton Modifier en bas.

05.png

Après cela, il y a un paramètre appelé URI de redirection dans l'onglet Autorisation, alors écrivez «http://client.example.com:8082/RedirectServlet» et cliquez sur le bouton de mise à jour pour terminer.

06.png

Il a été enregistré.

Créer une application Web

L'application Web est comme indiqué dans le diagramme de séquence ci-dessus

  1. Cliquez sur un lien tel que Connexion avec ○○ sur l'écran Web (la destination du lien sera RidirectServlet).
  2. Affichage de l'écran du serveur d'autorisation (redirigé du servlet avec 302)
  3. L'utilisateur exécute une opération d'authentification / autorisation sur le serveur d'autorisation
  4. Après l'opération d'autorisation, le code d'autorisation est généré et le serveur d'autorisation est redirigé vers l'URI spécifié (redirigé vers le servlet d'origine avec 302 et renvoyé).
  5. À votre retour, accédez au serveur d'autorisation avec le code d'autorisation et obtenez un jeton d'accès
  6. Utilisez le jeton d'accès pour appeler l'API du serveur de ressources (par exemple pour obtenir des informations sur l'acquisition de données)
  7. Obtenez des résultats

De quel type de flux de traitement s'agit-il, mais comme j'ai créé un tel servlet, j'utiliserai ce projet tel quel.

Après la suppression, modifiez les valeurs de client_id et client_secret dans le fichier de paramètres (settings1.properties) en ID client et secret client comme indiqué ci-dessous.

$ git clone https://github.com/masatomix/java-oauth-client.git
$ cd java-oauth-client/
$ git checkout -t origin/feature/forQiita
$ cat src/main/resources/settings1.properties
client_id =4455xxxx ← Veuillez changer l'ID client correct
client_secret =FZlETE9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ← Veuillez changer le bon secret client
$ mvn clean jetty:run

Essayez de communiquer.

Lorsque vous accédez à http://client.example.com:8082/, le lien "Traitement des autorisations avec le serveur OAuth à l'aide de Authlete." S'affiche. Cliquez dessus.

07.png

Ensuite, le serveur d'autorisation demandera "Cette application Web veut accéder à vos informations, mais les autoriser?" Comme indiqué ci-dessous, donc après y avoir réfléchi, l'utilisateur dira "Qui suis-je"? Entrez votre mot de passe et appuyez sur Autoriser pour autoriser l'accès.

08.png

Étant donné que le serveur d'autorisation et le serveur de ressources fournis par Authlete sont codés avec une authentification d'utilisateur factice,

Login ID Password
john john

Veuillez vous authentifier et autoriser avec le compte.

Lorsque l'application Web est autorisée, un code d'autorisation est émis vers l'application Web et elle est redirigée vers le servlet d'origine avec 302. En outre, le servlet demande au serveur d'autorisation d'obtenir le jeton d'accès et obtient le jeton d'accès du serveur d'autorisation. Une fois que vous avez obtenu le jeton d'accès du serveur d'autorisation, le servlet sera dans l'en-tête HTTP

Authorization:Porteur uU3Xml7rdxxxxxxxxx ← Jeton d'accès

Pour demander au serveur de ressources d'acquérir des données. Après avoir demandé à Authlete de vérifier la validité du jeton, le serveur de ressources exécute la logique et renvoie les données au servlet.

C'est OK si une série de ces processus est effectuée et que les données sont finalement renvoyées à l'écran.

09.png

Je vous remercie pour votre travail acharné.

Dans le traitement dans le servlet

J'ai écrit diverses choses telles que, mais si vous êtes intéressé, veuillez vous référer au code.

En passant, veuillez noter qu'il existe diverses considérations liées à la sécurité telles que les mesures CSRF lors de la construction de la production réelle.

Liens connexes

Recommended Posts

Construction d'un serveur d'autorisation utilisant Authlete et communication depuis le client OAuth (application Web)
Une application qui acquiert la valeur du capteur d'accélération par communication UDP entre C # et Android
Construction d'un serveur d'autorisation utilisant Authlete et communication depuis le client OAuth (application Web)
Serveur Web et serveur d'applications Rails
Mise en œuvre de Google Sign-In à l'aide de l'authentification Google OAuth 2.0 (édition serveur)
Communication socket avec un navigateur Web utilisant Java et JavaScript ②
Communication socket avec un navigateur Web utilisant Java et JavaScript ①