在 android 中获取意外的响应代码 403,同时在谷歌云控制台中将 API 密钥限制为 Android 应用程序

Posted

技术标签:

【中文标题】在 android 中获取意外的响应代码 403,同时在谷歌云控制台中将 API 密钥限制为 Android 应用程序【英文标题】:Getting Unexpected response code 403 in android while Restrict API key to Android apps in google cloud console 【发布时间】:2021-09-21 00:16:28 【问题描述】:

我正在使用 Google Cloud API 从 Blogger 获取一些帖子到我的 android 应用程序中。我正在使用 Volly 进行请求。当对 API 密钥没有限制时,一切正常。但是当我限制我的 Android API 密钥时,它停止工作,我得到:

E/Volley: [89773] NetworkUtility.shouldRetryException: Unexpected response code 403 for https://www.googleapis.com/blogger/v3/blogs/[my blog id]/posts/search?q=[my query]&key=[my API key]    
E/onErrorResponse:: com.android.volley.AuthFailureError

另外,我已经交叉检查了我的包名和 SHA-1 密钥,都正确。

如果我现在取消限制,它会再次正常工作。但我想将其限制在我的应用程序本身。

如何在谷歌云控制台中限制我的 android 密钥...任何帮助..?

【问题讨论】:

【参考方案1】:

我在下面遇到同样的问题是工作代码,你只需要覆盖请求的标头

class MainActivity : AppCompatActivity(), NewsItemClicked 
    private lateinit var mAdapter: NewsListAdapter

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recyclerView.layoutManager = LinearLayoutManager(this)
        fetchData()
        mAdapter = NewsListAdapter(this)
        recyclerView.adapter = mAdapter
    

    private fun fetchData()
      val url = "https://newsapi.org/v2/top-headlines?country=in&apiKey=b85b8dedeaaa4cd391d2e211ca5faf96"
        val jsonObjectRequest = object: JsonObjectRequest(
            Request.Method.GET,
            url,
            null,
            Response.Listener 
                val newsJsonArray = it.getJSONArray("articles")
                val newsArray = ArrayList<News>()
                for(i in 0 until newsJsonArray.length())
                    val newsJsonObject = newsJsonArray.getJSONObject(i)
                    val news = News(
                        newsJsonObject.getString("title"),
                        newsJsonObject.getString("author"),
                        newsJsonObject.getString("url"),
                        newsJsonObject.getString("urlToImage"),
                    )
                    newsArray.add(news)
                

                mAdapter.updatedNews(newsArray)
            ,
            Response.ErrorListener 
                Log.e("ERRORFETCH", "Something went wrong in fething")
            ,
        )
        
            override fun getHeaders(): MutableMap<String, String> 
            val headers = HashMap<String, String>()
            headers["User-Agent"] = ": Mozilla/5.0"
            return headers
        
        
        MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest)
    

    override fun onItemClicked(item: News) 

     

【讨论】:

感谢您的回复。但在这里我正在处理 Google Cloud API 以及它对 android 的限制问题。我认为在我的标题中添加headers["User-Agent"] = ": Mozilla/5.0" 并不能解决我的问题。 好吧@Venkat,您可能缺少一些标头,例如当 api 需要 req 中的某些标头时会出现此错误。 我在 google 的官方页面中看到了文档并相应地传递了标题。如果在我将限制设置为仅在 Android 中工作之前对该 API 没有限制,它也可以正常工作。

以上是关于在 android 中获取意外的响应代码 403,同时在谷歌云控制台中将 API 密钥限制为 Android 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

(tornadio2) 失败:WebSocket 握手期间出错:意外的响应代码:403

从 ExoPlayer 获取 403 响应代码错误

https://www.googleapis.com/games/v1/players/1123xxxxxx11712506520 和其他播放服务错误的意外响应代码 403

TortoiseSVN 中继结帐“服务器发送了意外的返回值(403 禁止)以响应 OPTIONS”错误

获取 403:禁止访问:当用户意外关闭登录会话时,访问被拒绝

在 pyspark 中使用 S3a 保存文件时获取 S3 响应代码(仅限 HTTP 代码,如 200,300,400,403,500 等)