我为我的Android应用程序创建了一个用于GCM推送通知的Android API密钥.从过去两天开始,GCM服务器在PHP中返回Unauthorized(401)响应.
Android API密钥是否有任何原因无效/过期?或者GCM是否弃用了Android API密钥?
我还没有得到关于为什么Android API密钥无效的正确解释?他们中的大多数人更喜欢使用服务器密钥而不是GCM的Android API密钥,但没有提到为什么不使用Android API密钥.
为什么不在GCM中使用Android API Key?Android API密钥有任何限制吗?或者,如果通知消息超过每日限制,GCM服务器是否阻止通知/ GCM服务器使Android API密钥无效?
android firebase google-cloud-messaging firebase-cloud-messaging
尝试连接到Google Cloud Message Server时,我收到许多401 未经授权的错误.
我们的代码在我们的测试服务器上运行了一段时间,但在生产的代码上它有时会失败.
API密钥工作正常,推送通知到达(最终),但同时我收到很多401错误.
我在控制台上验证了服务器IP地址在白名单上:
在关注Google Troublesooting指南时,我得到了惊人的结果:
me@myserver:~$ :curl --header "Authorization: key=AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFFU" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"ABC\"]}"
<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
me@myserver:~$ curl --header "Authorization: key=AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFFU" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"ABC\"]}"
{"multicast_id":7560936933053964665,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
me@myserver:~$ curl --header "Authorization: key=AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFFU" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"ABC\"]}"
<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)
有时,相同的curl命令有效,有时它也没有任何改变,也没有在控制台或命令行中...有时它工作,我认为密钥没关系(我已经仔细检查了密钥和允许的IP几次).
我已经检查了所有stackoverflow问题并测试了所有建议,但即使从白名单中删除所有IP(以允许来自任何IP的请求)行为仍然是相同的,有时它有效地工作了一些时间它没有
我检查了一些参考文献: …
我试图在我的应用程序中使用Google应用程序引擎获取spring security oauth2设置.一切似乎在本地工作正常,但当我部署到应用程序引擎时,事情开始崩溃.我通过谷歌进行身份验证后,将其转发给Whitelabel错误页面.在控制台中我看到这个错误:
http://my-application.appspot.com/login?state=t…m&session_state=8b67f5df659a8324430803973b9e1726e39fd454..1ae3&prompt=none
401 (Unauthorized)
Run Code Online (Sandbox Code Playgroud)
我用这个application.yml文件设置我的auth:
security:
oauth2:
client:
clientId: client-key
clientSecret: secret-key
accessTokenUri: https://www.googleapis.com/oauth2/v4/token
userAuthorizationUri: https://accounts.google.com/o/oauth2/v2/auth
clientAuthenticationScheme: form
scope:
- openid
- email
- profile
- https://www.googleapis.com/auth/cloud-platform
resource:
userInfoUri: https://www.googleapis.com/oauth2/v3/userinfo
preferTokenInfo: true
Run Code Online (Sandbox Code Playgroud)
我的安全配置看起来像这样:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.authorizeRequests()
.antMatchers("/static/**").permitAll()
.antMatchers("/**").hasAuthority("ROLE_ADMIN")
.anyRequest().authenticated()
.and()
.exceptionHandling()
.accessDeniedPage("/403");
}
Run Code Online (Sandbox Code Playgroud)
我在google凭据页面上配置了Oauth ID,以允许授权的javascript来源:
http://my-application.appspot.com
https://my-application.appspot.com
http://localhost:8080
Run Code Online (Sandbox Code Playgroud)
并且授权的重定向URI为:
http://my-application.appspot.com/login
https://my-application.appspot.com/login
http://localhost:8080/login
Run Code Online (Sandbox Code Playgroud)
我部署到GAE后,为什么我可能会收到未经授权的错误?
谢谢,
克雷格
google-app-engine spring-security spring-boot spring-security-oauth2
我总是得到401错误.如果我正在使用我的本地服务器,任何人都可以让我确切地知道应该是什么HTTP引用者.即目前我正在使用:
http://localhost/GCM/index.php
Run Code Online (Sandbox Code Playgroud)
并使用它生成API访问密钥.
这是我的GCM请求的PHP代码.
$key='mykey';
$headers=array('Contenttype:application/json','Authorization:key='.$key);
$url = 'https://android.googleapis.com/gcm/send';
$ch = curl_init();
$curlConfig = array(
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode(array('field1' => 'some date','field2' => 'some other data',)),
CURLOPT_HTTPHEADER => $headers,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
);
curl_setopt_array($ch, $curlConfig);
$result = curl_exec($ch);
curl_close($ch);
if($result==FALSE){
echo curl_error($ch);
echo curl_getinfo($ch);
}else{
echo $result;
}
Run Code Online (Sandbox Code Playgroud) php android google-api push-notification google-cloud-messaging