ورود با بازار در وب

 

با استفاده از این امکان، بدون نیاز به پیاده‌سازی فرآیند ورود کاربران، ارسال ایمیل یا پیامک، همیشه به کاربر خود دسترسی داشته باشید؛ دیگر نیازی به ارسال پیامک یا ایمیل برای authenticate کردن کاربر ندارید؛ همه چیز را به بازار بسپارید.

در مرحله‌ی اول ارائه این امکان، بازار به ازای هر کاربر برنامه/بازی، به شما یک user Id یکتا و پایدار می‌دهد. در آینده شما می‌توانید با دریافت permission از کاربر، به اطلاعات متفاوتی دسترسی داشته باشید.


ورود با بازار از پروتکل رسمی Oauth2 استفاده می‌کند. برای راه‌اندازی ورود با بازار در وب، مراحل زیر را طی کنید:

۱- مقادیر کلاینت‌آی‌دی <CLIENT_ID> و رمز <SECRET> خود را از پیشخان خود و بخش ورود با بازار دریافت کنید.

 

۲- کاربر را برای ورود با بازار به آدرس زیر هدایت کنید:

<https://cafebazaar.ir/user/oauth?redirect_url=<REDIRECT_URL>&client_id=<CLIENT_ID>&state=<STATE>

 

که <REDIRECT_URL> آدرس سرور وب شما است که پاسخ oauth را در مرحله‌ی بعدی به صورت escape شده تولید می‌کند و <CLIENT_ID> کلاینت‌آی‌دی شما در مرحله‌ی قبل است. پارامتر state یک مقدار دلخواه(عدد و حروف انگلیسی) است. مقداری که شما در این مرحله برای state تنظیم کنید، در مرحله‌ی بعدی به سمت شما بازگردانده می‌شود. جهت برخی ملاحظات امنیتی، شما باید به کمک این پارامتر اطمینان حاصل کنید که شروع‌کننده‌ی فرآیند لاگین، سرویس شما بوده است.

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

 

۳- بازار کاربر را به <REDIRECT_URL> هدایت می‌کند. در صورتی که کاربر بدون مشکل وارد حساب خود در بازار شده باشد و دسترسی لازم را داده باشد کاربر با auth code در query parameter به صورت escape شده به آدرس شما هدایت می‌شود و در غیر این صورت با یک query parameter دیگر و محتوای error به آدرس شما باز می‌گردد.

برای مثال:

http://redirect.url/somepath?code=<AUTH_CODE>&state=<STATE>

 

توجه کنید که آدرس <REDIRECT_URL> در پنل پیشخان باید ثبت شده باشد، در غیر این صورت، بازار از هدایت کاربر به <REDIRECT_URL> جلوگیری خواهد کرد. برای مشاهده و افزودن یا حذف کردن آدرس‌ها به پنل پیشخان برنامه خود و بخش ورود با بازار مراجعه کنید:

 

 

۴- با ایجاد یک درخواست POST (سمت سرور خود) و مقادیر ورودی زیر می‌توانید به access token و refresh token دست پیدا کنید.

 

Request Body:

grant_type=authorization_code&
code=<AUTH_CODE>&
client_id=<CLIENT_ID>&
client_secret=<SECRET>

 

Response:

{
   "access_token": <ACCESS_TOKEN>,
   "token_type": <TOKEN_TYPE>,
   "expires_in": 3600,
   "refresh_token": <REFRESH_TOKEN>
}

 

۵- حال برای دسترسی به APIی userinfo به آدرس زیر درخواست GET بزنید و Authorization Header را به صورت زیر بفرستید.

http://account.cafebazaar.ir/api/v0/userinfo

 

Header:

Authorization: <TOKEN_TYPE> <ACCESS_TOKEN>

برای مثال:

Authorization: Bearer GWObRK06KHLr8pCQzDXJ9hcDdSC3eV

۶- هر access token تنها برای مدت محدودی معتبر است. در صورتی که APIهای نیازمند Authorization به شما پاسخی حاوی کلید error و مقدار access_denied برگرداند یعنی access token شما منقضی شده است. پس از انقضای هر access token سرور شما می‌تواند با استفاده از refresh code دریافتی در مرحله ۴، access token جدیدی درخواست کند. برای این کار درخواستی از نوع POST به صورت زیر نیاز است:

http://account.cafebazaar.ir/api/v0/tokens/refresh

Request Body:

grant_type=refresh_token&
refresh_token=<REFRESH_TOKEN>

 

برای مثال:
به کد زیر که برای پایتون (و  با استفاده از فلسک به عنوان سرور) نوشته شده است توجه کنید:

import urllib
import flask
import requests
# Step 1
client_id = "CLIENT_ID"
secret = "SECRET"
redirect_url = "http://localhost:8000/"
# Step 2
print(f"https://cafebazaar.ir/user/oauth?redirect_url={redirect_url}"
      f"&client_id={client_id}")
# Step 3
app = flask.Flask(__name__)
@app.route('/')
def serve_hello():
   error = flask.request.args.get("error", '')
   auth_code = flask.request.args.get("code", '')
   if error or auth_code == '':
       return f"error returned {error}"
   # Step 4
   response = requests.post("https://account.cafebazaar.ir/api/v0/tokens", data={
       "grant_type": "authorization_code",
       "code": urllib.parse.unquote(auth_code),
       "client_id": client_id,
       "client_secret": secret,
   }, headers={'Content-Type': 'application/x-www-form-urlencoded'}
   ).json()
   access_token = response["access_token"]
   token_type = response["token_type"]
   refresh_token = response["refresh_token"]
   # Step 5
   response = requests.get("http://account.cafebazaar.ir/api/v0/userinfo", headers={
       "Authorization": f"{token_type} {access_token}"
   }).json()
   if response.get("error", '') == "access_denied":
       # Step 6
       response = requests.post("http://account.cafebazaar.ir/api/v0/tokens/refresh", data={
           "grant_type": "refresh_token",
           "refresh_token": refresh_token,
       }).json()
       access_token = response["access_token"]
       return f"new access token {access_token}"
   account_id = response["account_id"]
   return f"hello {account_id}"
if __name__ == '__main__':
   app.run(host='0.0.0.0', port=8000)