Treffen Sie Zaims API (OAuth 1.0) in Java

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.

Was du machen willst

Klicken Sie auf die OAuth 1.0-API von Zaim, um die Daten abzurufen.

verwenden

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')
}

Anmeldung bei Zaim

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.

Prozessablauf

Erfahren Sie hier mehr über OAuth 1.0. http://yuroyoro.hatenablog.com/entry/20100506/1273137673

  1. Generieren Sie eine Instanz für die OAuth-Authentifizierung
  2. Generieren Sie die URL der Authentifizierungsseite von Zaim
  3. Zeigen Sie die Authentifizierungsseite von Zaim unter Verwendung der generierten URL an
  4. Generieren Sie nach der Authentifizierung ein Zugriffstoken aus dem Authentifizierungsergebnis
  5. Kommunizieren Sie nach dem Signieren der Anforderung mit dem Zugriffstoken

1. Generieren Sie eine Instanz für die OAuth-Authentifizierung

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());
	}

}

2. Generieren Sie die URL der Authentifizierungsseite von Zaim

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");

3. Zeigen Sie die Authentifizierungsseite von Zaim unter Verwendung der generierten URL an

Ü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;
	}
}

4. Generieren Sie nach der Authentifizierung ein Zugriffstoken aus dem Authentifizierungsergebnis

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);

Kommunizieren Sie nach dem Signieren der Anforderung mit dem Zugriffstoken

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.

Klicken Sie auf die API ohne erneute Authentifizierung

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);

schließlich

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

Treffen Sie Zaims API (OAuth 1.0) in Java
Zabbix API in Java
Java Stream API in 5 Minuten
Generieren Sie die CloudStack-API-URL in Java
Analysieren der COTOHA-API-Syntaxanalyse in Java
JPA (Java Persistence API) in Eclipse
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Versuchen Sie es mit der Stream-API in Java
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Rufen Sie die Salesforce REST-API von Java aus auf
Versuchen Sie es mit der JSON-Format-API in Java
Partisierung in Java
Änderungen in Java 11
Janken in Java
Java Stream API
Umfangsrate in Java
FizzBuzz in Java
ChatWork4j für die Verwendung der ChatWork-API in Java
[Java] API-Erstellung mit Jerjey (Jax-rs) mit Eclipse
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Versuchte Mastodons Toot- und Streaming-API in Java
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Packen Sie die API-Antwort (Java)
Aufrufbare Schnittstelle in Java
Rufen Sie die Amazon Product Advertising API 5.0 (PA-API v5) in Java auf
Kommentare in der Java-Quelle
[Java] Stream API / Map
Fehlerbehebung bei der Docker-Client Java API
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
Verwenden Sie OpenCV mit Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Fehler in Java ausdrücken
Erstellen Sie JSON in Java
Datumsmanipulation in Java 8
Was ist neu in Java 8?
Verwenden Sie PreparedStatement in Java
Was ist neu in Java 9,10,11
Parallele Ausführung in Java
Diese Katze von Metadata Co., Ltd. Ruft die Katzen-API in Java auf.