2017-08-31 14 views
0

我有一個App引擎應用+雲端點。我在任務隊列中配置了一個cron任務來調用其中一個端點。 cron對管理員有一個auth-constraint。App Engine:使用受限制的API密鑰調用端點時,從cron作業中清除引用者錯誤

所有這一切工作,但是當我限制API密鑰對特定域,我得到當cron是運行以下錯誤:

失敗 check_errors { 代碼:REFERER_BLOCKED 細節:「請求從引用者<空的>被阻止。「 }

它似乎並不像我可以從IP地址0.1.0.1裁判頭添加到cron.yaml

顯然谷歌App Engine的問題cron的請求。

所以我可能會允許該IP,但我想通過域名不是i.p.限制api密鑰。它似乎並不像我可以這樣做

有誰知道一個解決方法,允許cron作業訪問由域限制的API密鑰?

回答

0

我發現了一個變通方法是:

注:我看到人們在文檔中引用此:

「調用谷歌雲端點

你不能從一個cron調用谷歌雲端點而是應該向由應用程序的配置文件或分派文件中指定的處理程序提供服務的目標發出請求,然後該處理程序調用相應的端點類和方法。

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

沒有進一步的解釋或例子,我可以看到。

但是我可以從cron作業調用我的端點,並且它工作正常,除了api關鍵約束問題之外。

我在其他提到做servlet映射的帖子上看了幾條評論,但沒有提供一個例子,所以這裏是我找到的解決方法和servlet映射的示例代碼。

的Java類

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

相關問題