0

Я создал Endpoints API в Google Apps Engine с питоном. Для api требуется аутентификация oAuth2. Этот метод отлично работает с api explorer, однако я не могу понять, почему я запускаю HttpError 403 «Client_id» во время выполнения. Я знаю, что идентификатор клиента действителен, потому что я смог успешно использовать его в api explorer. Я знаю, что я раскрываю свою клиентскую тайну в этом сообщении, но мне нужна помощь. Как только я получу его работу, я запрошу новый секретный и клиентский идентификатор.Прием HttpError 403 При выполнении пользовательского Google Endpoints API

Код, который называет API:

from apiclient.discovery import build 
from oauth2client.appengine import OAuth2Decorator 
import logging 
import pprint 
import webapp2 

decorator = OAuth2Decorator(
    client_id='968442935974-happ8rfg8eq059v1p8364bv5mj8tjd4l.apps.googleusercontent.com', 
    client_secret='q31TNSbsc70xfEwaTjXuVAPI', 
    scope='https://www.googleapis.com/auth/userinfo.email') 

# For for production 
api_root = 'https://jamesste-school-app.appspot.com/_ah/api' 
api = 'knowledge' 
version = 'v1' 
discovery_url = '%s/discovery/v1/apis/%s/%s/rest' % (api_root, api, version) 

class TestHandler(webapp2.RequestHandler): 
    @decorator.oauth_required 
    def get(self): 
     service = build(api,version,discoveryServiceUrl=discovery_url) 
     self.response.headers['Content-Type'] = 'application/json' 
     knowledge_list = service.knowledge_message().list() 
     knowledge_list.execute(http=decorator.http()) 
     self.response.out.write(pprint.pformat(knowledge_list)) 


app = webapp2.WSGIApplication([ 
    ('/test', TestHandler), 
    (decorator.callback_path, decorator.callback_handler())], 
    debug=True) 

Код API:

from google.appengine.ext import ndb 
from models import Knowledge 
from models import KnowledgeType 
from models import Resource 
from protorpc import message_types 
from protorpc import messages 
from protorpc import remote 
from apiuser import ApiUser 
import endpoints 
import logging 



def get_endpoints_current_user(raise_unauthorized=True): 
    """Returns a current user and (optionally) causes an HTTP 401 if no user. 
    Args: 
     raise_unauthorized: Boolean; defaults to True. If True, this method 
      raises an exception which causes an HTTP 401 Unauthorized to be 
      returned with the request. 
    Returns: 
     The signed in user if there is one, else None if there is no signed in 
     user and raise_unauthorized is False. 
    """ 
    current_user = endpoints.get_current_user() 
    if raise_unauthorized and current_user is None: 
     raise endpoints.UnauthorizedException('Invalid token.') 
    return current_user 


class KnowledgeMessage(messages.Message): 
    knowledge_key = messages.StringField(1) 
    knowledge = messages.StringField(2) 
    resource_key = messages.StringField(3) 
    resource_name = messages.StringField(4) 
    resource_section_key = messages.StringField(5) 
    resource_section_name = messages.StringField(6) 
    types = messages.StringField(7, repeated=True) 
    page = messages.IntegerField(8) 
    keywords = messages.StringField(9, repeated=True) 
    user_email = messages.StringField(10) 
    user_org_key = messages.StringField(11) 

class KnowledgeMessageList(messages.Message): 
    items = messages.MessageField(KnowledgeMessage, 1, repeated=True) 

@endpoints.api(name="knowledge", version="v1", description="API for Knowledge management", 
       auth_level=endpoints.AUTH_LEVEL.REQUIRED, 
       allowed_client_ids=['1-web-apps.apps.googleusercontent.com', 
            '2-android-apps.apps.googleusercontent.com', 
            endpoints.API_EXPLORER_CLIENT_ID])  
class KnowledgeMessageApi(remote.Service): 

    @endpoints.method(KnowledgeMessage, KnowledgeMessage, name="knowledge_message.insert", path="knowledge", http_method="POST") 
    def insert_knowledge(self, request): 
     authenticated_user = ApiUser() 
     logging.info("Logging: class KnowledgeMessageApi.insert_knowledge() - authenticated_user.email = " + authenticated_user.email) 
     PARENT_KEY = authenticated_user.get_org_key()  
     logging.info("Logging: class KnowledgeMessageApi.insert_knowledge() - authenticated_user.get_org_key()") 

     logging.info("Logging: class KnowledgeMessageApi.insert_knowledge() - request.knowledge = " + request.knowledge) 
     logging.info("Logging: class KnowledgeMessageApi.insert_knowledge() - request.resource_key = " + request.resource_key) 
     logging.info("Logging: class KnowledgeMessageApi.insert_knowledge() - request.resource_section_key = " + request.resource_section_key) 
     types_string = "" 
     for item in request.types: 
      types_string += item.strip() 
     logging.info("Logging: class KnowledgeMessageApi.insert_knowledge() - request.types = " + types_string) 

     logging.info("Logging: class KnowledgeMessageApi.insert_knowledge() - request.page = " + str(request.page)) 
     keywords_string = "" 
     for item in request.keywords: 
      keywords_string += item.strip() 
     logging.info("Logging: class KnowledgeMessageApi.insert_knowledge() - request.keywords = " + keywords_string) 

     if request.knowledge_key: 
      logging.info("Logging: class KnowledgeMessageApi.insert_knowledge() - request.knowledge_key = " + request.knowledge_key) 
      # If no key exists, then we can assume it needs to be inserted 
      # into the datastore. Overwrite any exiting values with what 
      # is passed into the method 
      kno=ndb.Key(urlsafe=request.knowledge_key).get() 
      kno.knowledge = request.knowledge 
      kno.resource = ndb.Key(urlsafe=request.resource_key) 
      kno.resource_section = ndb.Key(urlsafe=request.resource_section_key) 
      kno.types = request.types 
      kno.page = request.page 
      kno.keywords = request.keywords 
      kno.put() 

     else: 
      #get resource key and name 
      Knowledge(parent=PARENT_KEY, 
         knowledge=request.knowledge, 
         resource = ndb.Key(urlsafe=request.resource_key), 
         resource_section = ndb.Key(urlsafe=request.resource_section_key), 
         types = request.types, 
         page = request.page, 
         keywords = request.keywords 
        ).put() 

     return request 


    @endpoints.method(message_types.VoidMessage, KnowledgeMessageList, name='knowledge_message.list', path='knowledge_messages', http_method='GET') 
    def list_knowledge(self, unused_request): 
     authenticated_user = ApiUser() 
     if not authenticated_user.is_authenticated: 
      logging.info("Logging: KnowledgeMessageApi.list_knowledge - user was not authenticated") 
      raise endpoints.ForbiddenException() 

     logging.info("finding current user info : " + authenticated_user.email) 
     PARENT_KEY = authenticated_user.get_org_key() 
     knos = [] 
     for kno in Knowledge.query(ancestor=PARENT_KEY): 

      knos.append(KnowledgeMessage(knowledge_key=kno.key.urlsafe(), 
             knowledge=kno.knowledge, 
             resource_key=kno.resource.urlsafe(), 
             resource_name=kno.resource.get().name, 
             resource_section_key=kno.resource_section.urlsafe(), 
             resource_section_name=kno.resource_section.get().name, 
             types=kno.types, 
             page=kno.page, 
             keywords=kno.keywords, 
             user_email=authenticated_user.email, 
             user_org_key=PARENT_KEY.urlsafe()) 
         ) 
     return KnowledgeMessageList(items=knos) 


app = endpoints.api_server([KnowledgeMessageApi]) 

Я также включать несколько изображений доказательств того, что я разведанных перед отправкой вопроса.

enter image description here

Я очень ценю помощь я получаю.

ответ

0

я обнаружил свою ошибку после долгих работы:

В моей апи, я никогда не указано, которые client_ids были разрешены.

@endpoints.api(name="knowledge", version="v1", description="API for Knowledge management", 
       auth_level=endpoints.AUTH_LEVEL.REQUIRED, 
       allowed_client_ids=['1-web-apps.apps.googleusercontent.com', 
            '2-android-apps.apps.googleusercontent.com', 
            endpoints.API_EXPLORER_CLIENT_ID])  
class KnowledgeMessageApi(remote.Service): 

Видимо код «1-web-apps.apps.googleusercontent.com» был заполнителем, и я никогда не заменить его с моим собственным. Это было исправлено.

 Смежные вопросы

  • Нет связанных вопросов^_^