Beispielcode zur Authentifizierung bei OAuth 2.0 und zum Abrufen eines Zugriffstokens. Die Einstellungen auf der Seite des Authentifizierungsservers werden diesmal nicht beschrieben.
(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.
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>
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