2017-02-11 6 views
0

Я пытаюсь сделать простую вставку активности к профилю Google+ авторизованного пользователя с помощью API доменов Google. Похоже, что этот API доступен только для учетных записей Google Apps (теперь G Suite) и независимых поставщиков программного обеспечения, поэтому я создал учетную запись G Suite. Это было сделано после нескольких попыток с обычной учетной записью разработчика Google, для которой я получал те же ошибки, что и здесь.API доменов Google продолжает возвращать ответы 401/403. Что я делаю не так?

В идеале, я хотел бы достичь этого через конечные точки HTTP, как описано в документе here.

Я создал приложение google и создал OAuth2 CLIENT_ID и CLIENT_SECRET, и я, конечно же, включил API-интерфейсы. Следующий код Java показывает шаги, предпринятые для достижения моей цели.

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()); 
    } 
} 

Вот ответ, который я получаю:

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]} 

Моя следующая попытка была попытка рычагов Google Java библиотеки и в конечном итоге со следующим:

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()); 

Выход:

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) 

У меня такая же ошибка 403, когда я пытался это сделать через API-интерфейс API.

И тогда без всякой определенной причине я пытался:

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 

Ответ:

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "authError", 
    "message": "Invalid Credentials", 
    "locationType": "header", 
    "location": "Authorization" 
    } 
    ], 
    "code": 401, 
    "message": "Invalid Credentials" 
} 
} 

Что мне не хватает?

UPDATE: Я попытался создать сообщения для пользователя домена G Suite, прошедшего проверку подлинности, и получил те же ошибки.

ответ

1

Чтобы работать с google plus domain api, вам необходимо создать учетную запись http://apps.google.com/, а затем использовать этот пользователь для создания сообщения. Но!!! Они создают ограничение по должности. Я пока не знаю, как создать публичный пост.

Пожалуйста, обратитесь это ссылки на более ...

Google Plus Creating a Post - Rest API -Forbidden

How to create a new post on Google+ via javascript API?

How to post in Google+ wall

надеюсь, что это поможет вам ...

 Смежные вопросы

  • Нет связанных вопросов^_^