ارسال درخواست get به گوگل در الکسیر ( HTTPoison )

با درود خدمت شما . من یک چند روزه به کل از خودم نا امید شدم :grinning: یک درخواست ساده نمی تونم بفرستم

من در روتر اومدم به صورت زیر عمل کردم

get "/abs", PageController, :gettogoogle

و چرا این کارو کردم ؟ می خوام هرکی زد name.com/abs ریدایرکت بشه به گوگل . پس این لینک نمایش دادنی نیست بلکه فقط ریدایرکت می شه .

بعد اومدم یک فانکشن درست کردم

def gettogoogle(conn, _params) do
  HTTPoison.start
  url   = "https://accounts.google.com/o/oauth2/v3/auth"
  json = Poison.encode!(%{
      "client_id" => "client _ id",
      "scope" => "https://www.googleapis.com/auth/drive",
      "client_secret" => "client _ secret"
   })
   IO.inspect json
   HTTPoison.post!(url, json,[])

end

همانطور که می بینید من از پویزن و همینطور http اون استفاده کردم تا درخواست خودمو به گوگل بفرستم . ولی متاسفانه به من ارور زیر می ده

expected action/2 to return a Plug.Conn, all plugs must receive a connection (conn) and return a connection

این در زمانی هست که مثلا render نمی نویسم ولی من اینجا نیاز به رندر ندارم بلکه نیاز به ریدایرکت دارم به لینک مورد نظر

وقتی می یام مثلا

اینجوری می زنم :

redirect(conn, to: HTTPoison.post!(url, json,[]))

ارور های html زیادی به صفحه می یاد . به نظرتون مشکل از کجاست که نمی تونم به گوگل درخواست بزنم ریدایرکت بشه ؟

سلام، منظور از redirect چيه؟

1 پسندیده

درود وقتی روی لینک http://localhost:4000/abs زدم انتقال پیدا کنه به سرور گوگل به لینک https://accounts.google.com/o/oauth2/v3/auth

من فکر می کنم هم تو httpoison مشکل دارم و هم تو انتقال بر اساس توضیح بالا

:rose:

١ مورد redirect و بازم متوجه نشدم، كد شما انگار قراره يه درخواست به گوگل بفرسته و با نتيجه كارى انجام بده احتمالا،
٢ حالا چرا اكشنى كه مبتنى بر پست هست اسمش با get شروع ميشه حتما دليل خاصى داره.
٣ مقدار اين action بايد connection باشه اما در حال حاظر
HTTPoison.post!(url, json,[]) هست.

منظورم از مقدار، خورجى متد هست اما اين موظوع در فانكشنال پروگرمينگ خيلى معنى دار نيست.

1 پسندیده

وقتى جلوى كامپيوتر بودم بهتر توضيح ميدم، با مبايل بهتر از اين نميشه :thinking:

  1. چون اول با post درست کردم تو روتر ولی ارور
    no route found for GET /abs (GoogledriveuiWeb.Router)
    رو داشتم بخاطر همین تبدیل به get کردمش

ولی اگر منظورتون اسم تابعش هست که تو روتر بهش معرفی کردم gettogoogle که همینجوری برای تست

۳. من متاسفانه این رو متوجه نشدم . چون در داکیومنتش برای ارجاع اومده بود و از HTTPoison.post!(url, options, headers) استفاده کرده بود

من نیازمندم در این درخواستم به گوگل کلاینت آیدی و سکرت آیدی رو ارسال کنم و همینطور اسکوپم . حالا نمی دونم دقیقا چطور این مورد رو انجام بدم اگر می شه بیشتر توضیح بدهید با تشکر

درود من فکر می کنم کلا post من با HTTPoison مشکل داره چون همین اطلاعات رو با get تو ترمینال بدون اینکه اصلا به روتر کار داشته باشم مشکلی نداره

HTTPoison.get!("https://accounts.google.com/o/oauth2/v2/auth", [],
 [params: [
   {"scope", "https://www.googleapis.com/auth/drive"},
   {"access_type", "offline"},
   {"max_connections", "100"},
   {"include_granted_scopes", "true"},
   {"state", "state_parameter_passthrough_value"},
   {"redirect_uri", "http://localhost:4000/auth/google/callback"},
   {"response_type", "code"},
   {"client_id", "client_id"}
   ]])

اگر دوستان با گوگل و api اون کار کردن در مورد ارسال درخواست post راهنمایی بکنند بسیار لطف می کنند ممنون

نکته

من با postman افزونه روی کروم تست کردم درخواست پست مشکلی نداشت ولی متاسفانه با پویزن نمی تونم :pensive:
شاید اصلا قسمت گرفتن سطح دسترسی فقط get کار می کنه و من دارم الکی تست می کنم

عرض کردم که مشکل HTTPoison نیست, مشکل عدم موفقیت در پترن مچینگ در هنگام فراخوانی اکشن است.
خروجی action درست نیست.

1 پسندیده

درود می شه لطفا بیشتر راهنمایی بکنیدیا با تصحیح کد یا جوری که بتونم ویرایش بکنم ؟

درود خدمت دوستان . من فکر می کنم قبل از انتقال و … هرچیزی که بالا گفتم اول مشکلمو با گوگل باید حل کنم بعد برم سمت حالا انتقال درخواست و … بخاطر همین ازتون خواهش می کنم موارد بالا گفتم رو فراموش کنید

نکنه : من از کتابخونه هایی مثل اوبرث و آس۲ هم استفاده کردم ولی موفق نشدم

بر اساس داکیومنت گوگل در قسمت دسترسی

در اولین درخواست من به صورت دستی در داخل مروگرم زدم به شرح زیر :

https://accounts.google.com/o/oauth2/v2/auth?client_id=client_id-oek2de1m5grpksf87fhr81c4o9es0460.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A4000%2Fauth%2Fgoogle%2Fcallback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive

بعد در برگشت به یکی از توابع من رفت که در روتر تعریف کردم و به وسیله params اومدم و کدی که برگشت داده بود رو دریافت کردم . بر اساس آموزش هایی که ملت تو استک قرار دادن من هم دوباره به صورت زیر ارسال کردمش

def gettogoogle() do
  url   = "https://accounts.google.com/o/oauth2/token"
  options = Poison.encode!(%{
      "cod‌​e"                    => "__cod‌​e__",
      "grant_type"              => "authorization_code",
      "client_id"               => "client_id.apps.googleusercontent.com",
      "redirect_uri"            => "http://localhost:4000/auth/google/callback",
      "client_secret"           => "client_secret",
   })
  headers = [{"Content-Type", "application/x-www-form-urlencoded"}]
  HTTPoison.post!(url, options, headers)
end

که متاسفانه ارور زیر رو بهم می ده

Required parameter is missing: grant_type

خیلی مطالب خوندم تست کردم ولی این ارور رد نشد یا رد بشه مشکلات دیگه ای پیش می یاد

نکته : تمامی موارد بالا لطفا بزارید کنار در صورت امکان اگر تاحالا کار کردید با ای پی آی گوگل لطفا کمک کنید اولین مشکل رو حل کنم . تا برسم سر مشکلات بعدی .

با تشکر

https://developers.google.com/identity/protocols/OAuth2
https://developers.google.com/identity/protocols/OAuth2WebServer

به روز رسانی

من از Rest هم تست زدم به شرح زیر

def gettogoogle() do
      url   = "https://www.googleapis.com/oauth2/v4/token"
      options = Poison.encode!(%{
          "cod‌​e"                    => "cod‌​eCRGVMaOzaLbhw_vB7qYuk",
          "client_id"               => "client_id",
          "client_secret"           => "client_secret",
          "grant_type"              => "authorization_code",
          "redirect_uri"            => "http://localhost:4000/auth",
       })
      headers = [{"Content-Type", "application/x-www-form-urlencoded"}]
      HTTPoison.post!(url, options, headers)
    end

که ارور زیر دریافت می کنم

%HTTPoison.Response{body: "{\n \"error\": \"unsupported_grant_type\",\n \"error_description\": \"Invalid grant_type: \"\n}\n",
 headers: [{"Vary", "X-Origin"},
  {"Content-Type", "application/json; charset=UTF-8"},
  {"Date", "Thu, 07 Sep 2017 09:00:13 GMT"},
  {"Expires", "Thu, 07 Sep 2017 09:00:13 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=\"39,38,37,35\""},
  {"Accept-Ranges", "none"}, {"Vary", "Origin,Accept-Encoding"},
  {"Transfer-Encoding", "chunked"}],
 request_url: "https://www.googleapis.com/oauth2/v4/token", status_code: 400}

جالبه رستش خیلی ساده هست چیزی که تو داکیومنت هست نمی دونم چرا نمی تونم انجامش بده . هیچی نداره ولی ارور می ده ارور بالا

درود خدمت دوستان گرامی من تونستم با گوگل اوبرث بیام توکن بگیرم و ذخیره دیتابیس بکنم و هر دفعه هم درخواست رو مجدد ارسال کنم برای گوگل رفرش می شه

حالا اومدم سر اینکه یک فایل بسازم که متاسفانه به هر اروری که تو گوگل وجود داره برخورد کردم و حتی یک سری فکر کنم فقط به من این ارور هارو داده :smile:

اگر دوستان تاحالا با الکسیر برای گوگل درایو پروژه ای درست کردن و موفق به آپلود فایل شدن لطفا به اشتراک بزارند چه رایگان چه با هزینه که بلخره بتونیم متصل بشیم به این گوگل احمق

تنها پستی که وجود داره در گوگل اینه:

که متاسفانه کد های طرف ناقصه و نمی شه ازش کپی برداری کرد .

با تشکر