Es ist ein schmerzhaftes Wort, OAuth 1.0 ... Ich bin mir nicht sicher, weil ich Spring nicht so oft verwendet habe, aber es scheint, dass RestTemplate verwendet werden sollte, wenn die API aufgerufen wird. Aber mit OAuth 1.0 habe ich mich nicht wirklich darauf eingelassen und schließlich HttpClient verwendet. Gibt es eine bewährte Methode, um die OAuth 1.0-API im Frühjahr zu erreichen? .. .. Bitte unterrichten Sie, wenn es einen besseren Weg gibt.
(Hinzugefügt am 06.08.2018) OAuth 1.0 scheint gut mit dem Schwesterprojekt von Spring Security namens spring-security-oauth zusammenzuarbeiten. https://projects.spring.io/spring-security-oauth/docs/oauth1.html Es gibt viele Leute, die versucht haben, OAuth2 auf der Straße zu implementieren, aber 1.0 ist wirklich selten.
Klicken Sie auf die OAuth 1.0-API von Zaim, um die Daten abzurufen.
Gradle Die Abhängigkeit sieht so aus. Folgendes ist erforderlich, und die anderen sind so, wie Sie möchten.
build.gradle
dependencies {
// spring-boot
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-devtools')
compileOnly('org.projectlombok:lombok')
testCompile('org.springframework.boot:spring-boot-starter-test')
// OAuth1.0a
compile('oauth.signpost:signpost-core:1.2.1.2')
compile('oauth.signpost:signpost-commonshttp4:1.2.1.2')
}
Fügen Sie unten eine neue Anwendung hinzu. https://dev.zaim.net
Wenn Sie es hinzufügen, erhalten Sie die folgenden Informationen. Notieren Sie sich diese.
Achten Sie darauf, dass Sie Ihren Verbraucherausweis und Ihr Verbrauchergeheimnis nicht preisgeben.
Erfahren Sie hier mehr über OAuth 1.0. http://yuroyoro.hatenablog.com/entry/20100506/1273137673
Erstellen Sie eine Instanz mit den Informationen, die Sie beim Hinzufügen einer neuen Anwendung in Zaim gespeichert haben.
python
private static final String CONSUMER_KEY = "Zaim Registrierungsinformationen";
private static final String CONSUMER_SECRET = "Zaim Registrierungsinformationen";
private static final String REQUEST_TOKEN_URL = "Zaim Registrierungsinformationen";
private static final String AUTHORIZE_URL = "Zaim Registrierungsinformationen";
private static final String ACCESS_TOKEN_URL = "Zaim Registrierungsinformationen";
private OAuthConsumer consumer;
private OAuthProvider provider;
consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
provider = new CommonsHttpOAuthProvider(REQUEST_TOKEN_URL, ACCESS_TOKEN_URL, AUTHORIZE_URL);
Dies ist ausreichend für die Verwendung, aber natürlich sollten Sie in die Eigenschaftendatei usw. gehen, um die Informationen hier zu erhalten. Erstellen Sie eine Bean für die Eigenschaft.
application.properties
zaim.consumerKey=your_consumerKey
zaim.consumerSecret=your_consumerSecret
zaim.requestTokenUrl=https://api.zaim.net/v2/auth/request
zaim.authorizeUrl=https://auth.zaim.net/users/auth
zaim.accessTokenUrl=https://api.zaim.net/v2/auth/access
OAuthProperty
/**
*Rufen Sie die für die OAuth-Authentifizierung erforderlichen Informationen aus der Eigenschaftendatei ab und bewahren Sie sie auf
*/
public class OAuthProperty {
@Getter
@Value("${zaim.consumerKey}")
private String consumerKey;
@Getter
@Value("${zaim.consumerSecret}")
private String consumerSecret;
@Getter
@Value("${zaim.requestTokenUrl}")
private String requestTokenUrl;
@Getter
@Value("${zaim.authorizeUrl}")
private String authorizeUrl;
@Getter
@Value("${zaim.accessTokenUrl}")
private String accessTokenUrl;
}
BeanConfig.java
@Configuration
public class BeanConfig {
@Bean
OAuthProperty oAuthProperty() {
return new OAuthProperty();
}
//Da das accessToken für jeden Benutzer unterschiedlich ist, muss es mindestens für jede Sitzung vorhanden sein
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
OAuthConsumer oAuthConsumer(OAuthProperty oAuthProperty) {
return new CommonsHttpOAuthConsumer(oAuthProperty.getConsumerKey(),
oAuthProperty.getConsumerSecret());
}
//Da das accessToken für jeden Benutzer unterschiedlich ist, muss es mindestens für jede Sitzung vorhanden sein
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
OAuthProvider oAuthProvider(OAuthProperty oAuthProperty) {
return new CommonsHttpOAuthProvider(oAuthProperty.getRequestTokenUrl(),
oAuthProperty.getAccessTokenUrl(), oAuthProperty.getAuthorizeUrl());
}
}
Verwenden Sie die erstellte Instanz, um die URL der Authentifizierungsseite zu generieren. Legen Sie nach der Authentifizierung auf der Zaim-Seite die zurückgegebene URL als Rückruf-URL fest. (Verwenden wir als Beispiel die URL des Controllers, der später erstellt werden soll.)
python
provider.retrieveRequestToken(consumer, "Rückruf-URL");
Beispiel
provider.retrieveRequestToken(consumer, "http://localhost:8080/authenticated");
Übergabe an die oben erstellte URL. Dieses Mal erstellen wir einen geeigneten Controller und leiten ihn weiter, wenn auf ihn zugegriffen wird. Wenn Sie jetzt http: // localhost: 8080 / besuchen, werden Sie zur Authentifizierungsseite von Zaim weitergeleitet.
indexController
@Controller
public class IndexController {
@Autowired
OAuthConsumer consumer;
@Autowired
OAuthProvider provider;
@RequestMapping("/")
public String index() throws Exception {
//URL-Generierung zur Authentifizierung
String URL = provider.retrieveRequestToken(consumer, "http://localhost:8080/authenticated");
return "redirect:" + URL;
}
}
Nach Eingabe des Anmeldekennworts in Zaim und Abschluss der Authentifizierung wird die unter "URL der Zaim-Authentifizierungsseite generieren" festgelegte Rückruf-URL zurückgegeben. Zu diesem Zeitpunkt werden die folgenden zwei Parameter zusammen zurückgegeben, also holen Sie sie sich.
Verwenden Sie diesen oauth_verifier, um ein Zugriffstoken zu generieren.
python
/**
*Zugriff mit Rückruf nach Authentifizierung mit zaim
* @Rückkehr von param oauthToken zaim
* @Zurückgegeben von param oauthVerifier zaim
* @return
* @throws Exception
*/
@RequestMapping("/authenticated")
public String authenticated(@RequestParam(value = "oauth_token") String oauthToken,
@RequestParam(value = "oauth_verifier") String oauthVerifier, Model model)
throws Exception {
//Generieren Sie accessToken und accessTokenSecret
provider.retrieveAccessToken(consumer, oauthVerifier);
return "index";
}
Das auf diese Weise erzeugte Zugriffstoken kann erhalten werden. Wenn Sie diese beiden speichern, können Sie auf sie zugreifen, ohne sich erneut bei zaim authentifizieren zu müssen.
python
//Generieren Sie accessToken und accessTokenSecret
provider.retrieveAccessToken(consumer, oauthVerifier);
//Holen Sie sich ein Token (speichern Sie dieses, damit Sie sich nicht erneut authentifizieren müssen
String accessToken = consumer.getToken();
String accessTokenSecret = consumer.getTokenSecret();
Wenn Sie das Token so verwenden, müssen Sie es nicht erneut authentifizieren.
Verwenden Sie es so
consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
provider = new CommonsHttpOAuthProvider(REQUEST_TOKEN_URL, ACCESS_TOKEN_URL, AUTHORIZE_URL);
//Setzen Sie das gespeicherte Token
consumer.setTokenWithSecret(accessToken, accessTokenSecret);
Jetzt, wo ich das Zugriffstoken habe, kann ich Zaim endlich mit der API treffen. Bereiten Sie zuerst HttpClient vor.
Auf der offiziellen HttpClient-Seite gab es einen netten Fehlerbehandler, daher werde ich ihn so verwenden, wie er ist. Wenn der Antwortcode beim Aufrufen der API nicht 200-Serie ist, wird eine Ausnahme ausgelöst.
APIResponseHandler
/**
*Überprüfung des Antwortcodes beim Aufrufen der API
*Wenn es kein Problem gibt, geben Sie den Körper zurück
*Ausnahme, wenn nicht normal
* https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientWithResponseHandler.java
*/
public class APIResponseHandler implements ResponseHandler<String> {
@Override
public String handleResponse(
final HttpResponse response) throws ClientProtocolException, IOException {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
}
}
Nachdem wir fertig sind, klicken wir auf die API. Dieses Mal werde ich nach der Authentifizierung versuchen, Benutzerinformationen so wie sie sind zu erfassen.
python
/**
*Zugriff mit Rückruf nach Authentifizierung mit zaim, dann Benutzerinformationen abrufen
* @Rückkehr von param oauthToken zaim
* @Zurückgegeben von param oauthVerifier zaim
* @return
* @throws Exception
*/
@RequestMapping("/authenticated")
public String authenticated(@RequestParam(value = "oauth_token") String oauthToken,
@RequestParam(value = "oauth_verifier") String oauthVerifier, Model model)
throws Exception {
//Generieren Sie accessToken und accessTokenSecret
provider.retrieveAccessToken(consumer, oauthVerifier);
//HttpClient-Vorbereitung
CloseableHttpClient httpclient = HttpClients.createDefault();
ResponseHandler<String> responseHandler = new APIResponseHandler();
//Unterschreiben Sie die Anfrage
HttpGet httpget = new HttpGet("https://api.zaim.net/v2/home/user/verify");
consumer.sign(httpget);
//Erhalten
String responseBody = httpclient.execute(httpget, responseHandler);
model.addAttribute("zaimUserVerify", responseBody);
return "index";
}
Ich denke, dass der JSON der Anmeldeinformationen zurückgegeben wurde.
Wenn Sie die API ohne erneute Authentifizierung nach der Authentifizierung aufrufen möchten, können Sie sie unverändert aufrufen, indem Sie das gespeicherte accessToken und accessTokenSecret im Consumer festlegen.
Bei Verwendung von accessToken und accessTokenSecret
//Setzen Sie das gespeicherte Token
consumer.setTokenWithSecret(accessToken, accessTokenSecret);
//HttpClient-Vorbereitung
CloseableHttpClient httpclient = HttpClients.createDefault();
ResponseHandler<String> responseHandler = new APIResponseHandler();
//Unterschreiben Sie die Anfrage
HttpGet httpget = new HttpGet("https://api.zaim.net/v2/home/user/verify");
consumer.sign(httpget);
//Erhalten
String responseBody = httpclient.execute(httpget, responseHandler);
model.addAttribute("zaimUserVerify", responseBody);
Ich konnte Zaims API (OAuth 1.0) mit Java so erreichen.
Wenn Sie Spring's Rest Template verwenden, wird der zurückgegebene JSON einem Objekt zugeordnet und zurückgegeben, was wahnsinnig praktisch erscheint, aber ich kann ihn trotzdem nicht verwenden. .. Ist es nicht möglich, OAuth 1.0 etwas besser zu verwenden? ..
Vorerst werde ich das, was ich implementiert habe, auf meine eigene Weise umsetzen. Ich bin froh, wenn Sie es als Referenz verwenden können. https://github.com/kxn4t/saifu
Recommended Posts