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


#62

204 اررور نیست
No Content Response

هر چیزی روی https رمزنگاری شدست, نیازی به رمزنگاری محتوای رمزنگاری شده نیست.


#63

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

ممنون از نظرت

یک چندتا مطلب پیدا کردم مثل :
https://blog.smartbear.com/apis/api-security-testing-how-to-hack-an-api-and-get-away-with-it-part-1-of-3/
https://blog.smartbear.com/apis/api-security-testing-how-to-hack-an-api-and-get-away-with-it-part-2-of-3/
https://blog.smartbear.com/readyapi/api-security-testing-how-to-hack-an-api-and-get-away-with-it-part-3-of-3/

هنوز نخوندمش کامل ببنیم چی می گند به زودی می خونمش


#64

دیکشنری روی token ؟
‘4e34a0fd93424320771cc48da5234f43fe3’

جایی که user و pass هست attempt limit بزاری بد نیست


#65

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


#66

اوکی پوزش میخوام


#67

من برای تست این کارو کردم

	def sign_out(conn, _params) do
		IO.inspect conn
		conn
		|> ApiTrangell.Guardian.Plug.sign_out()
		# |> send_resp(204, "")
		IO.puts "++++++++++++++++++++++++++"
		IO.inspect conn
		json conn, %{error: "you have an error"} 
	end

و من متوجه شدم اصلا انگار به سشن دسترسی نداره که حذفش کنه

من دو سه آموزش دیدم در این رابطه برای جی سان اصلا سشن نمی گیرند درسته ؟

  pipeline :api do
    plug :accepts, ["json"]
    plug Guardian.Plug.VerifyHeader
    plug Guardian.Plug.LoadResource
  end

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


#68

JWT تمام داده رو توسط secret در token میگذاره و نیازی به session نداره

https://jwt.io/ اینجا قسمته debugger ببین توسط secret
میتونی decode کنی jwt ببینی چه داده ای داره
داده payload باید تو claims بتونی پیدا کنی
مثلا چون تو claim داری

%{some: "claim"}

من این کد نوشتم در verify_token

IO.puts claims["some"]

CSRF بین website ها میگذران با IP مشخص برای mobile نمیشه همین token کافیه

status code
2xx موفقیت
redirect 3xx
4xx خطا client
5xx خطا server


#69

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

اول اومدم یک کد ES512 جنریت کردم با روش زیر :

JOSE.JWS.generate_key(%{"alg" => "ES512"}) |> JOSE.JWK.to_map |> elem(1) 

کد که بهم داد به صورت زیر زدم :
لازم به ذکر هست کد قبلی در کانفیگ تغییر دادم به کد زیر config.exs

config :api_trangell, ApiTrangell.Guardian,
  issuer: "api_trangell",
  allowed_algos: ["ES512"],
  secret_key: %{
    "alg" => "ES512",
    "crv" => "P-521",
    "d" => "5lzq86dlBivEqOmJj_6x_xW5lxY5bCAV1cxJ1Lt8fsshKAkHOz3j0iOF_ruG2PYXF69kDnY3HvSiY2tbog2UjBc",
    "kty" => "EC",
    "use" => "sig",
    "x" => "AIYZCBlSZ4jGvRHJnhWU_s85Uqu6Fl8F7TMMD1WjcibHIGIHfPjEwyfIdmAjvgMwKalqjhKIgqQEejvaPtxHwLMB",
    "y" => "AOogDP-U1x4VcgL0xUr7TEXc9FmQv3wvJ_goDW6ZJ_1PBebpOVltZP-3ydG1nAr-ddqoq9AFUQP9UhY3wQhvKFD_"
  }

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

user = %{id: "1", user: "shahryar"}
{:ok, token, _claims} = ApiTrangell.Guardian.encode_and_sign(user)

به هم یک توکن داد به شرح زیر :

eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhcGlfdHJhbmdlbGwiLCJleHAiOjE1MjIyNjAwMjksImlhdCI6MTUxOTg0MDgyOSwiaXNzIjoiYXBpX3RyYW5nZWxsIiwianRpIjoiNGE5MDViOTgtMmY1ZS00NmQ4LWE5MTctMzI0ZjExMWZkNDFiIiwibmJmIjoxNTE5ODQwODI4LCJzdWIiOiIxIiwidHlwIjoiYWNjZXNzIn0.AMWbimnV_dMskLcUKE98jW1qDZPRxosvtauvFbb2OVQEWJD-sQlcfvPA-HCrrfiAOpctdHw9gu-0BwRhartF3mNPAG86F91H4apUbroFFz2koAD9rJjPkwvDssAEBgvHaQmLlf4qHLMlJ0xdTot7HJ5GSogYJ7IuUP712tdbYpvIVUrN

حالا اومدم این رو در سایت https://jwt.io قرار دادم در دیباگرش ولی پایین ارور Invalid Signature می ده . نمی دونم چرا ؟
توکن دیفالت خود اولیه هم در داخلش ارور بالا رو می ده . ولی جالبه وقتی می یام می زارم در کنسول دیباگرش تمام مواردی که در توکن قرار دادم تا کد بشه رو نشون می ده

یک سوال دیگه :

ما باید از الگوریتم ES512 استفاده کنیم RS256 ؟

با تشکر از دوستان


#70


فقط HS256 یا RS256 دکد میکنه


#71

درود سام عزیز . امید وارم حالت خوب باشه .

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

  config :api_trangell, ApiTrangell.Guardian,
    issuer: "api_trangell",
    allowed_algos: ["HS256"],
    secret_key: %{
      "alg" => "HS256",
      "k" => "oi1T_d3HenJGPO1enhwAb7bUWaAtTMTfVi0LhkfnA0E",
      "kty" => "oct",
      "use" => "sig",
    }

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

شاید این قسمت رو باید پر کنم ؟
20 pm
ولی چی؟


#72

Secret خودتو باید بگذاری جای secret


#73

سام عزیز من کلا در فایل کانفیگم اینو دارم برای گاردین

  config :api_trangell, ApiTrangell.Guardian,
    issuer: "api_trangell",
    allowed_algos: ["HS256"],
    secret_key: %{
      "alg" => "HS256",
      "k" => "oi1T_d3HenJGPO1enhwAb7bUWaAtTMTfVi0LhkfnA0E",
      "kty" => "oct",
      "use" => "sig",
    }

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


#74
oi1T_d3HenJGPO1enhwAb7bUWaAtTMTfVi0LhkfnA0E

اینو بگذار جای سکرت


#75

ممنون سام عزیز. به جان خودم اینو من زده بودم کار نمی کرد :sweat_smile: الان زدم دیدم کار کرده.


#76

بعد از تغییر کانفیگ شاید ریستارت لازم باشه


#77

ریستارت می کردم ولی آخر شب شده باز من یک اشتباه مسخره کردم . :sweat_smile: نگم بهتره :grin:


#78

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

برای پرمیشن من اومدم یک فایل جدید درست کردم و گروه های کاربردی و دسترسی رو در اون قرار دادم :

defmodule ApiTrangell.Auth.Token do

  use Guardian, otp_app: :api_trangell,
                         permissions: %{
                         default: [:public_profile, :user_about_me],
                         user_actions: %{
                           books: 0b1,
                           fitness: 0b100,
                           music: 0b1000,
                         }
                       }

  use Guardian.Permissions.Bitwise

  # snip

  def build_claims(claims, _resource, opts) do
    claims =
      claims
      |> encode_permissions_into_claims!(Keyword.get(opts, :permissions))
    {:ok, claims}
  end
end

حالا در زمانی که دارم توکن ایجاد می کنم دسترسی هارو به کاربر می دم به صورت زیر :

{:ok, token, claims} = ApiTrangell.Guardian.encode_and_sign(user, %{some: "claim", userid: 2, admin: 2, pem: %{default: [:public_profile], user_actions: [:books]}}, token_type: "access",ttl: {99, :weeks})

حالا می شه به راحتی اومد و به صورت زیر اون رو مقایسه کرد آیا ولید هست یا خیر؟

claims |> ApiTrangell.Auth.Token.decode_permissions_from_claims |> ApiTrangell.Auth.Token.all_permissions?(%{default: [:public_profile], user_actions: [:books]})

خوشبختانه این داخل فانکشن هیچ مشکلی در اون نیست و جواب گو هست ولی در زمان استفاده از پایپ لاین متاسفانه این مشکل وجود داره و در کل پیغام {"message":"unauthorized"} می ده .

این کدی هست که به پایپ لاین به صورت پلاگ اضافه شده

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

منبع : https://hexdocs.pm/guardian/Guardian.Permissions.Bitwise.html#content

شما فکر می کنید مشکل از چی هست که پایپ لاین نمی تونه این رو ولید کنه ؟

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

یک نکنه در لینک بالا هست

# After a pipeline has setup the implementation module and error handler

گفتم قرار بدم شما هم بهش توجه کنید

با تشکر

پیوست

در منبعم آخرین به روز رسانی رو کامیت کردم


#79

Books fitness music
جزو api هستن که آنها را whitelist کردین؟


#80

درود سام عزیز.

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

https://hexdocs.pm/guardian/Guardian.Permissions.Bitwise.html#content

نکته : لازم به ذکر هست که من اومدم در دسترسی اسم books رو قرار دادم ولی برای تست در توکنم بجای اون گفتم book بعد اومدم ولید کنم بهم ارور داد و گفت اصلا book تعریف نشده .

فکر می کنم همون معنی whitelist شما فرمودید رو می ده


#81

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

گفتم اینجا هم قرار بدم . شاید دوستان متوجه صحبت این بنده خدا شده باشند