با درود خدمت دوستان . برای امن سازی لاگین وم همینطور دریافت اطلاعات می خوام از Guardian
استفاده کنم بر طبق یک آموزشی هم اون رو کانفیگ کردم که چندتا سوال برای پیش اومده .
من اومدم یک کنترلر ساختم به نام GuardianDemoWeb.UserController
و کد زیر رو برای لاگین قرار دادم
def sign_in(conn, %{"password" => "password"}) do
user = %{id: "1"}
# اینجا مکان دریافت یوزر و پسورد از دیتابیس هست
conn
|> GuardianDemo.Guardian.Plug.sign_in(user)
|> send_resp(204, "")
end
چون می خوام تست کنم فعلنه یوزر و پسورد رو اومدم دستی زدم . یک کامنت هم بالا قرار دادم . پس اینطور که من متوجه شدم می یاییم . به این صورت اقدام می کنیم
def sign_in(conn, %{"password" => "password"}) do
user = %{id: "1"}
# اگر در دیتابیس پسورد و یوزر درست بود حالا اجازه بده ادامه مسیر انجام بشه و به وسیله یوزر توکن درست بشه
conn
|> GuardianDemo.Guardian.Plug.sign_in(user)
|> send_resp(204, "")
end
حالا می یام درخواست با پست ارسال می کنم چون تو روتر هم پست اجرا کردم . بازخورد کد به شرح زیر هست :
HTTP/1.1 204 No Content
Set-Cookie: _guardian_demo_key=SFMyNTY.g3QAAAABbQAAABZndWFyZGlhbl9kZWZhdWx0X3Rva2VubQAAAVpleUpoYkdjaU9pSklVelV4TWlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKaGRXUWlPaUpuZFdGeVpHbGhibDlrWlcxdklpd2laWGh3SWpveE5USXhPVGMwTnpFd0xDSnBZWFFpT2pFMU1UazFOVFUxTVRBc0ltbHpjeUk2SW1kMVlYSmthV0Z1WDJSbGJXOGlMQ0pxZEdraU9pSmtNbVJtTkdJeU1pMDBPVEl5TFRSaVl6a3RZalZpT1MweU1ETmtOVGN3TVdNeVlXVWlMQ0p1WW1ZaU9qRTFNVGsxTlRVMU1Ea3NJbk4xWWlJNklqRWlMQ0owZVhBaU9pSmhZMk5sYzNNaWZRLjJMN095WEJWTE5mUWhwbEVkWE9LVXJFQnhXZml3Y2QzQVFqcDZPcDlkSHpMVkppSEJxenk3TzlCU3NITnMyME50V0g2cDRxRnVVTTRtdk5JUmxlZnpB.5uceSC3Qmysp4gqCzJVoYIuyoY6VsM1dHzP6JLz5hX4; path=/; HttpOnly
Server: Cowboy
Date: Sun, 25 Feb 2018 10:45:10 GMT
Content-Length: 0
Cache-Control: max-age=0, private, must-revalidate
x-request-id: akbgpcj33673q48cuagokn2r953q1lh4
در کد بالا اومده _guardian_demo_key
یک چنین چیزی داده فکر کنم توکن هست درسته ؟
تا اینجا اگر درست گفتم پس من مرحله ساخت توکن رو انجام دادم و اگر مشکلی هست بر اساس کامنت هایی که تو کد قرار دادم بفرمایید ویرایش کنم.
مرحله بعدی می ریم سمت اینکه ببنیم واقعا ما کی هستیم ؟
من بر اساس آموزش کدی رو زدم در کنترلرم به شرح زیر :
def show(conn, params) do
user = GuardianDemo.Guardian.Plug.current_resource(conn)
send_resp(conn, 200, Poison.encode!(%{user: user}))
end
متاسفانه در این بخش من مشکل دارم در آموزش توکنی که در بالا گرفته شد اصلا ارسال نشده در هر درخواست که بگه من کیم . و منم آدرس رو یک گت ارسال کردم دیدم بهم این ارور داده
HTTP/1.1 401 Unauthorized
Server: Cowboy
Date: Sun, 25 Feb 2018 10:50:23 GMT
Content-Length: 31
Cache-Control: max-age=0, private, must-revalidate
x-request-id: hohpa0sibj08g03j22dar6s9gjuse5pr
و بدنه ارور نیز به شرح زیر :
{"message":"no_resource_found"}
تا اینجا با یک مشکل پیش رفتیم و سر آخر می مونه دو رویداد یکی چک کردن دیتابیس که آیا این توکن با یوزری که کاربر می فرسته یکی هست که خوب از دیتابیس می گیره و می یاره یا می تونیم از ردیس استفاده کنیم که هی از دیتابیس نگیره چون باید هر چند ساعت یا دقیقه پاک بشه توکن می مونه خروج از سایت
برای خروج از سایت نیز اومده این آموزش
def sign_out(conn, _params) do
conn
|> GuardianDemo.Guardian.Plug.sign_out()
|> send_resp(204, "")
end
رو زده ولی بازم متاسفانه در اینجا نیومده به این فانکشن بگه توکن من اینه ؟ که اون توکن رو بیاد و از بین ببره در کل من فکر می کنم این آموزش یا من اشتباه متوجه شدم یا ناقص کاملا
لینک آموزش :
هدف :
هدف من اینکه اول لاگین کنم یوزر و پسوردم در بانک اطلاعاتی چک بشه اگر اوکی بود به من یک توکن بده من روی موبایلم توکن رو جایی ذخیره کنم یا روی ری اکتم توی کدم ذخیره کنم یا کوکیش کنم این توکن رو و هر درخواستی که می خوام بفرستم مثل اینکه آخرین موزیک هارو بهم نشون بده این توکن بفرستم اگر برای گروه کاربری من بود و توکن درست بود برام اطلاعات رو چاپ کنه
سوال در مورد میکروسرویس :
آیا این مراحل ساخت توکن باید در دروازه api شکل بگیره و توکن درست بشه یا باید در میکروسرویس user مثلا شکل بگیره ؟ ای پی آی گیت وی فقط باید پروکسی باشه یا اینکارا رو باید خودش انجام بده ؟