Insert photo ERROR: The remote server returned an error: (403) Forbidden

◇◆丶佛笑我妖孽 提交于 2019-12-11 01:59:47

问题


I need your help!.

Im trying to insert a new photo into a Picasa Album using Oauth 2.0 and a simple HttpRequest process. The result is that I cant insert a new photo into my Picasa web album after following the instructions listed on: https://developers.google.com/picasa-web/docs/2.0/developers_guide_protocol#Auth

I also have to say that I tried using the .Net library that they provide with the same results.

The implementation that I'm using now is the following:

public static string PostImage(
       string streamImageConvertedToString)
    {
        string url = string.Format("https://picasaweb.google.com/data/feed/api/user/{0}/albumid/{1}", "username@gmail.com", "idAlbum");

        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.ContentType = "image/jpeg";
        request.ContentLength = Encoding.UTF8.GetByteCount(data);
        request.Method = "POST";
        request.Headers.Add("GData-Version", "2");
        request.Headers.Add("Slug", "cute_baby_kitten.jpg");
        request.Headers.Add("Authorization", "Bearer " + GetToken());
        if (data != null)
        {
            using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
            {
                writer.Write(data);
            }
        }

        HttpWebResponse response = request.GetResponse() as HttpWebResponse;

        string result = string.Empty;
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            result = reader.ReadToEnd();
        }

        return result;
    }
 private static string GetToken() {
        const string ServiceAccountEmail = "someid@developer.gserviceaccount.com";

        var servicio = new PicasaService(null);
        var certificate = new X509Certificate2(HttpContext.Current.Server.MapPath("/key2.p12"), "notasecret", X509KeyStorageFlags.Exportable);

        var serviceAccountCredentialInitializer =
            new ServiceAccountCredential.Initializer(ServiceAccountEmail)
            {
                Scopes = new[] { "https://picasaweb.google.com/data/" }
            }.FromCertificate(certificate);

        var credential = new ServiceAccountCredential(serviceAccountCredentialInitializer);

        if (!credential.RequestAccessTokenAsync(System.Threading.CancellationToken.None).Result)
            throw new InvalidOperationException("Access token request failed.");

        return credential.Token.AccessToken;
    }

Any help is welcome!!


回答1:


(403) Forbidden

Means that you are trying to use a method insert which requires authorization to do.

you are connecting to service account someid@developer.gserviceaccount.com which should give you access to someid@developer.gserviceaccount.com pictures then.

you appear to be trying to access username@gmail.com unless you have given someid@developer.gserviceaccount.com access to insert pictures on behalf of username@gmail.com (Which I am not even sure is possible) you are not going to have permission to do this.

Remember a service account is a sudo user it has its own drive account, calendar account ... it does not have access to a random users data unless that user has given them access like they would any other user.

Note: Google .net client library does not support gdata APIs. Picasa is a gdata library I like how are trying to merge the two I am have to test this.




回答2:


You're best (imho) approach would be to forget libraries and forget service accounts. Get a refresh token for the google user account you're trying to insert to, and use the raw HTTP REST API to invoke Picasa.



来源:https://stackoverflow.com/questions/30567126/insert-photo-error-the-remote-server-returned-an-error-403-forbidden

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!