gpt4 book ai didi

java - 如何从已通过 OAuth2 身份验证的服务器使用 C2DM 向设备发送消息?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:06 25 4
gpt4 key购买 nike

我正在开发必须向设备发送消息的系统的服务器部分。这与 GoogleLogin 方法一起工作正常,但我想将它迁移到 OAuth 2.0,因为其他身份验证方法已被弃用。

在 Google API 控制台中,我创建了一个项目,然后为服务帐户创建了一个 key 。

这是我用来验证服务器的代码:

public boolean authenticateServer(){
try {
File privateKey =
new File(getClass().getResource("/something-privatekey.p12").toURI());

GoogleCredential cred =
new GoogleCredential.Builder().setTransport(new NetHttpTransport())
.setJsonFactory(new JacksonFactory())
.setServiceAccountId("something@developer.gserviceaccount.com")
.setServiceAccountScopes("https://android.apis.google.com/c2dm")
.setServiceAccountPrivateKeyFromP12File(privateKey)
.addRefreshListener(this)
.build();

boolean success = cred.refreshToken();
this.credential = cred;
return success;
}
catch (Exception ex) {
//handle this
}
return false;
}

当我执行它时,方法 onTokenResponse 被调用,我得到一个 access_tokentoken_type “Bearer” 在 3600 秒后过期。到目前为止,还不错。

这是我用来向设备发送消息的代码,它总是给我一个 401 状态(未授权)。有什么想法吗?

private static String UTF8 = "UTF-8";
public void sendMessage(String text, String registrationId) {
try {
StringBuilder postDataBuilder = new StringBuilder();
postDataBuilder
.append("registration_id")
.append("=")
.append(registrationId);

postDataBuilder.append("&")
.append("collapse_key")
.append("=")
.append("0");

postDataBuilder.append("&")
.append("data.payload")
.append("=")
.append(URLEncoder.encode(text, UTF8));

byte[] postData = postDataBuilder.toString().getBytes(UTF8);

URL url = new URL("https://android.apis.google.com/c2dm/send");

HostnameVerifier hVerifier = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setHostnameVerifier(hVerifier);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty(
"Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty(
"Content-Length", Integer.toString(postData.length));
conn.setRequestProperty(
"Authorization", "Bearer " + credential.getAccessToken());

OutputStream out = conn.getOutputStream();
out.write(postData);
out.close();
int sw = conn.getResponseCode();
System.out.println("" + sw);
}
catch (IOException ex){
//handle this
}
}

谢谢!

最佳答案

由于 C2DM 目前处于测试阶段,使用 OAuth2.0 使其工作的唯一方法是创建 Web 应用程序客户端 ID,而不是服务帐户(在 Google API 控制台中)。

我已按照 http://michsan.web.id/content/how-code-android-c2dm-oauth-2 中的步骤进行操作并且效果很好

关于java - 如何从已通过 OAuth2 身份验证的服务器使用 C2DM 向设备发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10659014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com