簡體   English   中英

雲端點認證

[英]Cloud Endpoints Authentication

我正在將App Engine Standard與Python 2運行時和Endpoints Frameworks結合使用。 發出請求時,如果請求完成,則應用程序僅返回“成功”。 我正在嘗試實施身份驗證,因此未經身份驗證的用戶無法完成請求。 我已經完成以下工作:

  1. 修改了我的main.py裝飾器,以包括發行人和受眾:
issuers={'serviceAccount': endpoints.Issuer('[MYSERVICEACCOUNT]', 'https://www.googleapis.com/robot/v1/metadata/x509/[MYSERVICEACCOUNT]')}, 
audiences={'serviceAccount': ['[MYSERVICENAME]-dot-[MYPROJECT].appspot.com']}
  1. 修改了我的main.py方法來檢查有效用戶:
user = endpoints.get_current_user()
if user is None:
   raise endpoints.UnauthorizedException('You must authenticate first.')
  1. 重新生成並重新部署了我的openAPI文檔。 現在,它具有security和securityDefinitions部分。

  2. 更新了我的app.yaml以引用該Endpoints版本。

  3. 重新部署我的應用

要向我的應用程序發出授權請求,我已執行以下操作:

  1. 我在Endpoints服務上為服務帳戶賦予了“服務使用者”角色。

  2. 使用Google 文檔中的generate_jwt函數生成簽名的jwt。 我正在使用服務帳戶的json密鑰文件傳遞憑據。

    payload = json.dumps({
        "iat": now,
        "exp": now + 3600,
        "iss": [MYSERVICEACCOUNT],
        "sub": [MYSERVICEACCOUNT],
        "aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
    })
  1. 使用Google文檔中的make_jwt_request函數發出請求。
   headers = {
        'Authorization': 'Bearer {}'.format(signed_jwt),
        'content-type': 'application/json'}

我收到401客戶端錯誤:未經授權的網址錯誤。 我想念什么嗎?

您的受眾群體不匹配; 在您的代碼中,您需要[MYSERVICEACCOUNT]的受眾,但是在生成JWT時,您的受眾是[MYSERVICENAME]-dot-[MYPROJECT].appspot.com 這些需要匹配。

細節很少,可能值得檢查:

  • 允許的聽眾列表應包含客戶端生成的JWT令牌的aud聲明值。 羅斯指出了這一點。
  • 樣本客戶文檔中提出的所有JWT索賠均已存在。 您的代碼缺少JWT payload字典中的email聲明。
  • 您正在訪問的方法不需要特定的OAuth范圍。 范圍設置為@endpoints.method裝飾器的scopes字段。

在與Google取得支持票后,事實證明Google的文檔不正確。 main.py函數需要通過以下方式檢查經過身份驗證的用戶:

providers=[{ 
'issuer': '[YOUR-SERVICE-ACCOUNT]', 
'cert_uri': 'https://www.googleapis.com/service_accounts/v1/metadata/raw/[YOUR-SERVICE-ACCOUNT]', 
}] 

audiences = ['[YOUR-SERVICE-NAME]-dot-[YOUR-PROJECT-NAME].appspot.com'] 

user = endpoints.get_verified_jwt(providers, audiences, request=request) 
if not user: 
  raise endpoints.UnauthorizedException 

進行更改后,嘗試進行身份驗證的請求時出現以下錯誤:

ProtoRPC方法實現中遇到意外錯誤:AttributeError(“ unicode”對象沒有屬性“ get”)

這是由於我如何使用json.dumps()生成有效負載而引起的。 我生成的沒有json.dumps(),如下所示:

payload = {
  "iat": now,
  "exp": now + 3600,
  "iss": [MYSERVICEACCOUNT],
  "sub": [MYSERVICEACCOUNT],
  "aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
}

這兩個更改解決了我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM