شما در حال مشاهده اسناد 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>
در چندین مورد، برنامه مشتری باید شناسه مشتری را به سرور مجوز ارسال کند. این عنصر به شما امکان می دهد مشخص کنید که Edge کجا باید برای شناسه مشتری جستجو کند. تنها مکان معتبری که میتوانید تنظیم کنید، مکان پیشفرض، متغیر جریان 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 (A X-WWW-Form-Urlencoded و در بدنه درخواست مشخص شده است) |
حضور: | اختیاری |
نوع: | رشته |
مقادیر معتبر: | هر تنظیم متغیر |
مورد استفاده با انواع کمک هزینه: | رمز عبور |
تأیید نشانه های دسترسی
هنگامی که یک نقطه پایانی توکن برای یک پروکسی API تنظیم شد ، یک خط مشی OAUTHV2 مربوطه که عملیات VerifyAccessToken
را مشخص می کند به جریان وصل می شود که منبع محافظت شده را در معرض دید قرار می دهد.
به عنوان مثال ، برای اطمینان از مجاز بودن کلیه درخواست های API ، سیاست زیر تأیید Token Access را تقویت می کند:
<OAuthV2 name="VerifyOAuthAccessToken"> <Operation>VerifyAccessToken</Operation> </OAuthV2>
این خط مشی به منبع API متصل شده است تا از آن محافظت شود. برای اطمینان از تأیید کلیه درخواست های مربوط به API ، خط مشی را به درخواست ProxyendPoint Preflow ، به شرح زیر وصل کنید:
<PreFlow> <Request> <Step><Name>VerifyOAuthAccessToken</Name></Step> </Request> </PreFlow>
از عناصر اختیاری زیر می توان برای غلبه بر تنظیمات پیش فرض برای عملیات VerifyAccessToken استفاده کرد.
نام | توضیحات |
---|---|
دامنه | لیستی از دامنه های محدود فضا. اگر حداقل یکی از اسکوپ های ذکر شده در نشانه دسترسی وجود داشته باشد ، تأیید موفقیت خواهد کرد. به عنوان مثال ، خط مشی زیر نشانه دسترسی را بررسی می کند تا اطمینان حاصل شود که حداقل یکی از اسکوپ های ذکر شده را در بر می گیرد. در صورت خواندن یا نوشتن ، تأیید موفقیت آمیز خواهد بود. <OAuthV2 name="ValidateOauthScopePolicy"> <Operation>VerifyAccessToken</Operation> <Scope>READ WRITE</Scope> </OAuthV2> |
با دسترسی | متغیری که انتظار می رود نشانه دسترسی در آن قرار داشته باشد. به عنوان مثال request.queryparam.accesstoken . به طور پیش فرض ، انتظار می رود که نشانه دسترسی توسط برنامه در عنوان HTTP مجوز ، مطابق مشخصات OAUTH 2.0 ارائه شود. اگر انتظار می رود که نشانه دسترسی در یک مکان غیر استاندارد مانند پارامتر پرس و جو یا یک عنوان 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 انجام می شود ، تعداد زیادی از متغیرهای جریان در زمینه اجرای پروکسی جمع می شوند. این متغیرها ویژگی های مربوط به نشانه دسترسی ، برنامه توسعه دهنده ، توسعه دهنده و شرکت را به شما می دهد. به عنوان مثال می توانید از خط مشی AssignMessage یا JavaScript استفاده کنید تا هر یک از این متغیرها را بخوانید و از آنها در صورت نیاز در جریان استفاده کنید. این متغیرها همچنین می توانند برای اهداف اشکال زدایی مفید باشند.
proxy.pathsuffix
) ، متغیرهای محصول API بطور خودکار جمع می شوند. به صراحت تنظیم Flow.Resource.Name متغیر لازم نیست. در جایی که محصولات API با محیط های معتبر و پروکسی های API پیکربندی نشده اند ، سپس flow.resource.name
باید صریحاً تنظیم شود تا متغیرهای محصول API را در جریان جمع کند. برای جزئیات بیشتر در مورد پیکربندی محصول ، به استفاده از API Edge Management برای انتشار API مراجعه کنید.
متغیرهای خاص توکن
متغیرها | توضیحات |
---|---|
organization_name | نام سازمانی که پروکسی در آن اجرا می کند. |
developer.id | شناسه توسعه دهنده مرتبط با برنامه مشتری ثبت شده. |
developer.app.name | نام توسعه دهنده مرتبط با برنامه مشتری ثبت شده. |
client_id | شناسه مشتری برنامه مشتری ثبت شده. |
grant_type | نوع کمک هزینه مرتبط با درخواست. |
token_type | نوع توکن مرتبط با درخواست. |
access_token | نشانه دسترسی که تأیید می شود. |
accesstoken.{custom_attribute} | یک ویژگی سفارشی نامگذاری شده در نشانه دسترسی. |
issued_at | تاریخی که نشانه دسترسی در دوره یونیکس در Milliseconds بیان شد. |
expires_in | زمان انقضا برای نشانه دسترسی. در ثانیه بیان شده است. اگرچه عنصر ExpiresIn انقضا را در میلی ثانیه ، در متغیرهای پاسخ و جریان توکن ، تعیین می کند ، اما مقدار در چند ثانیه نمایش داده می شود. |
status | وضعیت نشانه دسترسی (به عنوان مثال ، تأیید یا ابطال شده). |
scope | دامنه (در صورت وجود) مرتبط با نشانه دسترسی. |
apiproduct.<custom_attribute_name> | یک ویژگی سفارشی نامگذاری شده از محصول API مرتبط با برنامه مشتری ثبت شده. |
apiproduct.name | نام محصول API مرتبط با برنامه مشتری ثبت شده. |
revoke_reason | (فقط Apigee Hybrid) نشان می دهد که چرا نشانه دسترسی ابطال می شود. مقدار می تواند |
متغیرهای خاص برنامه
این متغیرها مربوط به برنامه توسعه دهنده است که با نشانه همراه است.
متغیرها | توضیحات |
---|---|
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 "شرکت" باشد ، آنگاه ویژگی های شرکت جمع می شوند و اگر App.apptype "توسعه دهنده" است ، ویژگی های توسعه دهنده جمع می شوند.
متغیرها | توضیحات |
---|---|
متغیرهای خاص توسعه دهنده | |
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 "شرکت" باشد ، آنگاه ویژگی های شرکت جمع می شوند و اگر App.apptype "توسعه دهنده" است ، ویژگی های توسعه دهنده جمع می شوند.
متغیرها | توضیحات |
---|---|
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 با موفقیت انجام می شود. توجه داشته باشید که متغیرهای Token Token برای اعتبار اعتبار مشتری از نوع کمک هزینه استفاده نمی کنند.
پیشوند: oauthv2accesstoken.{policy_name}.{variable_name}
مثال: oauthv2accesstoken.GenerateTokenPolicy.access_token
نام متغیر | توضیحات |
---|---|
access_token | نشانه دسترسی که تولید شده است. |
client_id | شناسه مشتری برنامه توسعه دهنده مرتبط با این نشانه. |
expires_in | مقدار انقضا برای نشانه. برای جزئیات بیشتر به عنصر <tevireSin> مراجعه کنید. توجه داشته باشید که در پاسخ ، منقضی شده در ثانیه بیان می شود. |
scope | لیست دامنه های موجود برای توکن پیکربندی شده است. به کار با Scopes 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 . |
ژنرال
این متغیرها زمانی تنظیم می شوند که عملیات GenerateAcessTokanimplicit با موفقیت برای جریان نوع کمک هزینه ضمنی انجام می شود.
پیشوند: oauthv2accesstoken.{policy_name}.{variable_name}
مثال: oauthv2accesstoken.RefreshTokenPolicy.access_token
متغیر | توضیحات |
---|---|
oauthv2accesstoken.access_token | نشانه دسترسی هنگام اجرای این سیاست ایجاد می شود. |
oauthv2accesstoken.{policy_name}.expires_in | مقدار انقضا برای نشانه ، در ثانیه. برای جزئیات بیشتر به عنصر <tevireSin> مراجعه کنید. |
ارجاع خطا
این بخش کدهای خطا و پیامهای خطایی را که برگردانده میشوند و متغیرهای خطا را که توسط 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 با یک نقطه پایانی توکن OAUTH ارائه می شود. نقطه پایانی با سیاست های موجود در پروکسی API به نام OAuth پیش تنظیم می شود. به محض ایجاد یک حساب در Edge Apigee می توانید استفاده از نقطه انتهایی Token را شروع کنید. برای جزئیات بیشتر ، به درک نقاط پایانی OAUTH مراجعه کنید.
پاکسازی نشانه های دسترسی
به طور پیش فرض ، نشانه های OAuth2 از سیستم Apigee Edge 3 روز (259200 ثانیه) پس از هر دو نشانه دسترسی و نشانه های تازه سازی (در صورت وجود) پاک می شوند. در بعضی موارد ، ممکن است بخواهید این پیش فرض را تغییر دهید. به عنوان مثال ، در صورت تولید تعداد زیادی از نشانه ها ، ممکن است بخواهید زمان پاکسازی را برای صرفه جویی در فضای دیسک کوتاه کنید.
اگر برای ابر خصوصی در حاشیه هستید ، می توانید با تنظیم ویژگی های سازمانی همانطور که در این بخش توضیح داده شده است ، این پیش فرض را تغییر دهید. .
به روزرسانی تنظیمات پاک برای 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 برای به روزرسانی ویژگی های Token Purge برای سازمان خود استفاده کنید:
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 ویژگی Purge Token را برای سازمان به نام AutomationOrganization درست می کند. در این حالت ، نشانه دسترسی از پایگاه داده 120 ثانیه پس از انقضاء توکن و Token Token پاک می شود.
رفتار غیر 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"}