نحوه کار کردن با Guardian در فونیکس و میکروسرویس


#21

بله این حتما از router هست ببین به path درستی داری درخواست میدی

راستی برای ذخیره password از comeonin استفاده کن


#22

اومدم سام عزیز یک روتر جدید ساختم که از اون pipe_through در بیاد تا این مشکل اول حل بشه بعد بعد برم سمت اون پایپ ببنیم

الان یک چنین چیزی درست کردم

	def kab(conn, %{"token" => token}) do
		{:ok, claims} = ApiTrangell.Guardian.decode_and_verify(token)
		json conn, %Person{token: token}
	end

متاسفانه نمی شه claims رو چاپ کرد ارور ترمینال می گیرم. این نباید بعد از دی کد بیاد اون کدگذاری رو باز کنه بگه داخلش چی هست ؟


#23

اگر درست نباشه decode_and_verify
{error, any:}

میده

https://hexdocs.pm/guardian/Guardian.html#decode_and_verify/4


#24

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

من یک تغییری در کد دادم به کمک شما و hello رو چاپ کرد ولی claims رو نه . فکر کنم فقط این تابع می گه این ورفای هست یا نه ؟ چیزی رو از کدگذاری در نمی یاره درسته ؟

	def kab(conn, %{"token" => token}) do
		case ApiTrangell.Guardian.decode_and_verify(token) do
		  {:ok,claims} -> IO.puts "hello"

		  {:error, any} -> IO.puts "byby"	    
		end

		json conn, %Person{token: "test for test"}
		# IO.puts resource
	end

#25

claims که print نزدی به همین دلیل نشون نمیده

کده بالا update کردم دوباره نگاه کن


#26
		  {:error, any} ->  conn 
                    |> put_status(403) 
                    |> json  %{ error: "unauthorized"}

اینو تو fallback controller بگذاری ایده خوبیه

https://hexdocs.pm/phoenix/Phoenix.Controller.html#action_fallback/1


#27

صمیمانه ممنونم سام عزیز.

من این رو با IO.puts چاپ می خوام بکنم تو ترمینال ببنیم ارور می یاره که در سایت به کاربر می یاد
HTTP/1.1 500 Internal Server Error‍ نشون می ده. فکر کنم چون claims نداریم این ارور می ده چون از نوع ورفای چندین کد هست که می شه کاستوم کلایمز گزاشت.

اینجوری چاپ کردم

در مورد fallback controller هم ممنون فردا کامل متنشو می خونم چون نمی دونم اصلا چی هست

ممنون بخاطر یاداوری put_status(403) اصلا فراموش کرده بودم تشکر می کنم


#28

ببخشید من دیگه نتونستم ادامه بدم، فکر نمیکنم چیزی باقی مونده باشه که بگم.


#29

ممنون توماج جان همون حدی که فرمودید باعث شد بنده چندین چیز یاد بگیرم . مرحمت شما برای بنده و دیگر دوستان ثابت شده است . سعی کردم تک تک اینجا حل کردم بزارم منبعش به روز کنم در آخر بیام یک آموزش ازش بزنم


#30

البته باید بگم همشو سام عزیز حل کرد تا الان من چیزی حل نکردم @samdvr


#31

claims داده که درخواست فرستاده


#32

پس حتما قابل چاپ نیست که در ترمینال متاسفانه ارور می ده. یا من تابع رو اشتباه فهمیدم .

من هدفم این بود :

که کاربر اطلاعاتش کد کنه برای من بفرسته با پرویت کی و پایلیک کی . فکر کنم کلا پرتاب شدم تو باغ همسایه .چون این تابع تا اینجا که فهمیدم فقط می گه این توکن سالم هست یا خیر.


#33

حالا من سعی میکنم ی نمونه کار کنم با گاردین ولی اگه نشود در نهایت میتونی از کتابخانه JWT
Joken استفاده کنی


#34

مممنون سام عزیز .

برای مورد بالا فرمودید دیگه درسته ؟ منظور کدگذاری دو طرفه اطلاعات قبل از ارسال به سرور ؟ یا به صورت کامل در مورد کل api فرمودید ؟


#35

به صورت کامل جای گاردین


#36

تشکر . حالا بنده تا دو روزی روی این مورد تلاش می کنم . تاحالا بد جلو نرفته البته به کمک شما و دوستان دیگه که حسابی وقتتون گرفته شده .

کلا این ueberauth خیلی خوش آبدیت هست . نمی دونم کتابخونه بالا به امکاناتش برسه یا نه ؟ خیلی از بخش هاش موند من هنوز نرسیدم بخونم .

باز شما تجربتون در این زمینه بسیار زیاده .

بسیار لطف می کنید .


#37

سام عزیز من اومدم این مورد رو با مپ گرفتم نشون داد حداقل

json conn, %Person{token: Map.get(claims, "exp")}


#38

من منبع رو هم به روز کردم امید وارم بتونم تکمیل تر کنم . مشکلی پیش یاد اینجا حدمت دوستان می زارم ممنون

مشخصا این claims :

{:ok,
 %{"aud" => "api_trangell", "exp" => 1522057451, "iat" => 1519638251,
   "iss" => "api_trangell", "jti" => "b28b0437-e8ef-45ac-b4df-f197b0bc6f22",
   "nbf" => 1519638250, "sub" => "1", "typ" => "access"}}

من این اکسپایر رو هم برای تست تبدیل کردم

iex(7)> Map.get(claims, "exp") |> DateTime.from_unix
{:ok, #DateTime<2018-03-26 09:44:11Z>}

#39

درود @samdvr عزیز

من الان این موارد رو ردیف کردم با کمک شما البته آیا به چیز دیگه ای نیاز دارم :

۱. توکن رو می تونم بسازم و زمان زنده بودنشو مشخص کنم
۲. توکن رو می تونم verify کنم
۳. توکن رو می تونم رفرش کنم و توکن جدید بگیرم

مواردی که نتونستم :

۱. وقتی می یام توکن درست می کنم بر اساس userid بعد از دی کد کردن توکن بیام اون id رو از داخلش استخراج کنم حالا فقط آیدی نباشه مثلا بعد یک حرف توش بزارم


نکته : لازم به ذکر هست زمان توکن رو می گیرم و اگر انقضاش گذشته باشه جلوشو هم می گیرم . اینو فانکشن خودم نوشتم

۱. به نظرتون باز چیزی نیاز هست ؟
۲. یک سری فانکشن هایی برای کوکی و سشن داره مخصوصا قسمت پایپ لاین آیا اونا نیاز هست ؟ چون من تو فکرم بوده هر درخواست توکن رو بفرستم اگر ولید بود و تایم انقضاش نگذشته بود پس کاربر ی تونه به نتیجه دلخواهش برسه
۳. درخواست ارسال روی بستر https می باشد آیا نیازی به کدگذاری مجدد هست ؟

علاوه بر سوالات بالا یک سوالی برام پیش اومده :

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

۱. برای روشن شدن شما دایره قرمز رنگ رو لطفا ببنید اون یک سایت هست که خودش phoenix هست . یعنی قبل از ارسال به مربع API من توی خودش بیام CSRF فرم رو اجرا کنم و اگر درست بود برای API بفرستم ؟

۲. و اینکه من در دایره قرمز باید یک لایه لاگین درست کنم ؟ مثلا کوکی و … رو تنظیم کنم درسته ؟ یعنی تمام موارد باید روی اونم پیاده بشه قبل از ارسال و دریافت توکن درسته ؟

پیوست

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


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


این قطعه کد برای قسمت روتر هست در لینک زیر
https://hexdocs.pm/guardian/Guardian.Plug.Pipeline.html#content

متاسفانه وقتی فعال می کنمش توی روتر درخواست هام HTTP/1.1 401 Unauthorized می شه دقیقا نمی دونم چیجوری باید استفاده کنم . اصلا بهش نیاز دارم ؟ اصلا این راهی که من دارم می رم و هر درخواست دارم توکن می فرستم و بررسی می کنم انقضاشو و در دیتابیس و … اصلا نیازی به این مورد دارم یا خیر؟

defmodule MyApp.AuthPipeline do
  use Guardian.Plug.Pipeline, otp_app: :my_app,
                              module: MyApp.Tokens,
                              error_handler: MyApp.AuthErrorHandler

  plug Guardian.Plug.VerifySession, claims: @claims
  plug Guardian.Plug.VerifyHeader, claims: @claims, realm: "Bearer"
  plug Guardian.Plug.EnsureAuthenticated
  plug Guardian.Plug.LoadResource, ensure: true
end

یا مثلا این تابع را ببنید لطفا

	def sign_out(conn, _params) do
		conn
		|> ApiTrangell.Guardian.Plug.sign_out()
		|> send_resp(204, "")
	end

این تابع حذف کننده توکن هست ( چیزی که من فکر می کنم ) می یاد بر اساس سشن پاک می کنه ولی ما سشن نداریم تو موبایل پس هیچ وقت پیداشم نمی شه. یا در سایت دایره قرمز ما هر درخواست داریم با یک توکن ارسال می کنیم پس سشن یا کوکی وجود نداره که این اومده conn رو گرفته تا بده این تابع حذف کنه

شاید من دارم هدر اشتباه می دم لطفا به تصویر زیر نگاه کنید

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

قطعه کدش برای بررسی هدر به شرح زیر هست :

defmodule ApiTrangell.AuthPipeline do
  use Guardian.Plug.Pipeline, otp_app: :api_trangell,
                              module: ApiTrangell.Tokens,
                              error_handler: ApiTrangell.AuthErrorHandler

  plug Guardian.Plug.VerifySession, claims: %{typ: "refresh"}
  plug Guardian.Plug.VerifyHeader, claims: %{typ: "refresh"}, realm: "Bearer"
  plug Guardian.Plug.EnsureAuthenticated
  plug Guardian.Plug.LoadResource, ensure: true
end

ممکنه این ارور از این باشه که اصلا سشن fech نشده‌؟

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

منبع : https://hexdocs.pm/guardian/Guardian.Plug.VerifyHeader.html#content


با تشکر خواستم یک متن کامل از تمام مشکلاتم بنویسم و هر دفعه فهمیدم ویرایشش کنم تا کسی از اول شروع نکنه
ممنون و شرمنده بخاطر طولانی شدن متن


#40

سلام من در قسمت password 2 به “2” تغییر دادم و توکن الان درست میشه ولی با verifyheader هنوز مشکل داره چندتا کار کردم هنوز درست نشد حالا باید باز هم سعی کنم ببینم مشکلش چیه
Authorization تو header با Bearer: token دادم ولی هنوز کار نمیکنه