在Ebay Browse API上缺少用于授权的访问令牌

时间:2018-07-19 06:39:12

标签: oauth-2.0 apollo ebay-api apollo-server

我尝试从eBay API搜索项目。在我的Apollo Server 2 server.js 文件中,我在实例化时通过上下文属性传递令牌字符串(例如Doku:Apollo context argument)。因此,每个请求都包含身份验证HTTP标头属性。作为试用,现在,我仅使用固定令牌字符串。如果我为客户工作,这将在以后更改。

server.js

import { ApolloServer } from 'apollo-server'
import schema from './schema'

const server = new ApolloServer({
   schema,
   context: ({ req }) => {
        const token = 'Bearer v^1.1#i^1#I^3#f^0#p^1#r^0#t^H4sIAAA...' // my token

        return {
             ...req,
             headers: {        
                 ...req.headers,
                 // enrich the header with oauth token
                 authorization: token,
             },
        }
    },
})

server.listen().then(({ url }) => console.log(` Server ready at ${url}`))

解析器方法

// A map of functions which return data for the schema.
const resolvers = {
    Query: {
       books(root, { keyword = '' }, context) {
          console.log(context.headers)
           fetch(`https://api.ebay.com/buy/browse/v1/item_summary/?q=${keyword}`)
             .then(response => response.json())
             .then(json => console.log(json))

           return []
     }
   }
}

context.header包含授权属性:

{ host: 'localhost:4000',
  connection: 'keep-alive',
  'content-length': '108',
  accept: '*/*',
  origin: 'http://localhost:4000',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
  dnt: '1',
  'content-type': 'application/json',
  referer: 'http://localhost:4000/',
  'accept-encoding': 'gzip, deflate, br',
  'accept-language': 'de,en;q=0.9',
  authorization: 'Bearer v^1.1#i^1#f^0#p^1#r^0#I^3#t^H4sIAAAAAAAAAOV...' 
 }

JSON响应包含errorId 1002错误。它说授权HTTP请求标头中缺少访问令牌。

{ errors:
   [ { errorId: 1002,
      domain: 'OAuth',
      category: 'REQUEST',
      message: 'Missing access token',
      longMessage: 'Access token is missing in the Authorization HTTP request header.' } ] }

此外,我使用一个新的浏览器选项卡,输入URL https://api.ebay.com/buy/browse/v1/item_summary/search?q=test 并添加相同的授权标头属性(我使用ModHeader chrome extension)。我按下Enter键,请求有效,并且得到了预期的JSON。

这令人困惑,我不知道在传递令牌时我在做什么错。有人有主意吗?

1 个答案:

答案 0 :(得分:1)

您看到的标头是请求中发送到GraphQL服务器的标头。您所做的全部工作都是对其进行修改,以包括Authorization标头,然后将整个请求对象包含在上下文中-您没有将任何标头信息传递给fetch调用,而实际上是从eBay获取数据。最低限度,您想要执行以下操作:

fetch(`https://api.ebay.com/buy/browse/v1/item_summary/?q=${keyword}`, {
  headers: {
    Authorization: context.headers.authorization,
  },
})

还请记住,fetch调用应在解析器中返回,否则将不会等待。