شما در حال مشاهده اسناد Apigee Edge هستید.
به مستندات Apigee X بروید . اطلاعات
چی
OAuthV2 یک سیاست چند وجهی برای انجام عملیات نوع کمک هزینه OAuth 2.0 است. این خطمشی اصلی است که برای پیکربندی نقاط پایانی OAuth 2.0 در Apigee Edge استفاده میشود.
نکته: اگر میخواهید درباره OAuth در Apigee Edge اطلاعات بیشتری کسب کنید، به صفحه اصلی OAuth مراجعه کنید. پیوندهایی به منابع، نمونه ها، ویدیوها و موارد دیگر ارائه می دهد. نمونه OAuth پیشرفته را در GitHub برای نشان دادن نحوه استفاده از این خط مشی در یک برنامه کاربردی مشاهده کنید.
نمونه ها
VerifyAccessToken
VerifyAccessToken
این پیکربندی خط مشی OAuthV2 (با عملیات VerifyAccessToken) تأیید می کند که یک نشانه دسترسی ارسال شده به Apigee Edge معتبر است. هنگامی که این عملیات خط مشی راه اندازی می شود، Edge به دنبال یک نشانه دسترسی معتبر در درخواست می گردد. اگر رمز دسترسی معتبر باشد، درخواست اجازه ادامه دارد. اگر نامعتبر باشد، تمام پردازش متوقف می شود و یک خطا در پاسخ باز می گردد.
<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuth-v20-2"> <DisplayName>OAuth v2.0 2</DisplayName> <Operation>VerifyAccessToken</Operation> <AccessTokenPrefix>Bearer</AccessTokenPrefix> <!-- Optional, default is Bearer --> </OAuthV2>
توجه: فقط توکنهای حامل OAuth 2.0 پشتیبانی میشوند. کدهای احراز هویت پیام (MAC) پشتیبانی نمی شوند.
به عنوان مثال:
$ curl -H "Authorization: Bearer ylSkZIjbdWybfsUQe9BqP0LH5Z" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282
به طور پیشفرض، Edge توکنهای دسترسی را در هدر Authorization
با پیشوند Bearer
میپذیرد. می توانید این پیش فرض را با عنصر <AccessToken>
تغییر دهید.
GenerateAccessToken
تولید نشانه های دسترسی
برای مثالهایی که نحوه درخواست نشانههای دسترسی را برای هر یک از انواع کمکهای پشتیبانی شده نشان میدهند، به درخواست نشانههای دسترسی و کدهای مجوز مراجعه کنید. موضوع شامل نمونه هایی از این عملیات است:
GenerateAuthorizationCode
کد مجوز را ایجاد کنید
برای مثالهایی که نحوه درخواست کدهای مجوز را نشان میدهند، به درخواست کد مجوز مراجعه کنید.
RefreshAccessToken
یک نشانه دسترسی را بازخوانی کنید
برای مثالهایی که نحوه درخواست نشانههای دسترسی با استفاده از نشانه تازهسازی را نشان میدهند، به بازخوانی نشانه دسترسی مراجعه کنید.
نشانه جریان پاسخ
یک نشانه دسترسی در جریان پاسخ ایجاد کنید
گاهی اوقات ممکن است لازم باشد یک نشانه دسترسی در جریان پاسخ ایجاد کنید. به عنوان مثال، ممکن است این کار را در پاسخ به برخی از اعتبارسنجی سفارشی انجام شده در یک سرویس پشتیبان انجام دهید. در این مثال، مورد استفاده هم به یک نشانه دسترسی و هم به یک نشانه تازه نیاز دارد که نوع اعطای ضمنی را رد می کند. در این مورد، ما از نوع اعطای رمز عبور برای تولید توکن استفاده خواهیم کرد. همانطور که خواهید دید، ترفند انجام این کار این است که یک سرصفحه درخواست مجوز را با یک خط مشی جاوا اسکریپت ارسال کنید.
ابتدا، بیایید به سیاست نمونه نگاه کنیم:
<OAuthV2 enabled="true" continueOnError="false" async="false" name="generateAccessToken"> <Operation>GenerateAccessToken</Operation> <AppEndUser>Doe</AppEndUser> <UserName>jdoe</UserName> <PassWord>jdoe</PassWord> <GrantType>grant_type</GrantType> <ClientId>a_valid_client_id</ClientId> <SupportedGrantTypes> <GrantType>password</GrantType> </SupportedGrantTypes> </OAuthV2>
اگر این خطمشی را روی جریان پاسخ قرار دهید، با خطای 401 UnAuthorized با وجود اینکه پارامترهای ورود صحیح در خطمشی مشخص شدهاند، با خطا مواجه میشود. برای حل این مشکل، باید یک هدر درخواست مجوز تنظیم کنید.
سرصفحه مجوز باید شامل یک طرح دسترسی پایه با Client_id:client_secret کدگذاری شده با Base64 باشد.
میتوانید این هدر را با یک خطمشی جاوا اسکریپت که درست قبل از خطمشی OAuthV2 قرار داده شده است، اضافه کنید. متغیرهای "local_clientid" و "local_secret" باید قبلاً تنظیم شده و در جریان موجود باشند:
var client_id = context.getVariable("local_clientid"); var client_secret = context.getVariable("local_secret"); context.setVariable("request.header.Authorization","Basic "+CryptoJS.enc.Base64.stringify(CryptoJS.enc.Latin1 .parse(client_id + ':' + client_secret)));
همچنین به " رمزگذاری اعتبارنامه های اصلی احراز هویت " مراجعه کنید.
مرجع عنصر
مرجع خط مشی عناصر و ویژگی های خط مشی OAuthV2 را توصیف می کند.
سیاست نمونه نشان داده شده در زیر یکی از بسیاری از تنظیمات ممکن است. این نمونه یک خط مشی OAuthV2 را نشان می دهد که برای عملیات GenerateAccessToken پیکربندی شده است. این شامل عناصر مورد نیاز و اختیاری است. برای جزئیات بیشتر به توضیحات عنصر در این بخش مراجعه کنید.
<OAuthV2 name="GenerateAccessToken"> <!-- This policy generates an OAuth 2.0 access token using the client_credentials grant type --> <Operation>GenerateAccessToken</Operation> <!-- This is in millseconds, so expire in an hour --> <ExpiresIn>3600000</ExpiresIn> <SupportedGrantTypes> <GrantType>client_credentials</GrantType> </SupportedGrantTypes> <GrantType>request.queryparam.grant_type</GrantType> <GenerateResponse/> </OAuthV2>
ویژگی های <OAuthV2>
<OAuthV2 async="false" continueOnError="false" enabled="true" name="MyOAuthPolicy">
جدول زیر ویژگی هایی را توصیف می کند که برای همه عناصر اصلی خط مشی مشترک هستند:
صفت | توضیحات | پیش فرض | حضور |
---|---|---|---|
name | نام داخلی سیاست. مقدار مشخصه در صورت تمایل، از عنصر | N/A | مورد نیاز |
continueOnError | برای بازگرداندن خطا در صورت شکست خط مشی، روی روی | نادرست | اختیاری |
enabled | برای اجرای خط مشی روی برای خاموش کردن خط مشی، روی | درست است | اختیاری |
async | این ویژگی منسوخ شده است. | نادرست | منسوخ شده است |
عنصر <DisplayName>
علاوه بر ویژگی name
برای برچسبگذاری خطمشی در ویرایشگر پروکسی رابط کاربری مدیریت با نامی متفاوت و به زبان طبیعی، از آن استفاده کنید.
<DisplayName>Policy Display Name</DisplayName>
پیش فرض | N/A اگر این عنصر را حذف کنید، از مقدار ویژگی |
---|---|
حضور | اختیاری |
تایپ کنید | رشته |
عنصر <AccessToken>
<AccessToken>request.header.access_token</AccessToken>
به طور پیش فرض، VerifyAccessToken انتظار دارد که نشانه دسترسی در سربرگ Authorization
ارسال شود. با استفاده از این عنصر می توانید آن پیش فرض را تغییر دهید. به عنوان مثال request.queryparam.access_token
نشان می دهد که نشانه دسترسی باید به عنوان یک پارامتر پرس و جو به نام access_token
وجود داشته باشد.
<AccessToken>request.header.access_token</AccessToken>
مشخص شده است:curl https://myorg-myenv.apigee.net/oauth2/validate -H "access_token:Rft3dqrs56Blirls56a"
<AccessToken>request.queryparam.access_token</AccessToken>
مشخص شده است:curl "https://myorg-myenv.apigee.net/oauth2/validate?access_token:Rft3dqrs56Blirls56a"
پیش فرض: | N/A |
حضور: | اختیاری |
نوع: | رشته |
مورد استفاده با عملیات: |
|
عنصر <AccessTokenPrefix>
<AccessTokenPrefix>Bearer</AccessTokenPrefix>
بهطور پیشفرض، VerifyAccessToken انتظار دارد که نشانه دسترسی در یک سرصفحه مجوز بهعنوان یک توکن حامل ارسال شود. به عنوان مثال:
-H "Authorization: Bearer Rft3dqrs56Blirls56a"
در حال حاضر، Bearer تنها پیشوند پشتیبانی شده است.
پیش فرض: | حامل |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | حامل |
مورد استفاده با عملیات: |
|
عنصر <AppEndUser>
<AppEndUser>request.queryparam.app_enduser</AppEndUser>
در مواردی که شناسه کاربر نهایی برنامه باید به سرور مجوز ارسال شود، این عنصر به شما امکان میدهد مشخص کنید که Edge کجا باید برای شناسه کاربر نهایی جستجو کند. به عنوان مثال، می تواند به عنوان یک پارامتر پرس و جو یا در یک هدر HTTP ارسال شود.
برای مثال request.queryparam.app_enduser
نشان میدهد که AppEndUser باید بهعنوان یک پارامتر پرس و جو وجود داشته باشد، به عنوان مثال، ?app_enduser=ntesla@theramin.com
. به عنوان مثال، برای نیاز به AppEndUser در هدر HTTP، این مقدار را روی request.header.app_enduser
تنظیم کنید.
ارائه این تنظیم به شما امکان می دهد شناسه کاربر نهایی برنامه را در نشانه دسترسی قرار دهید. اگر میخواهید بتوانید نشانههای دسترسی OAuth 2.0 را با شناسه کاربر نهایی بازیابی یا لغو کنید، این ویژگی مفید است. برای اطلاعات بیشتر، به فعال کردن بازیابی و لغو نشانههای دسترسی OAuth 2.0 با شناسه کاربر نهایی، شناسه برنامه یا هر دو مراجعه کنید.
پیش فرض: | N/A |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | هر متغیر جریان قابل دسترسی به سیاست در زمان اجرا. |
مورد استفاده با انواع کمک هزینه: |
|
<ویژگی ها/ویژگی>
<Attributes> <Attribute name="attr_name1" ref="flow.variable" display="true|false">value1</Attribute> <Attribute name="attr_name2" ref="flow.variable" display="true|false">value2</Attribute> </Attributes>
از این عنصر برای افزودن ویژگی های سفارشی به کد دسترسی یا کد مجوز استفاده کنید. برای مثال، ممکن است بخواهید یک شناسه کاربری یا شناسه جلسه را در یک نشانه دسترسی جاسازی کنید که در زمان اجرا قابل استخراج و بررسی باشد.
این عنصر به شما امکان می دهد مقداری را در یک متغیر جریان یا از یک رشته واقعی تعیین کنید. اگر هم متغیر و هم رشته را مشخص کنید، از مقدار مشخص شده در متغیر جریان استفاده می شود. اگر متغیر قابل حل نباشد، رشته پیش فرض است.
برای اطلاعات بیشتر در مورد استفاده از این عنصر، به سفارشی کردن رمزها و کدهای مجوز مراجعه کنید.
نمایش یا پنهان کردن ویژگی های سفارشی در پاسخ
به یاد داشته باشید که اگر عنصر GenerateResponse این خطمشی را روی true تنظیم کنید، نمایش کامل JSON نشانه در پاسخ، از جمله هر ویژگی سفارشی که تنظیم کردهاید، برگردانده میشود. در برخی موارد، ممکن است بخواهید برخی یا همه ویژگیهای سفارشی خود را در پاسخ پنهان کنید تا برای برنامههای مشتری قابل مشاهده نباشند.
به طور پیش فرض، ویژگی های سفارشی در پاسخ ظاهر می شوند. اگر می خواهید آنها را مخفی کنید، می توانید پارامتر نمایش را روی false تنظیم کنید. به عنوان مثال:
<Attributes> <Attribute name="employee_id" ref="employee.id" display="false"/> <Attribute name="employee_name" ref="employee.name" display="false"/> </Attributes>
مقدار صفت display
ثابت نیست. فرض کنید یک نشانه دسترسی با ویژگی های سفارشی ایجاد می کنید که می خواهید در پاسخ تولید شده پنهان کنید. تنظیم display=false
این هدف را محقق می کند. با این حال، اگر یک نشانه دسترسی جدید بعداً با استفاده از یک نشانه تازهسازی ایجاد شود، ویژگیهای سفارشی اصلی از نشانه دسترسی در پاسخ نشانه تازهسازی نشان داده میشوند. این به این دلیل است که Edge به خاطر نمیآورد که ویژگی display
در اصل در خطمشی ایجاد نشانه دسترسی روی false
تنظیم شده بود - ویژگی سفارشی به سادگی بخشی از ابرداده نشانه دسترسی است.
اگر ویژگیهای سفارشی را به کد مجوز اضافه کنید، همین رفتار را خواهید دید - وقتی یک نشانه دسترسی با استفاده از آن کد ایجاد میشود، آن ویژگیهای سفارشی در پاسخ نشانه دسترسی نشان داده میشوند. باز هم، ممکن است این رفتار مورد نظر شما نباشد.
برای پنهان کردن ویژگی های سفارشی در این موارد، این گزینه ها را دارید:
- مشخصاً ویژگیهای سفارشی را در خطمشی توکن تازهسازی بازنشانی کنید و نمایش آنها را روی false تنظیم کنید. در این مورد، ممکن است لازم باشد مقادیر سفارشی اصلی را از توکن دسترسی اصلی با استفاده از خط مشی GetOAuthV2Info بازیابی کنید.
- از یک خط مشی جاوا اسکریپت پس پردازش برای استخراج دستی هر ویژگی سفارشی که نمی خواهید در پاسخ مشاهده کنید استفاده کنید.
همچنین به سفارشی کردن رمزها و کدهای مجوز مراجعه کنید.
پیش فرض: | |
حضور: | اختیاری |
مقادیر معتبر: |
|
مورد استفاده با انواع کمک هزینه: |
|
عنصر <ClientId>
<ClientId>request.formparam.client_id</ClientId>
در چندین مورد، برنامه مشتری باید شناسه مشتری را به سرور مجوز ارسال کند. این عنصر مشخص می کند که Apigee باید به دنبال شناسه مشتری در متغیر جریان request.formparam.client_id
باشد. تنظیم ClientId
روی متغیر دیگری پشتیبانی نمی شود. همچنین به درخواست رمزهای دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | request.formparam.client_id (یک x-www-form-urlencoded و مشخص شده در بدنه درخواست) |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | متغیر جریان: request.formparam.client_id |
مورد استفاده با انواع کمک هزینه: |
همچنین می تواند با عملیات GenerateAuthorizationCode استفاده شود. |
عنصر <Code>
<Code>request.queryparam.code</Code>
در جریان نوع اعطای مجوز، مشتری باید یک کد مجوز را به سرور مجوز (Apigee Edge) ارسال کند. این عنصر به شما امکان می دهد مشخص کنید که Edge کجا باید به دنبال کد مجوز باشد. به عنوان مثال، می تواند به عنوان یک پارامتر پرس و جو، هدر HTTP یا پارامتر فرم (پیش فرض) ارسال شود.
متغیر request.queryparam.auth_code
نشان می دهد که کد مجوز باید به عنوان یک پارامتر پرس و جو وجود داشته باشد، به عنوان مثال، ?auth_code=AfGlvs9
. به عنوان مثال، برای نیاز به کد مجوز در هدر HTTP، این مقدار را روی request.header.auth_code
تنظیم کنید. همچنین به درخواست رمزهای دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | request.formparam.code (یک x-www-form-urlencode و مشخص شده در بدنه درخواست) |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | هر متغیر جریان قابل دسترسی به سیاست در زمان اجرا |
مورد استفاده با انواع کمک هزینه: | مجوز_کد |
عنصر <ExpiresIn>
<ExpiresIn>10000</ExpiresIn>
زمان انقضای رمزهای دسترسی و کدهای مجوز را در میلی ثانیه اعمال می کند. (برای نشانههای تازهسازی، از <RefreshTokenExpiresIn>
استفاده کنید.) مقدار زمان انقضا یک مقدار تولید شده توسط سیستم به اضافه مقدار <ExpiresIn>
است. اگر <ExpiresIn>
روی -1 تنظیم شود، رمز یا کد مطابق حداکثر انقضای نشانه دسترسی OAuth منقضی می شود. اگر <ExpiresIn>
مشخص نشده باشد، سیستم یک مقدار پیش فرض پیکربندی شده در سطح سیستم را اعمال می کند.
زمان انقضا همچنین می تواند در زمان اجرا با استفاده از یک مقدار سخت کدگذاری شده و پیش فرض یا با ارجاع به یک متغیر جریان تنظیم شود. برای مثال، میتوانید یک مقدار انقضای رمز را در یک نقشه ارزش کلید ذخیره کنید، آن را بازیابی کنید، آن را به یک متغیر اختصاص دهید و در خطمشی به آن ارجاع دهید. برای مثال، kvm.oauth.expires_in
.
با Apigee Edge for Public Cloud ، Edge موجودیت های زیر را حداقل 180 ثانیه پس از دسترسی به موجودیت ها در حافظه پنهان نگه می دارد.
- نشانه های دسترسی OAuth. این بدان معنی است که یک توکن باطل شده ممکن است تا سه دقیقه، تا زمانی که محدودیت حافظه پنهان آن منقضی شود، موفق باشد.
- نهادهای سرویس مدیریت کلید (KMS) (برنامهها، توسعهدهندگان، محصولات API).
- ویژگی های سفارشی در توکن های OAuth و موجودیت های KMS.
بند زیر یک متغیر جریان و یک مقدار پیش فرض را نیز مشخص می کند. توجه داشته باشید که مقدار متغیر جریان بر مقدار پیش فرض مشخص شده اولویت دارد.
<ExpiresIn ref="kvm.oauth.expires_in"> 3600000 <!--default value in milliseconds--> </ExpiresIn>
Edge از راهی برای اجبار به انقضای توکن پس از ایجاد آن پشتیبانی نمی کند. اگر به اجبار انقضای توکن نیاز دارید (مثلاً بر اساس یک شرط)، یک راه حل ممکن در این پست انجمن Apigee توضیح داده شده است.
به طور پیش فرض، توکن های دسترسی منقضی شده به طور خودکار 3 روز پس از انقضا از سیستم Apigee Edge پاک می شوند. همچنین پاک کردن نشانه های دسترسی را ببینید
Private Cloud: برای نصب Edge برای Private Cloud، مقدار پیشفرض توسط ویژگی conf_keymanagement_oauth_auth_code_expiry_time_in_millis
تنظیم میشود. برای تنظیم این ویژگی:
- فایل
message-processor.properties
را در یک ویرایشگر باز کنید. اگر فایل وجود ندارد، آن را ایجاد کنید:vi /opt/apigee/customer/application/message-processor.properties
- ویژگی را به صورت دلخواه تنظیم کنید:
conf_keymanagement_oauth_auth_code_expiry_time_in_millis=3600000
- مطمئن شوید که فایل خواص متعلق به کاربر "apigee" است:
chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- پردازشگر پیام را مجددا راه اندازی کنید.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
پیش فرض: | اگر مشخص نشده باشد، سیستم یک مقدار پیش فرض پیکربندی شده در سطح سیستم را اعمال می کند. |
حضور: | اختیاری |
نوع: | عدد صحیح |
مقادیر معتبر: |
|
مورد استفاده با انواع کمک هزینه: |
همچنین با عملیات GenerateAuthorizationCode استفاده می شود. |
عنصر <ExternalAccessToken>
<ExternalAccessToken>request.queryparam.external_access_token</ExternalAccessToken>
به Apigee Edge میگوید کجا یک توکن دسترسی خارجی پیدا کند (یک نشانه دسترسی که توسط Apigee Edge تولید نشده است).
متغیر request.queryparam.external_access_token
نشان می دهد که نشانه دسترسی خارجی باید به عنوان یک پارامتر پرس و جو وجود داشته باشد، به عنوان مثال، ?external_access_token=12345678
. به عنوان مثال، برای نیاز به نشانه دسترسی خارجی در یک هدر HTTP، این مقدار را روی request.header.external_access_token
تنظیم کنید. همچنین به استفاده از نشانه های OAuth شخص ثالث مراجعه کنید.
عنصر <ExternalAuthorization>
<ExternalAuthorization>true</ExternalAuthorization>
اگر این عنصر نادرست باشد یا وجود نداشته باشد، Edge به طور معمول client_id و client_secret را در برابر فروشگاه مجوز Apigee Edge اعتبار میدهد. زمانی که می خواهید با توکن های OAuth شخص ثالث کار کنید از این عنصر استفاده کنید. برای جزئیات بیشتر در مورد استفاده از این عنصر، به استفاده از توکن های OAuth شخص ثالث مراجعه کنید.
پیش فرض: | نادرست |
حضور: | اختیاری |
نوع: | بولی |
مقادیر معتبر: | درست یا نادرست |
مورد استفاده با انواع کمک هزینه: |
|
عنصر <ExternalAuthorizationCode>
<ExternalAuthorizationCode>request.queryparam.external_auth_code</ExternalAuthorizationCode>
به Apigee Edge میگوید کجا میتواند یک کد تأیید خارجی پیدا کند (کد تأییدی که توسط Apigee Edge تولید نشده است).
متغیر request.queryparam.external_auth_code
نشان می دهد که کد اعتبار خارجی باید به عنوان یک پارامتر پرس و جو وجود داشته باشد، به عنوان مثال، ?external_auth_code=12345678
. به عنوان مثال، برای نیاز به کد تأیید خارجی در سرصفحه HTTP، این مقدار را روی request.header.external_auth_code
تنظیم کنید. همچنین به استفاده از نشانه های OAuth شخص ثالث مراجعه کنید.
عنصر <ExternalRefreshToken>
<ExternalRefreshToken>request.queryparam.external_refresh_token</ExternalRefreshToken>
به Apigee Edge میگوید کجا یک توکن بهروزرسانی خارجی پیدا کند (یک توکن تازهسازی که توسط Apigee Edge تولید نشده است).
متغیر request.queryparam.external_refresh_token
نشان می دهد که نشانه refresh خارجی باید به عنوان یک پارامتر پرس و جو وجود داشته باشد، به عنوان مثال، ?external_refresh_token=12345678
. به عنوان مثال، برای نیاز به کد بازخوانی خارجی در سرصفحه HTTP، این مقدار را روی request.header.external_refresh_token
تنظیم کنید. همچنین به استفاده از نشانه های OAuth شخص ثالث مراجعه کنید.
عنصر <GenerateResponse>
<GenerateResponse enabled='true'/>
اگر روی true
تنظیم شود، این خطمشی پاسخی را ایجاد کرده و برمیگرداند. به عنوان مثال، برای GenerateAccessToken، پاسخ ممکن است مانند:
{ "issued_at" : "1467841035013", "scope" : "read", "application_name" : "e31b8d06-d538-4f6b-9fe3-8796c11dc930", "refresh_token_issued_at" : "1467841035013", "status" : "approved", "refresh_token_status" : "approved", "api_product_list" : "[Product1, nhl_product]", "expires_in" : "1799", "developer.email" : "edward@slalom.org", "token_type" : "BearerToken", "refresh_token" : "rVSmm3QaNa0xBVFbUISz1NZI15akvgLJ", "client_id" : "Adfsdvoc7KX5Gezz9le745UEql5dDmj", "access_token" : "AnoHsh2oZ6EFWF4h0KrA0gC5og3a", "organization_name" : "cerruti", "refresh_token_expires_in" : "0", "refresh_count" : "0" }
در صورت false
بودن، پاسخی ارسال نمی شود. در عوض، مجموعه ای از متغیرهای جریان با مقادیر مربوط به عملکرد خط مشی پر می شوند. به عنوان مثال، یک متغیر جریان به نام oauthv2authcode.OAuthV2-GenerateAuthorizationCode.code
با کد تأیید جدید ساخته شده پر می شود. توجه داشته باشید که expires_in بر حسب ثانیه در پاسخ بیان می شود.
پیش فرض: | نادرست |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | درست یا نادرست |
مورد استفاده با انواع کمک هزینه: |
|
عنصر <GenerateErrorResponse>
<GenerateErrorResponse enabled='true'/>
اگر روی true
تنظیم شود، در صورتی که ویژگی ContinueOnError روی true تنظیم شود، این خطمشی پاسخی ایجاد میکند و برمیگرداند. اگر false
(پیشفرض)، پاسخی ارسال نمیشود. در عوض، مجموعه ای از متغیرهای جریان با مقادیر مربوط به عملکرد خط مشی پر می شوند.
پیش فرض: | نادرست |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | درست یا نادرست |
مورد استفاده با انواع کمک هزینه: |
|
<GrantType>
<GrantType>request.queryparam.grant_type</GrantType>
به خطمشی میگوید که پارامتر نوع کمک مالی را که در یک درخواست ارسال میشود، کجا پیدا کند. طبق مشخصات OAuth 2.0، نوع کمک هزینه باید با درخواستهایی برای نشانههای دسترسی و کدهای مجوز ارائه شود. متغیر می تواند یک هدر، پارامتر پرس و جو یا پارامتر فرم (پیش فرض) باشد.
به عنوان مثال request.queryparam.grant_type
نشان می دهد که رمز عبور باید به عنوان یک پارامتر جستجو وجود داشته باشد، به عنوان مثال، ?grant_type=password
. به عنوان مثال، برای نیاز به نوع کمک هزینه در هدر HTTP، این مقدار را روی request.header.grant_type
تنظیم کنید. همچنین به درخواست رمزهای دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | request.formparam.grant_type (یک x-www-form-urlencoded و مشخص شده در بدنه درخواست) |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | یک متغیر، همانطور که در بالا توضیح داده شد. |
مورد استفاده با انواع کمک هزینه: |
|
عنصر <Operation>
<Operation>GenerateAuthorizationCode</Operation>
عملیات OAuth 2.0 توسط این خط مشی اجرا شد.
پیش فرض: | اگر |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: |
|
عنصر <PassWord>
<PassWord>request.queryparam.password</PassWord>
این عنصر فقط با نوع اعطای رمز عبور استفاده می شود. با نوع اعطای رمز عبور، اعتبار کاربری (رمز عبور و نام کاربری) باید در اختیار خط مشی OAuthV2 قرار گیرد. عناصر <PassWord>
و <UserName>
برای تعیین متغیرهایی که Edge بتواند این مقادیر را پیدا کند استفاده می شود. اگر این عناصر مشخص نشده باشند، خطمشی انتظار دارد مقادیر (به طور پیشفرض) را در پارامترهای فرم با username
و password
پیدا کند. اگر مقادیر پیدا نشد، خط مشی خطایی ایجاد می کند. شما می توانید از عناصر <PassWord>
و <UserName>
برای ارجاع به هر متغیر جریان حاوی اعتبارنامه استفاده کنید.
به عنوان مثال، می توانید رمز عبور را در یک درخواست رمز با استفاده از پارامتر query ارسال کنید و عنصر را به این صورت تنظیم کنید: <PassWord>request.queryparam.password</PassWord>
.
برای نیاز به رمز عبور در هدر HTTP، این مقدار را روی request.header.password
تنظیم کنید.
خط مشی OAuthV2 هیچ کار دیگری با این مقادیر اعتبار انجام نمی دهد. Edge به سادگی تأیید می کند که آنها وجود دارند. این به توسعهدهنده API بستگی دارد که درخواست مقادیر را بازیابی کند و قبل از اجرای خطمشی تولید توکن به یک ارائهدهنده هویت ارسال کند.
همچنین به درخواست رمزهای دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | request.formparam.password (یک x-www-form-urlencoded و مشخص شده در بدنه درخواست) |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | هر متغیر جریانی که در زمان اجرا در اختیار سیاست قرار می گیرد. |
مورد استفاده با انواع کمک هزینه: | رمز عبور |
عنصر <RedirectUri>
<RedirectUri>request.queryparam.redirect_uri</RedirectUri>
مشخص می کند که Edge باید به دنبال پارامتر redirect_uri
در درخواست باشد.
درباره URI های تغییر مسیر
URI های هدایت مجدد با کد مجوز و انواع کمک های ضمنی استفاده می شوند. URI تغییر مسیر به سرور مجوز (Edge) می گوید که کجا یک کد مجوز (برای نوع اعطای کد تأیید اعتبار) یا نشانه دسترسی (برای نوع اعطای ضمنی) ارسال کند. این مهم است که بدانیم چه زمانی این پارامتر مورد نیاز است، چه زمانی اختیاری است و چگونه از آن استفاده می شود:
(الزامی) اگر URL بازگشت به تماس با برنامه توسعه دهنده که با کلیدهای کلاینت درخواست مرتبط است ثبت شده باشد، و اگر
redirect_uri
در درخواست وجود داشته باشد، این دو باید دقیقاً مطابقت داشته باشند. اگر مطابقت نداشته باشند، یک خطا برگردانده می شود. برای کسب اطلاعات در مورد ثبت برنامههای توسعهدهنده در Edge و تعیین URL بازگشت به تماس، به ثبت برنامهها و مدیریت کلیدهای API مراجعه کنید.- (اختیاری) اگر URL بازگشت به تماس ثبت شده باشد و
redirect_uri
در درخواست وجود نداشته باشد، Edge به URL بازگشت به تماس ثبت شده هدایت می شود. - (الزامی) اگر URL بازگشت به تماس ثبت نشده باشد،
redirect_uri
مورد نیاز است. توجه داشته باشید که در این صورت، Edge هر URL را می پذیرد. این مورد می تواند یک مشکل امنیتی ایجاد کند، بنابراین باید فقط با برنامه های مشتری قابل اعتماد استفاده شود. اگر برنامه های مشتری قابل اعتماد نیستند، بهترین کار این است که همیشه نیاز به ثبت URL بازگشت به تماس داشته باشید.
می توانید این پارامتر را در یک پارامتر query یا در یک هدر ارسال کنید. متغیر request.queryparam.redirect_uri
نشان می دهد که RedirectUri باید به عنوان یک پارامتر پرس و جو وجود داشته باشد، به عنوان مثال، ?redirect_uri=login.myapp.com
. به عنوان مثال، برای نیاز به RedirectUri در هدر HTTP، این مقدار را روی request.header.redirect_uri
تنظیم کنید. همچنین به درخواست رمزهای دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | request.formparam.redirect_uri (یک x-www-form-urlencoded و مشخص شده در بدنه درخواست) |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | هر متغیر جریان قابل دسترسی در سیاست در زمان اجرا |
مورد استفاده با انواع کمک هزینه: |
همچنین با عملیات GenerateAuthorizationCode استفاده می شود. |
عنصر <RefreshToken>
<RefreshToken>request.queryparam.refreshtoken</RefreshToken>
هنگام درخواست یک نشانه دسترسی با استفاده از یک نشانه رفرش، باید نشانه رفرش را در درخواست وارد کنید. این عنصر به شما امکان می دهد مشخص کنید که Edge کجا باید به دنبال نشانه رفرش باشد. به عنوان مثال، می تواند به عنوان یک پارامتر پرس و جو، هدر HTTP یا پارامتر فرم (پیش فرض) ارسال شود.
متغیر request.queryparam.refreshtoken
نشان می دهد که نشانه refresh باید به عنوان یک پارامتر پرس و جو وجود داشته باشد، به عنوان مثال، ?refresh_token=login.myapp.com
. به عنوان مثال، برای نیاز به RefreshToken در هدر HTTP، این مقدار را روی request.header.refresh_token
تنظیم کنید. همچنین به درخواست رمزهای دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | request.formparam.refresh_token (یک x-www-form-urlencoded و مشخص شده در بدنه درخواست) |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | هر متغیر جریان قابل دسترسی در سیاست در زمان اجرا |
مورد استفاده با انواع کمک هزینه: |
|
عنصر <RefreshTokenExpiresIn>
<RefreshTokenExpiresIn>1000</RefreshTokenExpiresIn>
زمان انقضای نشانههای تازهسازی را در میلیثانیه اعمال میکند. مقدار زمان انقضا یک مقدار تولید شده توسط سیستم به اضافه مقدار <RefreshTokenExpiresIn>
است. اگر <RefreshTokenExpiresIn>
روی تنظیم شود -1 ، نشانه رفرش مطابق با حداکثر انقضای توکن تازه سازی OAuth منقضی می شود. اگر <RefreshTokenExpiresIn>
مشخص نشده باشد، سیستم یک مقدار پیش فرض پیکربندی شده در سطح سیستم را اعمال می کند. برای اطلاعات بیشتر در مورد تنظیمات پیش فرض سیستم با پشتیبانی Apigee Edge تماس بگیرید.
زمان انقضا همچنین می تواند در زمان اجرا با استفاده از یک مقدار سخت کدگذاری شده و پیش فرض یا با ارجاع به یک متغیر جریان تنظیم شود. برای مثال، میتوانید یک مقدار انقضای رمز را در یک نقشه ارزش کلید ذخیره کنید، آن را بازیابی کنید، آن را به یک متغیر اختصاص دهید و در خطمشی به آن ارجاع دهید. برای مثال، kvm.oauth.expires_in
.
بند زیر یک متغیر جریان و یک مقدار پیش فرض را نیز مشخص می کند. توجه داشته باشید که مقدار متغیر جریان بر مقدار پیش فرض مشخص شده اولویت دارد.
<RefreshTokenExpiresIn ref="kvm.oauth.expires_in"> 3600000 <!--default value in milliseconds--> </RefreshTokenExpiresIn>
Private Cloud: برای نصب Edge برای Private Cloud، مقدار پیشفرض توسط ویژگی conf_keymanagement_oauth_refresh_token_expiry_time_in_millis
تنظیم میشود. برای تنظیم این ویژگی:
- فایل
message-processor.properties
را در یک ویرایشگر باز کنید. اگر فایل وجود ندارد، آن را ایجاد کنید:vi /opt/apigee/customer/application/message-processor.properties
- ویژگی را به صورت دلخواه تنظیم کنید:
conf_keymanagement_oauth_refresh_token_expiry_time_in_millis=3600000
- مطمئن شوید که فایل خواص متعلق به کاربر "apigee" است:
chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- پردازشگر پیام را مجددا راه اندازی کنید.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
پیش فرض: | 63072000000 ms (2 سال) (از 05 اوت 2024) |
حضور: | اختیاری |
نوع: | عدد صحیح |
مقادیر معتبر: |
|
مورد استفاده با انواع کمک هزینه: |
|
عنصر <ResponseType>
<ResponseType>request.queryparam.response_type</ResponseType>
این عنصر به Edge اطلاع می دهد که برنامه مشتری کدام نوع کمک مالی را درخواست می کند. این فقط با کد مجوز و جریان های نوع کمک ضمنی استفاده می شود.
به طور پیش فرض، Edge به دنبال مقدار نوع پاسخ در یک پارامتر query response_type
می گردد. اگر میخواهید این رفتار پیشفرض را لغو کنید، از عنصر <ResponseType> برای پیکربندی متغیر جریان حاوی مقدار نوع پاسخ استفاده کنید. برای مثال، اگر این عنصر را روی request.header.response_type
تنظیم کنید، Edge به دنبال نوع پاسخی است که باید در هدر درخواست ارسال شود. همچنین به درخواست رمزهای دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | request.formparam.response_type (یک x-www-form-urlencoded و مشخص شده در بدنه درخواست) |
حضور: | اختیاری. اگر میخواهید رفتار پیشفرض را لغو کنید، از این عنصر استفاده کنید. |
نوع: | رشته |
مقادیر معتبر: | code (برای نوع اعطای کد مجوز) یا token (برای نوع اعطای ضمنی) |
مورد استفاده با انواع کمک هزینه: |
|
عنصر <ReuseRefreshToken>
<ReuseRefreshToken>true</ReuseRefreshToken>
هنگامی که روی true
تنظیم می شود، نشانه تازه سازی موجود مجدداً استفاده می شود تا زمانی که منقضی شود. در صورت false
بودن، زمانی که یک نشانه رفرش معتبر ارائه می شود، یک توکن تازه سازی جدید توسط Apigee Edge صادر می شود.
پیش فرض: | |
حضور: | اختیاری |
نوع: | بولی |
مقادیر معتبر: | |
مورد استفاده با نوع کمک هزینه: |
|
عنصر <Scope>
<Scope>request.queryparam.scope</Scope>
اگر این عنصر در یکی از خطمشیهای GenerateAccessToken یا GenerateAuthorizationCode وجود داشته باشد، از آن برای تعیین محدودههایی برای اعطای رمز یا کد استفاده میشود. این مقادیر معمولاً به خطمشی در درخواست از یک برنامه مشتری منتقل میشوند. میتوانید عنصر را طوری پیکربندی کنید که یک متغیر جریان را بگیرد و به شما این امکان را میدهد که نحوه ارسال دامنهها در یک درخواست را انتخاب کنید. در مثال زیر، request.queryparam.scope
نشان می دهد که محدوده باید به عنوان یک پارامتر پرس و جو وجود داشته باشد، به عنوان مثال، ?scope=READ
. به عنوان مثال، برای نیاز به دامنه در سرصفحه HTTP، این مقدار را روی request.header.scope
تنظیم کنید.
اگر این عنصر در یک خطمشی «VerifyAccessToken» ظاهر میشود، از آن برای تعیین حوزههایی استفاده میشود که این خطمشی باید اعمال شود. در این نوع خطمشی، مقدار باید یک نام حوزه «کد سخت» باشد -- نمیتوانید از متغیرها استفاده کنید. به عنوان مثال:
<Scope>A B</Scope>
همچنین به کار با دامنه های OAuth2 و درخواست نشانه های دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | بدون دامنه |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | اگر با خطمشیهای Generate* استفاده میشود، یک متغیر جریان. اگر با VerifyAccessToken استفاده شود، فهرستی از نامهای محدوده (رشتهها) از هم جدا شده است. |
مورد استفاده با انواع کمک هزینه: |
|
عنصر <State>
<State>request.queryparam.state</State>
در مواردی که برنامه سرویس گیرنده باید اطلاعات وضعیت را به سرور مجوز ارسال کند، این عنصر به شما امکان می دهد تعیین کنید که Edge باید در کجا به دنبال مقادیر وضعیت باشد. به عنوان مثال، می تواند به عنوان یک پارامتر پرس و جو یا در یک هدر HTTP ارسال شود. مقدار حالت معمولاً به عنوان یک اقدام امنیتی برای جلوگیری از حملات CSRF استفاده می شود.
برای مثال request.queryparam.state
نشان میدهد که حالت باید به عنوان یک پارامتر پرس و جو وجود داشته باشد، به عنوان مثال، ?state=HjoiuKJH32
. به عنوان مثال، برای نیاز به وضعیت در یک هدر HTTP، این مقدار را روی request.header.state
تنظیم کنید. همچنین به درخواست رمزهای دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | بدون ایالت |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | هر متغیر جریان قابل دسترسی به سیاست در زمان اجرا |
مورد استفاده با انواع کمک هزینه: |
|
عنصر <StoreToken>
<StoreToken>true</StoreToken>
وقتی عنصر <ExternalAuthorization>
true
است، این عنصر را روی true
تنظیم کنید. عنصر <StoreToken>
به Apigee Edge میگوید که رمز دسترسی خارجی را ذخیره کند. در غیر این صورت تداوم نخواهد داشت.
پیش فرض: | نادرست |
حضور: | اختیاری |
نوع: | بولی |
مقادیر معتبر: | درست یا نادرست |
مورد استفاده با انواع کمک هزینه: |
|
عنصر <SupportedGrantTypes>/<GrantType>
<SupportedGrantTypes> <GrantType>authorization_code</GrantType> <GrantType>client_credentials</GrantType> <GrantType>implicit</GrantType> <GrantType>password</GrantType> </SupportedGrantTypes>
انواع کمک هزینه های پشتیبانی شده توسط یک نقطه پایانی توکن OAuth در Apigee Edge را مشخص می کند. یک نقطه پایانی ممکن است از چندین نوع کمک مالی پشتیبانی کند (یعنی میتوان یک نقطه پایانی را برای توزیع نشانههای دسترسی برای چندین نوع کمک هزینه پیکربندی کرد.) برای اطلاعات بیشتر در مورد نقاط پایانی، به درک نقاط پایانی OAuth مراجعه کنید. نوع اعطا در درخواست های توکن در پارامتر grant_type
ارسال می شود.
اگر هیچ نوع کمک مالی پشتیبانی شده مشخص نشده باشد، تنها انواع اعطای مجاز عبارتند از authorization_code
و implicit
. عنصر <GrantType> را نیز ببینید (که یک عنصر سطح بالاتر است که برای مشخص کردن جایی که Apigee Edge باید به دنبال پارامتر grant_type
که در درخواست مشتری ارسال میشود بگردد. Edge مطمئن میشود که مقدار پارامتر grant_type
با یک مطابقت دارد. از انواع کمک های مالی حمایت شده).
پیش فرض: | مجوز _کد و ضمنی |
حضور: | مورد نیاز |
نوع: | رشته |
مقادیر معتبر: |
|
عنصر <Tokens>/<Token>
با عملیات ValidateToken و InvalidateToken استفاده می شود. همچنین به تأیید و لغو نشانه های دسترسی مراجعه کنید. عنصر <Token> متغیر جریانی را مشخص می کند که منبع نشانه ای را که باید باطل شود را مشخص می کند. اگر از توسعه دهندگان انتظار می رود که نشانه های دسترسی را به عنوان پارامترهای جستجو با نام access_token
ارسال کنند، برای مثال از request.queryparam.access_token
استفاده کنید.
عنصر <UserName>
<UserName>request.queryparam.user_name</UserName>
این عنصر فقط با نوع اعطای رمز عبور استفاده می شود. با نوع اعطای رمز عبور، اعتبار کاربری (رمز عبور و نام کاربری) باید در اختیار خط مشی OAuthV2 قرار گیرد. عناصر <PassWord>
و <UserName>
برای تعیین متغیرهایی که Edge بتواند این مقادیر را پیدا کند استفاده می شود. اگر این عناصر مشخص نشده باشند، خطمشی انتظار دارد مقادیر (به طور پیشفرض) را در پارامترهای فرم با username
و password
پیدا کند. اگر مقادیر پیدا نشد، خط مشی خطایی ایجاد می کند. شما می توانید از عناصر <PassWord>
و <UserName>
برای ارجاع به هر متغیر جریان حاوی اعتبارنامه استفاده کنید.
به عنوان مثال، می توانید نام کاربری را در یک پارامتر query ارسال کنید و عنصر <UserName>
را به این صورت تنظیم کنید: <UserName>request.queryparam.username</UserName>
.
برای نیاز به نام کاربری در هدر HTTP، این مقدار را روی request.header.username
تنظیم کنید.
خط مشی OAuthV2 هیچ کار دیگری با این مقادیر اعتبار انجام نمی دهد. Edge به سادگی تأیید می کند که آنها وجود دارند. این به توسعهدهنده API بستگی دارد که درخواست مقادیر را بازیابی کند و قبل از اجرای خطمشی تولید توکن به یک ارائهدهنده هویت ارسال کند.
همچنین به درخواست رمزهای دسترسی و کدهای مجوز مراجعه کنید.
پیش فرض: | request.formparam.username (یک x-www-form-urlencoded و مشخص شده در بدنه درخواست) |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | هر تنظیم متغیر |
مورد استفاده با انواع کمک هزینه: | رمز عبور |
تایید نشانه های دسترسی
هنگامی که یک نقطه پایانی توکن برای یک پراکسی API تنظیم می شود، یک خط مشی مربوطه OAuthV2 که عملیات VerifyAccessToken
را مشخص می کند به جریانی که منبع محافظت شده را در معرض دید قرار می دهد، متصل می شود.
به عنوان مثال، برای اطمینان از اینکه همه درخواستها به یک API مجاز هستند، خطمشی زیر تأیید توکن دسترسی را اعمال میکند:
<OAuthV2 name="VerifyOAuthAccessToken"> <Operation>VerifyAccessToken</Operation> </OAuthV2>
این خط مشی به منبع API پیوست شده است تا محافظت شود. برای اطمینان از اینکه همه درخواستهای یک API تأیید میشوند، خطمشی را به درخواست ProxyEndpoint PreFlow، به شرح زیر پیوست کنید:
<PreFlow> <Request> <Step><Name>VerifyOAuthAccessToken</Name></Step> </Request> </PreFlow>
عناصر اختیاری زیر را می توان برای لغو تنظیمات پیش فرض برای عملیات VerifyAccessToken استفاده کرد.
نام | توضیحات |
---|---|
دامنه | فهرستی از محدودهها با فاصله محدود. اگر حداقل یکی از حوزه های فهرست شده در نشانه دسترسی وجود داشته باشد، تأیید موفقیت آمیز خواهد بود. به عنوان مثال، خط مشی زیر نشانه دسترسی را بررسی می کند تا مطمئن شود که حداقل یکی از حوزه های فهرست شده را در خود دارد. اگر READ یا WRITE وجود داشته باشد، تأیید موفقیت آمیز خواهد بود. <OAuthV2 name="ValidateOauthScopePolicy"> <Operation>VerifyAccessToken</Operation> <Scope>READ WRITE</Scope> </OAuthV2> |
AccessToken | متغیری که انتظار می رود نشانه دسترسی در آن قرار گیرد. به عنوان مثال request.queryparam.accesstoken . بهطور پیشفرض، انتظار میرود که کد دسترسی طبق مشخصات OAuth 2.0 توسط برنامه در سرصفحه مجوز HTTP ارائه شود. اگر انتظار می رود نشانه دسترسی در یک مکان غیر استاندارد مانند یک پارامتر جستجو یا یک عنوان HTTP با نامی غیر از مجوز ارائه شود، از این تنظیم استفاده کنید. |
همچنین به تأیید نشانههای دسترسی و درخواست نشانههای دسترسی و کدهای مجوز مراجعه کنید.
تعیین مکان متغیر درخواست
برای هر نوع کمک مالی، این خط مشی مفروضاتی را در مورد مکان یا اطلاعات مورد نیاز در پیام های درخواست ایجاد می کند. این مفروضات بر اساس مشخصات OAuth 2.0 است. اگر برنامههای شما باید از مشخصات OAuth 2.0 منحرف شوند، میتوانید مکانهای مورد انتظار را برای هر پارامتر مشخص کنید. به عنوان مثال، هنگام مدیریت یک کد مجوز، می توانید محل کد مجوز، شناسه مشتری، URI تغییر مسیر و محدوده را مشخص کنید. اینها را می توان به عنوان سرصفحه های HTTP، پارامترهای پرس و جو یا پارامترهای فرم مشخص کرد.
مثال زیر نشان می دهد که چگونه می توانید مکان پارامترهای کد مجوز مورد نیاز را به عنوان هدر HTTP مشخص کنید:
... <GrantType>request.header.grant_type</GrantType> <Code>request.header.code</Code> <ClientId>request.header.client_id</ClientId> <RedirectUri>request.header.redirect_uri</RedirectUri> <Scope>request.header.scope</Scope> ...
یا در صورت لزوم برای پشتیبانی از پایگاه برنامه مشتری خود، می توانید سرصفحه ها و پارامترهای پرس و جو را با هم ترکیب و مطابقت دهید:
... <GrantType>request.header.grant_type</GrantType> <Code>request.header.code</Code> <ClientId>request.queryparam.client_id</ClientId> <RedirectUri>request.queryparam.redirect_uri</RedirectUri> <Scope>request.queryparam.scope</Scope> ...
فقط یک مکان را می توان در هر پارامتر پیکربندی کرد.
متغیرهای جریان
متغیرهای جریان تعریفشده در این جدول زمانی که سیاستهای OAuth مربوطه اجرا میشوند پر میشوند و از این رو برای سایر سیاستها یا برنامههایی که در جریان پروکسی API اجرا میشوند در دسترس هستند.
عملیات VerifyAccessToken
عملیات VerifyAccessToken اجرا می شود، تعداد زیادی از متغیرهای جریان در زمینه اجرای پروکسی پر می شوند. این متغیرها ویژگی های مربوط به نشانه دسترسی، برنامه توسعه دهنده، توسعه دهنده و شرکت را به شما می دهند. به عنوان مثال، میتوانید از یک خطمشی AssignMessage یا JavaScript برای خواندن هر یک از این متغیرها استفاده کنید و در صورت لزوم در ادامه جریان از آنها استفاده کنید. این متغیرها همچنین می توانند برای اهداف اشکال زدایی مفید باشند.
proxy.pathsuffix
) پیکربندی شوند، متغیرهای محصول API بهطور خودکار پر میشوند. تنظیم صریح متغیر flow.resource.name لازم نیست. در جایی که محصولات API با محیطهای معتبر و پراکسیهای API پیکربندی نشدهاند، flow.resource.name
باید صراحتاً برای پر کردن متغیرهای محصول API در جریان تنظیم شود. برای جزئیات در مورد پیکربندی محصول، به استفاده از API مدیریت لبه برای انتشار APIها مراجعه کنید.
متغیرهای خاص توکن
متغیرها | توضیحات |
---|---|
organization_name | نام سازمانی که پروکسی در آن اجرا می شود. |
developer.id | شناسه توسعهدهنده مرتبط با برنامه مشتری ثبتشده. |
developer.app.name | نام توسعه دهنده مرتبط با برنامه مشتری ثبت شده. |
client_id | شناسه مشتری برنامه مشتری ثبت شده. |
grant_type | نوع کمک مالی مرتبط با درخواست. |
token_type | نوع رمز مرتبط با درخواست. |
access_token | رمز دسترسی که در حال تأیید است. |
accesstoken.{custom_attribute} | یک ویژگی سفارشی با نام در نشانه دسترسی. |
issued_at | تاریخی که رمز دسترسی صادر شد بر حسب زمان یونیکس بر حسب میلی ثانیه بیان شد. |
expires_in | زمان انقضای رمز دسترسی در ثانیه بیان می شود. اگرچه عنصر ExpiresIn انقضا را بر حسب میلی ثانیه تنظیم می کند، اما در متغیرهای پاسخ نشانه و جریان، مقدار در ثانیه بیان می شود. |
status | وضعیت نشانه دسترسی (مثلاً تأیید یا لغو شده است). |
scope | محدوده (در صورت وجود) مرتبط با نشانه دسترسی. |
apiproduct.<custom_attribute_name> | یک ویژگی سفارشی نامگذاری شده از محصول API مرتبط با برنامه مشتری ثبتشده. |
apiproduct.name | نام محصول API مرتبط با برنامه مشتری ثبت شده. |
revoke_reason | (فقط Apigee Hybrid) نشان می دهد که چرا نشانه دسترسی لغو شده است. مقدار می تواند |
متغیرهای خاص برنامه
این متغیرها مربوط به Developer App است که با توکن مرتبط است.
متغیرها | توضیحات |
---|---|
app.name | |
app.id | |
app.accessType | |
app.callbackUrl | |
app.status | تایید یا لغو شد |
app.scopes | |
app.appFamily | |
app.apiproducts | |
app.appParentStatus | |
app.appType | به عنوان مثال: توسعه دهنده |
app.appParentId | |
app.created_by | |
app.created_at | |
app.last_modified_at | |
app.last_modified_by | |
app.{custom_attributes} | یک ویژگی سفارشی با نام برنامه مشتری ثبت شده. |
متغیرهای خاص توسعه دهنده
اگر app.appType "Company" باشد، مشخصه های شرکت پر می شوند و اگر app.appType "Developer" باشد، ویژگی های توسعه دهنده پر می شوند.
متغیرها | توضیحات |
---|---|
متغیرهای خاص توسعه دهنده | |
developer.id | |
developer.userName | |
developer.firstName | |
developer.lastName | |
developer.email | |
developer.status | فعال یا غیر فعال |
developer.apps | |
developer.created_by | |
developer.created_at | |
developer.last_modified_at | |
developer.last_modified_by | |
developer.{custom_attributes} | یک ویژگی سفارشی نامگذاری شده از توسعه دهنده. |
متغیرهای خاص شرکت
اگر app.appType "Company" باشد، مشخصه های شرکت پر می شوند و اگر app.appType "Developer" باشد، ویژگی های توسعه دهنده پر می شوند.
متغیرها | توضیحات |
---|---|
company.id | |
company.displayName | |
company.apps | |
company.appOwnerStatus | |
company.created_by | |
company.created_at | |
company.last_modified_at | |
company.last_modified_by | |
company.{custom_attributes} | یک ویژگی سفارشی با نام شرکت. |
عملیات GenerateAuthorizationCode
این متغیرها زمانی تنظیم می شوند که عملیات GenerateAuthorizationCode با موفقیت اجرا شود:
پیشوند: oauthv2authcode.{policy_name}.{variable_name}
مثال: oauthv2authcode.GenerateCodePolicy.code
متغیر | توضیحات |
---|---|
code | کد مجوز تولید شده هنگام اجرای سیاست. |
redirect_uri | URI تغییر مسیر مرتبط با برنامه مشتری ثبت شده. |
scope | محدوده اختیاری OAuth در درخواست مشتری ارسال شده است. |
client_id | شناسه مشتری در درخواست مشتری ارسال شده است. |
عملیات GenerateAccessToken و RefreshAccessToken
این متغیرها زمانی تنظیم می شوند که عملیات GenerateAccessToken و RefreshAccessToken با موفقیت اجرا شوند. توجه داشته باشید که متغیرهای نشانه رفرش برای جریان نوع اعطای اعتبار مشتری اعمال نمی شود.
پیشوند: oauthv2accesstoken.{policy_name}.{variable_name}
مثال: oauthv2accesstoken.GenerateTokenPolicy.access_token
نام متغیر | توضیحات |
---|---|
access_token | نشانه دسترسی که ایجاد شد. |
client_id | شناسه مشتری برنامه توسعه دهنده مرتبط با این نشانه. |
expires_in | ارزش انقضا برای توکن. برای جزئیات بیشتر به عنصر <ExpiresIn> مراجعه کنید. توجه داشته باشید که در پاسخ، expires_in بر حسب ثانیه بیان می شود. |
scope | فهرست دامنه های موجود پیکربندی شده برای توکن. به کار با دامنه های OAuth2 مراجعه کنید. |
status | یا approved یا revoked . |
token_type | روی BearerToken تنظیم شده است. |
developer.email | آدرس ایمیل توسعهدهنده ثبتشده که مالک برنامه توسعهدهنده مرتبط با توکن است. |
organization_name | سازمانی که پروکسی در آن اجرا می شود. |
api_product_list | فهرستی از محصولات مرتبط با برنامه توسعه دهنده مربوطه توکن. |
refresh_count | |
refresh_token | نشانه رفرشی که ایجاد شد. توجه داشته باشید که توکنهای تازهسازی برای نوع اعطای اعتبار مشتری ایجاد نمیشوند. |
refresh_token_expires_in | طول عمر نشانه رفرش، در چند ثانیه. |
refresh_token_issued_at | این مقدار زمانی نمایش رشته ای از مقدار زمان 32 بیتی مربوطه است. به عنوان مثال، «چهارشنبه، 21 اوت 2013، 19:16:47 UTC» با مقدار مهر زمانی 1377112607413 مطابقت دارد. |
refresh_token_status | یا approved یا revoked . |
GenerateAccessTokenImplicitGrant
این متغیرها زمانی تنظیم می شوند که عملیات GenerateAccessTokenImplicit برای جریان نوع اعطای ضمنی با موفقیت اجرا شود.
پیشوند: oauthv2accesstoken.{policy_name}.{variable_name}
مثال: oauthv2accesstoken.RefreshTokenPolicy.access_token
متغیر | توضیحات |
---|---|
oauthv2accesstoken.access_token | نشانه دسترسی که هنگام اجرای خط مشی ایجاد می شود. |
oauthv2accesstoken.{policy_name}.expires_in | مقدار انقضا برای توکن، در ثانیه. برای جزئیات بیشتر به عنصر <ExpiresIn> مراجعه کنید. |
مرجع خطا
این بخش کدهای خطا و پیامهای خطایی را که برگردانده میشوند و متغیرهای خطا را که توسط Edge تنظیم میشوند، هنگامی که این خطمشی خطا را راهاندازی میکند، توضیح میدهد. این اطلاعات برای دانستن اینکه آیا در حال توسعه قوانین خطا برای رسیدگی به خطاها هستید، مهم است. برای کسب اطلاعات بیشتر، آنچه را که باید در مورد خطاهای خط مشی و مدیریت خطاها بدانید را ببینید.
خطاهای زمان اجرا
این خطاها ممکن است هنگام اجرای سیاست رخ دهند.
کد خطا | وضعیت HTTP | علت | پرتاب شده توسط عملیات |
---|---|---|---|
steps.oauth.v2.access_token_expired | 401 | رمز دسترسی منقضی شده است. | VerifyAccessToken |
steps.oauth.v2.access_token_not_approved | 401 | رمز دسترسی لغو شد. | VerifyAccessToken |
steps.oauth.v2.apiresource_doesnot_exist | 401 | منبع درخواستی هیچ یک از محصولات API مرتبط با نشانه دسترسی وجود ندارد. | VerifyAccessToken |
steps.oauth.v2.FailedToResolveAccessToken | 500 | این خطمشی انتظار داشت که یک نشانه دسترسی در متغیری که در عنصر <AccessToken> مشخص شده است پیدا کند، اما متغیر قابل حل نیست. | GenerateAccessToken |
steps.oauth.v2.FailedToResolveAuthorizationCode | 500 | این خطمشی انتظار داشت یک کد مجوز را در یک متغیر مشخص شده در عنصر <Code> پیدا کند، اما متغیر قابل حل نیست. | GenerateAuthorizationCode |
steps.oauth.v2.FailedToResolveClientId | 500 | این خطمشی انتظار داشت شناسه مشتری را در متغیری که در عنصر <ClientId> مشخص شده است پیدا کند، اما متغیر قابل حل نیست. | GenerateAccessToken GenerateAuthorizationCode GenerateAccessTokenImplicitGrant RefreshAccessToken |
steps.oauth.v2.FailedToResolveRefreshToken | 500 | این خطمشی انتظار داشت که یک نشانه تازهسازی را در متغیری که در عنصر <RefreshToken> مشخص شده است پیدا کند، اما متغیر قابل حل نیست. | RefreshAccessToken |
steps.oauth.v2.FailedToResolveToken | 500 | این خطمشی انتظار داشت که یک نشانه را در یک متغیر مشخص شده در عنصر <Tokens> پیدا کند، اما متغیر قابل حل نیست. | ValidateToken |
steps.oauth.v2.InsufficientScope | 403 | نشانه دسترسی ارائه شده در درخواست دارای محدوده ای است که با محدوده مشخص شده در خط مشی رمز دسترسی تأیید مطابقت ندارد. برای آشنایی با دامنه، به کار با دامنه های OAuth2 مراجعه کنید. | VerifyAccessToken |
steps.oauth.v2.invalid_access_token | 401 | رمز دسترسی ارسال شده از مشتری نامعتبر است. | VerifyAccessToken |
steps.oauth.v2.invalid_client | 401 | زمانی که ویژگی توجه: توصیه میشود شرایط قانون خطای موجود را تغییر دهید تا نامهای | GenerateAccessToken RefreshAccessToken |
steps.oauth.v2.invalid_request | 400 | این نام خطا برای چندین نوع خطا استفاده میشود، معمولاً برای پارامترهای گم شده یا نادرست ارسال شده در درخواست. اگر <GenerateResponse> روی false تنظیم شده است، از متغیرهای خطا (که در زیر توضیح داده شده است) استفاده کنید تا جزئیات مربوط به خطا، مانند نام و علت خطا را بازیابی کنید. | GenerateAccessToken GenerateAuthorizationCode GenerateAccessTokenImplicitGrant RefreshAccessToken |
steps.oauth.v2.InvalidAccessToken | 401 | سرصفحه مجوز کلمه "حامل" را ندارد که لازم است. به عنوان مثال: Authorization: Bearer your_access_token | VerifyAccessToken |
steps.oauth.v2.InvalidAPICallAsNo\ | 401 | پروکسی API در محصول مرتبط با رمز دسترسی نیست. نکات: مطمئن شوید که محصول مرتبط با نشانه دسترسی به درستی پیکربندی شده است. به عنوان مثال، اگر در مسیرهای منبع از حروف عام استفاده میکنید، مطمئن شوید که از حروف عام به درستی استفاده میشود. برای جزئیات بیشتر به ایجاد محصولات API مراجعه کنید. برای راهنمایی بیشتر در مورد علل این خطا ، این پست انجمن Apigee را نیز ببینید. | VerifyAccessToken |
steps.oauth.v2.InvalidClientIdentifier | 500 | زمانی که ویژگی | GenerateAccessToken |
steps.oauth.v2.InvalidParameter | 500 | این خطمشی باید یک رمز دسترسی یا یک کد مجوز را مشخص کند، اما نه هر دو را. | GenerateAuthorizationCode GenerateAccessTokenImplicitGrant |
steps.oauth.v2.InvalidTokenType | 500 | عنصر <Tokens>/<Token> از شما می خواهد که نوع رمز را مشخص کنید (به عنوان مثال، refreshtoken ). اگر کلاینت از نوع اشتباه عبور کند، این خطا پرتاب می شود. | ValidateToken InvalidateToken |
steps.oauth.v2.MissingParameter | 500 | نوع پاسخ token است، اما هیچ نوع کمک مالی مشخص نشده است. | GenerateAuthorizationCode GenerateAccessTokenImplicitGrant |
steps.oauth.v2.UnSupportedGrantType | 500 | مشتری یک نوع کمک مالی را مشخص کرده است که توسط این خط مشی پشتیبانی نمی شود (در عنصر <SupportedGrantTypes> فهرست نشده است). توجه: در حال حاضر یک اشکال وجود دارد که در آن خطاهای نوع کمک مالی پشتیبانی نشده به درستی پرتاب نمی شوند. اگر یک خطای نوع اعطای پشتیبانی نشده رخ دهد، پروکسی همانطور که انتظار می رود وارد جریان خطا نمی شود. | GenerateAccessToken GenerateAuthorizationCode GenerateAccessTokenImplicitGrant RefreshAccessToken |
خطاهای استقرار
این خطاها ممکن است زمانی رخ دهند که یک پروکسی حاوی این خط مشی را مستقر می کنید.
نام خطا | علت |
---|---|
InvalidValueForExpiresIn | برای عنصر |
InvalidValueForRefreshTokenExpiresIn | برای عنصر <RefreshTokenExpiresIn> ، مقادیر معتبر اعداد صحیح مثبت و -1 هستند. |
InvalidGrantType | یک نوع کمک مالی نامعتبر در عنصر <SupportedGrantTypes> مشخص شده است. برای فهرستی از انواع معتبر به مرجع خط مشی مراجعه کنید. |
ExpiresInNotApplicableForOperation | مطمئن شوید که عملیات مشخص شده در عنصر <Operations> منقضی شده است. برای مثال، عملیات VerifyToken اینطور نیست. |
RefreshTokenExpiresInNotApplicableForOperation | مطمئن شوید که عملیات مشخص شده در عنصر <Operations> از انقضای نشانه رفرش پشتیبانی می کند. برای مثال، عملیات VerifyToken اینطور نیست. |
GrantTypesNotApplicableForOperation | مطمئن شوید که انواع کمک هزینه مشخص شده در <SupportedGrantTypes> برای عملیات مشخص شده پشتیبانی می شوند. |
OperationRequired | شما باید با استفاده از عنصر توجه: اگر عنصر |
InvalidOperation | شما باید با استفاده از عنصر توجه: اگر عنصر |
TokenValueRequired | شما باید یک مقدار نشانه <Token> را در عنصر <Tokens> مشخص کنید. |
متغیرهای خطا
این متغیرها زمانی تنظیم می شوند که این خط مشی خطایی را در زمان اجرا ایجاد کند.
<GenerateResponse>
روی false
تنظیم شود، این متغیرها زمانی پر می شوند که خطایی رخ دهد. اگر <GenerateResponse>
true
باشد، در صورت بروز خطا، این خطمشی بلافاصله پاسخی را به مشتری برمیگرداند - جریان خطا نادیده گرفته میشود و این متغیرها پر نمیشوند. برای اطلاعات بیشتر، به آنچه باید در مورد خطاهای خط مشی بدانید مراجعه کنید.متغیرها | کجا | مثال |
---|---|---|
fault.name=" fault_name " | fault_name نام خطا است، همانطور که در جدول خطاهای Runtime در بالا ذکر شده است. نام خطا آخرین قسمت کد خطا است. | fault.name = "invalid_request" |
oauthV2. policy_name .failed | policy_name نام سیاستی است که توسط کاربر مشخص شده است که خطا را ایجاد کرده است. | oauthV2.GenerateAccesstoken.failed = true |
oauthV2. policy_name .fault.name | policy_name نام سیاستی است که توسط کاربر مشخص شده است که خطا را ایجاد کرده است. | oauthV2.GenerateAccesstoken.fault.name = invalid_request توجه : برای عملیات VerifyAccessToken، نام خطا شامل این پسوند است: |
oauthV2. policy_name .fault.cause | policy_name نام سیاستی است که توسط کاربر مشخص شده است که خطا را ایجاد کرده است. | oauthV2.GenerateAccesstoken.cause = Required param : grant_type |
نمونه پاسخ خطا
اگر عنصر <GenerateResponse>
درست باشد، این پاسخها به مشتری بازگردانده میشوند.
errorcode
در پاسخ به خطا است. به متن موجود در faultstring
تکیه نکنید، زیرا ممکن است تغییر کند. اگر <GenerateResponse>
درست باشد، خط مشی خطاهایی را در این قالب برای عملیاتی که توکن ها و کدها را تولید می کنند، برمی گرداند. برای فهرست کامل، به مرجع پاسخ به خطای HTTP OAuth مراجعه کنید.
{"ErrorCode" : "invalid_client", "Error" :"ClientId is Invalid"}
اگر <GenerateResponse>
درست باشد، خط مشی خطاهایی را در این قالب برای تأیید و تأیید عملیات برمیگرداند. برای فهرست کامل، به مرجع پاسخ به خطای HTTP OAuth مراجعه کنید.
{ { "fault":{ "faultstring":"Invalid Access Token", "detail":{ "errorcode":"keymanagement.service.invalid_access_token" } } }
مثال قانون خطا
<FaultRule name=OAuthV2 Faults"> <Step> <Name>AM-InvalidClientResponse</Name> <Condition>(fault.name = "invalid_client") OR (fault.name = "InvalidClientIdentifier")</Condition> </Step> <Step> <Name>AM-InvalidTokenResponse</Name> <Condition>(fault.name = "invalid_access_token")</Condition> </Step> <Condition>(oauthV2.failed = true) </Condition> </FaultRule>
طرح سیاست
هر نوع خط مشی توسط یک طرح XML ( .xsd
) تعریف می شود. برای مرجع، طرحهای خطمشی در GitHub در دسترس هستند.
کار با پیکربندی پیش فرض OAuth
هر سازمان (حتی یک سازمان آزمایشی رایگان) در Apigee Edge دارای یک نقطه پایانی نشانه OAuth است. نقطه پایانی با خطمشیهایی در پروکسی API به نام oauth از قبل پیکربندی شده است. به محض ایجاد یک حساب کاربری در Apigee Edge میتوانید از نقطه پایانی نشانه استفاده کنید. برای جزئیات، به درک نقاط پایانی OAuth مراجعه کنید.
پاک کردن نشانه های دسترسی
بهطور پیشفرض، توکنهای OAuth2 از سیستم Apigee Edge 3 روز (259200 ثانیه) پس از انقضای توکن دسترسی و رمز تجدید (در صورت وجود) پاک میشوند. در برخی موارد، ممکن است بخواهید این پیش فرض را تغییر دهید. به عنوان مثال، اگر تعداد زیادی توکن در حال تولید هستند، ممکن است بخواهید زمان پاکسازی را برای صرفه جویی در فضای دیسک کوتاه کنید.
اگر در Edge برای Private Cloud هستید، میتوانید این پیشفرض را با تنظیم ویژگیهای سازمان همانطور که در این بخش توضیح داده شد تغییر دهید. (پاکسازی 3 روزه توکن های منقضی شده برای Edge برای Private Cloud نسخه 4.19.01 و جدیدتر اعمال می شود. برای نسخه های قبلی، فاصله پاکسازی پیش فرض 180 روز است.)
بهروزرسانی تنظیمات پاکسازی برای Edge Private Cloud 4.16.01 و نسخههای جدیدتر
توجه: فقط نشانه هایی که پس از اعمال این تنظیمات تولید می شوند تحت تأثیر قرار می گیرند. تنظیمات برای توکن هایی که قبلا تولید شده اند اعمال نمی شود.
- این فایل را برای ویرایش باز کنید:
/opt/apigee/customer/application/message-processor.properties
- ویژگی زیر را اضافه کنید تا تعداد ثانیه های انتظار قبل از پاکسازی رمز پس از انقضای آن را تنظیم کنید:
conf_keymanagement_oauth.access.token.purge.after.seconds=<number of seconds>
- پردازشگر پیام را مجددا راه اندازی کنید. به عنوان مثال:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
<ExpiresIn>
و <RefreshTokenExpiresIn>
میتوانید انقضای رمز را در خطمشی OAuthV2 تنظیم کنید. به روز رسانی تنظیمات پاکسازی برای Edge Private Cloud 4.15.07
توجه: فقط نشانه هایی که پس از اعمال این تنظیمات تولید می شوند تحت تأثیر قرار می گیرند. تنظیمات برای توکن هایی که قبلا تولید شده اند اعمال نمی شود.
مقادیر مثبت را برای ویژگی های
<ExpiresIn>
و<RefreshTokenExpiresIn>
در خط مشی OAuthV2 تنظیم کنید. مقادیر بر حسب میلی ثانیه هستند. به عنوان مثال:<ExpiresIn>1000</ExpiresIn> <RefreshTokenExpiresIn>10000</RefreshTokenExpiresIn>
پراکسی را مجدداً مستقر کنید.
از این API برای بهروزرسانی ویژگیهای پاکسازی رمز برای سازمان خود استفاده کنید:
POST https://<host-name>/v1/organizations/<org-name>
بار بار:
<Organization name="AutomationOrganization"> <Description>Desc</Description> <Properties> <Property name="keymanagement.oauth20.access.token.purge">true</Property> <Property name="keymanagement.oauth20.access.token.purge.after.seconds">120</Property> </Properties> </Organization>
پردازشگر پیام را مجددا راه اندازی کنید. به عنوان مثال:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
این API ویژگی پاکسازی توکن را برای سازمانی به نام AutomationOrganization روی true تنظیم می کند. در این حالت، رمز دسترسی 120 ثانیه پس از انقضای توکن و رفرش از پایگاه داده پاک می شود.
رفتار غیر منطبق با RFC
خط مشی OAuthV2 یک پاسخ توکن را برمی گرداند که حاوی ویژگی های غیر منطبق با RFC است. جدول زیر ویژگی های غیرمنطبق برگردانده شده توسط خط مشی OAuthV2 و ویژگی های سازگار مربوطه را نشان می دهد.
OAuthV2 برمی گرداند: | ویژگی سازگار با RFC عبارت است از: |
---|---|
"token_type":"BearerToken" | "token_type":"Bearer" |
"expires_in":"3600" | "expires_in":3600 (مقدار سازگار یک عدد است، نه یک رشته.) |
همچنین، پاسخ خطا برای یک نشانه رفرش منقضی شده، زمانی که grant_type = refresh_token
است:
{"ErrorCode" : "invalid_request", "Error" :"Refresh Token expired"}
با این حال، پاسخ مطابق با RFC این است:
{"error" : "invalid_grant", "error_description" :"refresh token expired"}