Dies ist der 17. Tag von Java EE Adventskalender 2016.
Jersey, die Referenzimplementierung von JAX-RS, verfügt über eine Erweiterung, die OAuth 2-Clients unterstützt. Diesmal habe ich damit eine Probe gemacht. Übrigens habe ich den Authentifizierungsserver mit Spring erstellt.
Beispielcode ist auf GitHub verfügbar.
Die Anwendung selbst ist so einfach wie die Anzeige von "Hallo,
Versuchen Sie zunächst, http: // localhost: 8080 / helloworld zu öffnen.
Anschließend werden Sie zum Authentifizierungsserver umgeleitet und aufgefordert, sich anzumelden.
Sobald Sie angemeldet sind, werden Sie gefragt, ob Sie der helloworld-Anwendung die Berechtigung zum Abrufen von Benutzerinformationen erteilen möchten.
Nach Erteilung der Erlaubnis kehren Sie mit einer Begrüßung zur helloworld-Anwendung zurück.
Wenn das Zugriffstoken nicht in der Sitzung gespeichert ist, stellt die helloworld-Anwendung fest, dass es nicht autorisiert ist, und verwendet die Startmethode von OAuth2CodeGrantFlow, um den Autorisierungscode zum Abrufen des Zugriffstokens abzurufen. Erstellen einer Umleitungs-URI](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());
Nach der Autorisierung werden Sie zu dem URI weitergeleitet, der in der obigen Methode "redirectUri" festgelegt wurde. Zu diesem Zeitpunkt wird der Autorisierungscode jedoch als Abfrageparameter mit dem Namen "code" angehängt. Nachdem Sie den Anforderungs-URI analysiert haben, um den "Code" abzurufen, übergeben Sie ihn an die "finish" -Methode des "OAuth2CodeGrantFlow", um das Zugriffstoken zu erhalten /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);
Beim Abrufen von Benutzerinformationen wird das Zugriffstoken in den Header "Authorization" eingebettet, aber es ist die [feature
-Methode von OAuth2ClientSupport
](https: //), die das Feature
generiert, das dies für Sie erledigt. github.com/backpaper0/javaeeac2016/blob/qiita/helloworld/src/main/java/com/example/OAuth2ClientFactory.java#L30).
Registrieren Sie dieses Feature in Client.
public Client client() {
return ClientBuilder.newBuilder()
.register(HttpAuthenticationFeature.basic(clientId, clientSecret))
.register(OAuth2ClientSupport.feature(accessToken.getValue()))
.build();
}
Mit Jerseys "oauth2-client" konnte ich mit OAuth 2 eine Client-Anwendung erstellen. Wie Sie dem Beispielcode entnehmen können, musste ich es so machen, wie es war (obwohl mein "oauth2-client" möglicherweise nicht über ausreichende Kenntnisse verfügt). Außerdem habe ich versucht, es vorerst zum Laufen zu bringen, daher denke ich, dass bei der Implementierung weitere Dinge zu beachten sind.
Auf diese Weise wünschte ich, ich könnte es leicht machen, aber ich war zufrieden, weil ich eine bewegliche Probe machen könnte.
Über ⛄️