2017-08-31 1 views
0

Ich habe eine App-Engine-App + Cloud-Endpunkte. Ich habe eine Cron-Task in der Task-Warteschlange konfiguriert, um einen der Endpunkte aufzurufen. Der Cron hat eine Auth-Constraint für Admin.App-Engine: Leere Referrer-Fehler von Cron-Job beim Aufrufen von Endpoint mit eingeschränktem API-Schlüssel

All dies funktioniert, aber wenn ich die api Schlüssel auf bestimmte Domänen beschränken, erhalte ich die folgende Fehlermeldung, wenn der cron ausgeführt wird:

fehlgeschlagen check_errors { Code: REFERER_BLOCKED Detail: „Anfragen aus Referer <leer> sind blockiert. " }

Es scheint nicht, wie ich

anscheinend Google App Engine Probleme cron-Anfragen von der IP-Adresse 0.1.0.1 ein Schiedsrichter-Header an den cron.yaml hinzufügen können.

so könnte ich möglicherweise diese IP erlauben, aber ich möchte API Schlüssel nach Domäne nicht i.p. und es scheint nicht wie ich kann beides tun

Kennt jemand eine Problemumgehung, um den Cron-Job Zugriff auf einen API-Schlüssel durch die Domäne eingeschränkt zu ermöglichen?

Antwort

0

fand ich eine Arbeit um für diese:

Hinweis: Ich sehe Menschen, verweist dies in der Dokumentation:

„Calling Google Cloud Endpoints

Sie können keine Google Cloud Endpoint aus einem cron aufrufen Stattdessen sollten Sie eine Anforderung an ein Ziel senden, das von einem Handler bedient wird, der in der Konfigurationsdatei Ihrer App oder in einer Dispatch-Datei angegeben ist. Dieser Handler ruft dann die entsprechende Endpunktklasse und Methode auf. "

https://cloud.google.com/appengine/docs/standard/java/config/cron#

Ohne weitere Erklärung oder ein Beispiel, das ich sehen konnte.

Ich bin jedoch in der Lage, meine Endpunkte von einem Cron-Job zu nennen, und es funktionierte gut, abgesehen von der api-Schlüssel Einschränkung Problem.

Ich habe mehrere Kommentare zu anderen Posts gelesen, in denen erwähnt wird, dass ein Servlet-Mapping durchgeführt wird, aber ohne ein Beispiel zu geben. Hier finden Sie die Problemumgehung und Beispielcode für das Servlet-Mapping.

Java Klasse

import java.io.IOException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class MyServlet extends HttpServlet { 
    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException { 
    // call your Endpoint Method here, or whatever you want 
     resp.setContentType("text/plain"); 
     resp.getWriter().println("Hello, world"); 
    } 
} 

web.xml

<servlet> 
     <servlet-name>cronServlet</servlet-name> 
     <servlet-class>com.example.MyServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>cronServlet</servlet-name> 
     <url-pattern>/cronServlet</url-pattern> 
    </servlet-mapping> 

<security-constraint> 
     <web-resource-collection> 
      <web-resource-name>cronServletConstraint</web-resource-name> 
      <url-pattern>/cronServlet</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>admin</role-name> 
     </auth-constraint> 
    </security-constraint> 

cron.yaml

cron: 
- description: myCron 
    url: /cronServlet 
    schedule: every 12 hours 

https://cloud.google.com/appengine/docs/flexible/java/how-requests-are-handled

Verwandte Themen