Beispiel für eine OAuth 2.0-Authentifizierung und Zugriffstokenerfassung (Java)

Beispielcode zur Authentifizierung bei OAuth 2.0 und zum Abrufen eines Zugriffstokens. Die Einstellungen auf der Seite des Authentifizierungsservers werden diesmal nicht beschrieben.

Mechanismus (super Übersicht)

(1) Erhalten Sie die Client-ID und den geheimen Schlüssel, die im Voraus auf der Seite des Authentifizierungsservers ausgestellt wurden ② Anforderung an den Authentifizierungsendpunkt (URL-Zugriff) ③ Authentifizieren (Benutzer-ID und Passwort eingeben) ④ Eine Anfrage wird per Umleitung auf die Rückrufseite gesendet ⑤ Wenn die Authentifizierung erfolgreich ist, können Sie den Autorisierungscode aus den Abfrageparametern usw. abrufen. ⑥ Senden Sie den Autorisierungscode, die Client-ID und den geheimen Schlüssel an den Token-Endpunkt (POST usw.). ⑦ Zugriffstoken abrufen (und Token aktualisieren) ⑧ Danach können Sie, sobald Sie die API auslösen, ein ID-Token und SSO frei erhalten.

Umgebung

Ich habe mit OpenAM für den Authentifizierungsserver überprüft (ich werde die Einstellungen hier nicht berühren). Die Client-Seite verwendete den oauth-Client von Google. Außerdem benutze ich Spark-Framework, um es einfach zu versuchen.

pom.xml


        <dependency>
          <groupId>com.sparkjava</groupId>
          <artifactId>spark-core</artifactId>
          <version>2.7.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client</artifactId>
            <version>1.23.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.http-client</groupId>
            <artifactId>google-http-client-jackson2</artifactId>
            <version>1.23.0</version>
        </dependency>

Implementierungsbeispiel

MyOAuthServiceProviderSample.java


import java.util.Arrays;
import spark.Request;
import spark.Response;
import spark.Route;
import static spark.Spark.*;
import com.google.api.client.auth.oauth2.AuthorizationCodeRequestUrl;
import com.google.api.client.auth.oauth2.AuthorizationCodeTokenRequest;
import com.google.api.client.auth.oauth2.TokenResponse;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import java.io.IOException;

/**
 * OAuth2.Authentifizieren Sie sich mit 0 und erhalten Sie Zugriffstoken
 * @author owl
 */
public class MyOAuthServiceProviderSample {
 
    public static void main(String[] args) {

        /**
         *① Authentifizierungsanforderung
         */
        get("/auth", new Route() {
            @Override
            public Object handle(Request req, Response resp) throws Exception {
               
                /**
                 *Geben Sie den Authentifizierungsendpunkt und die Client-ID an
                 *Dieses Mal verwenden wir den mit OpenAM erstellten Authentifizierungsserver
                 */
                AuthorizationCodeRequestUrl codeUrl = new AuthorizationCodeRequestUrl("http://www1.openamexam.co.jp:18080/openam/oauth2/authorize?", "oauth_client_key");

                codeUrl.setScopes(Arrays.asList("openid profile email"));       //Geben Sie die Informationen an, die Sie erhalten möchten
                codeUrl.setResponseTypes(Arrays.asList("code"));                //Holen Sie sich einen Autorisierungscode
                codeUrl.setRedirectUri("http://localhost:4567/callback");       //Geben Sie CallBackUrl an
                codeUrl.setState("this_is_test_state_code");                    //Geben Sie den Statuscode für CSRF-Maßnahmen an
                codeUrl.set("nonce", "this_is_one_time_phrase");                //Geben Sie nonce an, um Gegenmaßnahmen für Wiederholungsangriffe durchzuführen
                codeUrl.set("access_type", "offline");                          //Fordern Sie ein Aktualisierungstoken an
                codeUrl.set("realm", "/api");                                   //Geben Sie den Bereich an
                
                resp.redirect(codeUrl.build());                                 //Zum Authentifizierungsendpunkt springen
                
                return null;
            }
        });

        /**
         *② Erwerb des Zugriffstokens
         * --Nach der Authentifizierung durch den Authentifizierungsendpunkt werden Sie durch eine Umleitung zurückgerufen.
         */
        get("/callback", new Route() {
            @Override
            public Object handle(Request req, Response resp) throws Exception {
                
                /**
                 *Fordern Sie das Zugriffstoken über den Autorisierungscode an
                 *Dieser Bereich hängt auch von den Einstellungen des Authentifizierungsservers ab. Dieses Mal ist es so eingestellt, dass es mit QueryString abgerufen werden kann.
                 */
                String allowCode = req.queryParams("code");                     //Autorisierungscode anfordern
                //Statuscode abrufen
                //Hier sollten Sie überprüfen, ob der Wert mit dem angeforderten übereinstimmt (diesmal weggelassen).
                String stateCode = req.queryParams("state");                    
                
                /**
                 *Stellen Sie eine Anforderung zur Erfassung von Zugriffstoken mit dem Autorisierungscode
                 *Dieser Bereich hängt auch von den Einstellungen des Authentifizierungsservers ab. Diesmal senden Sie den geheimen Schlüssel per POST-Methode
                 */
                AuthorizationCodeTokenRequest tokenUrl = new AuthorizationCodeTokenRequest(
                    new NetHttpTransport(),
                    new JacksonFactory(),
                    new GenericUrl("http://www1.openamexam.co.jp:18080/openam/oauth2/access_token?realm=/api"),
                    allowCode                        
                );

                tokenUrl.setGrantType("authorization_code");
                tokenUrl.setRedirectUri("http://localhost:4567/callback");      //Wenn Sie Ihre eigene URL nicht erneut angeben, tritt ein Fehler auf
                tokenUrl.set("client_id", "oauth_client_key");                  //Client-ID festlegen
                tokenUrl.set("client_secret", "oauth_secret_key");              //Legen Sie die geheime ID fest
                
                TokenResponse tr = null;
                String accessToken = null;
                String refreshToken = null;
                try {
                    tr = tokenUrl.execute();
                    accessToken = tr.getAccessToken();
                    refreshToken = tr.getRefreshToken() == null ? "null" : tr.getRefreshToken();
                    //Es ist auch möglich, SSO zu erstellen, wenn Sie idToken erhalten, es analysieren, den Informationen vertrauen und sich bei Ihrem eigenen Dienst anmelden
                    String idToken = (String)tr.get("id_token");
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    tr = null;
                }                
                
                return "AccessToken = " + accessToken
                        + "<br>RefreshToken = " + refreshToken;
            }
        });        
        
    }
    
}

Recommended Posts

Beispiel für eine OAuth 2.0-Authentifizierung und Zugriffstokenerfassung (Java)
Java: Zeitgesteuerte Token-Verwaltungsklasse für die Web-API-Authentifizierung
Java während und für Anweisungen
AWS SDK für Java 1.11.x und 2.x.
Java für Anfänger, Ausdrücke und Operatoren 1
Java für Anfänger, Ausdrücke und Operatoren 2
Java 9 neue Funktionen und Beispielcode
BloomFilter-Beschreibungs- und Implementierungsbeispiel (JAVA)
Klassen und Instanzen Java für Anfänger
Beziehung zwischen Kotlin- und Java-Zugriffsmodifikatoren
[Für Anfänger] Unterschied zwischen Java und Kotlin
[Java] Proxy zum Protokollieren von SQL und SQL-Ergebnissen
Lesen Sie den Hinweis zur Dateikopie von Java 1.7 oder höher
Studiere 3 Wochen und bestehe Java Bronze
So greifen Sie auf Java Private-Methoden und -Felder zu