Ich versuche, mithilfe des Google Domains API eine einfache Aktivität in das Google+ Profil eines berechtigten Nutzers einzufügen. Es scheint, dass diese API nur für Google Apps (jetzt G Suite) und ISVs verfügbar ist. Daher habe ich ein G Suite-Konto erstellt. Dies nach mehreren Versuchen mit einem normalen Google-Entwickler-Konto, für das ich die gleichen Fehler wie hier gezeigt bekommen habe.Google Domain API gibt in den Antworten 401/403 zurück. Was mache ich falsch?
Idealerweise möchte ich dies über HTTP-Endpunkte wie dokumentiert here erreichen.
Ich habe eine Google App erstellt und die OAuth2 CLIENT_ID und CLIENT_SECRET erzeugt, und ich habe natürlich die Domains API aktiviert. Der folgende Java-Code zeigt die Schritte zum Erreichen meines Ziels.
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
public class GooglePlustShenanigans {
private static final String CLIENT_SECRET = "<client_secret>";
private static final String CLIENT_ID = "<client_id>";
private static final List<String> SCOPE = Arrays.asList(
"https://www.googleapis.com/auth/plus.me",
"https://www.googleapis.com/auth/plus.stream.write");
private static final String REDIRECT_URI = "https://www.someuri.com/oauth2callback";
public static void main(String[] args) throws IOException {
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
new NetHttpTransport(),
new JacksonFactory(),
CLIENT_ID,
CLIENT_SECRET,
SCOPE)
.setAccessType("offline")// Set to offline so that the token can be refreshed.
.build();
String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();
System.out.println("Please open the following URL in your browser then " +
"type the authorization code:");
System.out.println(" " + url);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String code = br.readLine();
GoogleTokenResponse tokenResponse = flow.newTokenRequest(code)
.setRedirectUri(REDIRECT_URI).execute();
String token = tokenResponse.getAccessToken();
String refreshToken = tokenResponse.getRefreshToken();
System.out.println("Access token: " + token);
System.out.println("Refresh token: " + refreshToken);
post("Sample message", token);
}
public static void post(String msg, String token) throws IOException {
HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost("https://www.googleapis.com/plusDomains/v1/people/me/activities");
StringEntity body = new StringEntity("{\"object\":{\"originalContent\":\"" + msg + "\"}," +
"\"access\":{\"items\":[{\"type\":\"domain\"}],\"domainRestricted\":true}}");
post.setHeader("Content-Type", "application/json");
post.setHeader("Authorization", "OAuth" + token);
post.setEntity(body);
HttpResponse resp = client.execute(post);
System.out.println(resp.getStatusLine().getStatusCode());
System.out.println(resp.getStatusLine().getReasonPhrase());
System.out.println(resp.toString());
}
}
Hier ist die Antwort, die ich erhalte:
401
Unauthorized
HttpResponseProxy{HTTP/1.1 401 Unauthorized [Vary: Origin, Vary: X-Origin, WWW-Authenticate: Bearer realm="https://accounts.google.com/", Content-Type: application/json; charset=UTF-8, Date: Sat, 11 Feb 2017 00:38:07 GMT, Expires: Sat, 11 Feb 2017 00:38:07 GMT, Cache-Control: private, max-age=0, X-Content-Type-Options: nosniff, X-Frame-Options: SAMEORIGIN, X-XSS-Protection: 1; mode=block, Server: GSE, Alt-Svc: quic=":443"; ma=2592000; v="35,34", Transfer-Encoding: chunked] [email protected]}
Mein war nächsten Versuch, um zu versuchen und zu nutzen Google Java-Bibliotheken und endete mit den folgenden:
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(new NetHttpTransport())
.setJsonFactory(new JacksonFactory())
.setClientSecrets(CLIENT_ID, CLIENT_SECRET)
.build();
credential.setFromTokenResponse(tokenResponse);
credential.refreshToken();
String msg = "Happy Monday! #caseofthemondays";
// Create a list of ACL entries
PlusDomainsAclentryResource resource = new PlusDomainsAclentryResource();
resource.setType("domain"); // Share to domain
List<PlusDomainsAclentryResource> aclEntries =
new ArrayList<>();
aclEntries.add(resource);
Acl acl = new Acl();
acl.setItems(aclEntries);
acl.setDomainRestricted(true); // Required, this does the domain restriction
PlusDomains plusDomains = new PlusDomains
.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
.setApplicationName("myApp")
.build();
Activity activity = new Activity()
.setObject(new Activity.PlusDomainsObject().setOriginalContent(msg))
.setAccess(acl);
activity = plusDomains.activities().insert("me", activity).execute();
System.out.println(activity.toPrettyString());
Ausgang:
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Forbidden",
"reason" : "forbidden"
} ],
"message" : "Forbidden"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
Ich habe den gleichen 403-Fehler erhalten, als ich dies über den API Explorer versucht habe.
Und dann ohne besonderen Grund, warum ich versucht:
curl -v -H "Content-Type: application/json" -H "Authorization: OAuth$USER_ACCESS_TOKEN" -d "{"object": {"originalContent": "Happy Monday!#caseofthemondays"},"access":{"kind":"plus#acl","items":[{"type":"domain"}],"domainRestricted":true}}" -X POST https://www.googleapis.com/plusDomains/v1/people/me/activities
Antwort:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
Was bin ich?
AKTUALISIERUNG: Ich habe versucht, Posts für einen authentifizierten G Suite-Domänenbenutzer zu erstellen, und habe die gleichen Fehler erhalten.