Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến
Tài liệu về Apigee X. thông tin
Nội dung
OAuthV2 là một chính sách nhiều khía cạnh để thực hiện các thao tác loại cấp quyền OAuth 2.0. Đây là chính sách chính dùng để định cấu hình điểm cuối OAuth 2.0 trên Apigee Edge.
Mẹo: Nếu bạn muốn tìm hiểu thêm về OAuth trên Apigee Edge, hãy xem trang chủ OAuth. Công cụ này cung cấp đường liên kết đến tài nguyên, mẫu, video và hơn thế nữa. Xem hướng dẫn nâng cao Mẫu OAuth trên GitHub để minh hoạ rõ cách chính sách này được sử dụng trong một quá trình .
Mẫu
VerifyAccessToken
VerifyAccessToken
Cấu hình chính sách OAuthV2 này (bằng thao tác VerifyAccessToken) xác minh rằng một mã truy cập gửi đến Apigee Edge là hợp lệ. Khi thao tác chính sách này được kích hoạt, Edge sẽ tìm mã truy cập hợp lệ trong yêu cầu. Nếu mã truy cập hợp lệ, thì yêu cầu sẽ được phép tiếp tục. Nếu không hợp lệ, tất cả quá trình xử lý sẽ dừng và trả về lỗi trong của bạn.
<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>
Lưu ý: Chỉ hỗ trợ Mã thông báo mang OAuth 2.0. Xác thực thư Không hỗ trợ mã thông báo mã (MAC).
Ví dụ:
$ curl -H "Authorization: Bearer ylSkZIjbdWybfsUQe9BqP0LH5Z" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282
Theo mặc định, Edge chấp nhận mã truy cập trong tiêu đề Authorization
có
tiền tố Bearer
. Bạn có thể thay đổi chế độ mặc định này bằng <AccessToken>
.
GenerateAccessToken
Đang tạo mã truy cập
Ví dụ về cách yêu cầu mã truy cập cho từng loại quyền được hỗ trợ: hãy xem phần Yêu cầu mã truy cập và mã uỷ quyền. Chủ đề này bao gồm ví dụ về các phép toán sau:
GenerateAuthorizationCode
Tạo mã uỷ quyền
Để biết các ví dụ về cách yêu cầu mã uỷ quyền, hãy xem phần Yêu cầu mã uỷ quyền.
RefreshAccessToken
Làm mới mã truy cập
Để xem ví dụ về cách yêu cầu mã truy cập bằng mã làm mới, hãy xem phần Làm mới mã truy cập.
Mã thông báo luồng phản hồi
Tạo mã truy cập trong quy trình phản hồi
Đôi khi, bạn có thể cần phải tạo mã truy cập trong quy trình phản hồi. Ví dụ: bạn có thể thực hiện việc này để phản hồi một số xác thực tuỳ chỉnh được thực hiện trong dịch vụ phụ trợ. Trong ví dụ này, trường hợp sử dụng yêu cầu cả mã truy cập và mã làm mới, loại trừ việc cấp quyền ngầm loại. Trong trường hợp này, chúng ta sẽ sử dụng kiểu cấp mật khẩu để tạo mã thông báo. Như bạn sẽ thấy, mẹo để thực hiện công việc này là chuyển vào tiêu đề Yêu cầu ủy quyền cùng với JavaScript .
Trước tiên, hãy xem chính sách mẫu:
<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>
Nếu bạn đặt chính sách này vào quy trình phản hồi, thì chính sách sẽ không thành công kèm theo lỗi 401 UnAuthorized (Không được phép 401) ngay cả khi chính sách đã chỉ định chính xác thông số đăng nhập. Để giải quyết vấn đề này, bạn cần đặt tiêu đề Yêu cầu uỷ quyền.
Tiêu đề Uỷ quyền phải chứa giao thức truy cập Cơ bản có mã hoá Base64 client_id:client_secret.
Bạn có thể thêm tiêu đề này bằng chính sách JavaScript được đặt ngay trước chính sách OAuthV2, như thế này. "local_clientid" và "local_secret" các biến phải được thiết lập trước đó và có sẵn trong luồng:
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)));
Xem thêm "Mã hóa cơ bản thông tin xác thực".
Tài liệu tham khảo phần tử
Tài liệu tham khảo chính sách này mô tả các thành phần và thuộc tính của chính sách OAuthV2.
Chính sách mẫu hiển thị bên dưới là một trong nhiều cấu hình có thể có. Mẫu này cho thấy Đã định cấu hình chính sách OAuthV2 cho hoạt động GenerateAccessToken. Trong đó có các trường bắt buộc và các phần tử không bắt buộc. Hãy tham khảo nội dung mô tả về phần tử trong phần này để biết thông tin chi tiết.
<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> thuộc tính
<OAuthV2 async="false" continueOnError="false" enabled="true" name="MyOAuthPolicy">
Bảng sau đây mô tả những thuộc tính chung cho tất cả phần tử mẹ của chính sách:
Thuộc tính | Mô tả | Mặc định | Sự hiện diện |
---|---|---|---|
name |
Tên nội bộ của chính sách. Giá trị của thuộc tính (Không bắt buộc) Bạn có thể dùng phần tử |
Không áp dụng | Bắt buộc |
continueOnError |
Đặt thành Đặt thành |
false | Không bắt buộc |
enabled |
Hãy đặt thành Đặt thành |
đúng | Không bắt buộc |
async |
Thuộc tính này không được dùng nữa. |
false | Không được dùng nữa |
<DisplayName> phần tử
Hãy sử dụng cùng với thuộc tính name
để gắn nhãn chính sách trong phần
trình chỉnh sửa proxy giao diện người dùng quản lý có tên ngôn ngữ tự nhiên khác.
<DisplayName>Policy Display Name</DisplayName>
Mặc định |
Không áp dụng Nếu bạn bỏ qua phần tử này, giá trị của thuộc tính |
---|---|
Sự hiện diện | Không bắt buộc |
Loại | Chuỗi |
<AccessToken> phần tử
<AccessToken>request.header.access_token</AccessToken>
Theo mặc định, VerifyAccessToken dự kiến gửi mã truy cập trong Authorization
.
Bạn có thể thay đổi giá trị mặc định đó bằng phần tử này. Cho
ví dụ request.queryparam.access_token
cho biết mã truy cập
phải hiển thị dưới dạng tham số truy vấn có tên access_token
.
<AccessToken>request.header.access_token</AccessToken>
được chỉ định:
curl https://myorg-myenv.apigee.net/oauth2/validate -H "access_token:Rft3dqrs56Blirls56a"Ví dụ về vị trí của
<AccessToken>request.queryparam.access_token</AccessToken>
được chỉ định:
curl "https://myorg-myenv.apigee.net/oauth2/validate?access_token:Rft3dqrs56Blirls56a"
Mặc định: |
Không áp dụng |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Dùng với thao tác: |
|
<AccessTokenPrefix> phần tử
<AccessTokenPrefix>Bearer</AccessTokenPrefix>
Theo mặc định, VerifyAccessToken yêu cầu gửi mã thông báo truy cập trong tiêu đề Uỷ quyền làm mã thông báo Bearer. Ví dụ:
-H "Authorization: Bearer Rft3dqrs56Blirls56a"
Hiện tại, Bearer là tiền tố duy nhất được hỗ trợ.
Mặc định: |
Sóng mang |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: |
Sóng mang |
Dùng với thao tác: |
|
<AppEndUser> phần tử
<AppEndUser>request.queryparam.app_enduser</AppEndUser>
Trong trường hợp mã nhận dạng người dùng cuối của ứng dụng phải được gửi đến máy chủ uỷ quyền, phần tử này sẽ cho phép bạn chỉ định nơi Edge sẽ tìm mã nhận dạng người dùng cuối. Ví dụ: bản ghi có thể được gửi dưới dạng truy vấn hoặc trong tiêu đề HTTP.
Ví dụ: request.queryparam.app_enduser
cho biết rằng
AppEndUser phải xuất hiện dưới dạng tham số truy vấn, vì
ví dụ: ?app_enduser=ntesla@theramin.com
. Để yêu cầu AppEndUser trong một HTTP
đầu trang, ví dụ: đặt giá trị này thành request.header.app_enduser
.
Khi cung cấp chế độ cài đặt này, bạn có thể thêm mã nhận dạng người dùng cuối của ứng dụng vào mã truy cập. Chiến dịch này rất hữu ích nếu bạn muốn có thể truy xuất hoặc thu hồi mã truy cập OAuth 2.0 mã nhận dạng người dùng. Để biết thêm thông tin, hãy xem Bật tính năng truy xuất và thu hồi mã truy cập OAuth 2.0 theo mã nhận dạng người dùng cuối, mã ứng dụng hoặc cả hai.
Mặc định: |
Không áp dụng |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: |
Bất kỳ biến luồng nào có thể truy cập vào chính sách này trong thời gian chạy. |
Dùng với các loại quyền: |
|
<Attributes/Attribute>
<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>
Sử dụng phần tử này để thêm các thuộc tính tuỳ chỉnh vào mã truy cập hoặc mã uỷ quyền. Cho ví dụ: bạn nên nhúng mã nhận dạng người dùng hoặc giá trị nhận dạng phiên vào một mã truy cập có thể được trích xuất và kiểm tra trong thời gian chạy.
Phần tử này cho phép bạn chỉ định một giá trị trong một biến luồng hoặc từ một chuỗi cố định. Nếu bạn chỉ định cả biến và chuỗi, thì giá trị được chỉ định trong biến luồng sẽ được sử dụng. Nếu không thể phân giải biến, khi đó chuỗi sẽ là mặc định.
Để biết thêm thông tin về cách sử dụng phần tử này, hãy xem bài viết Tuỳ chỉnh mã thông báo và Mã uỷ quyền.
Hiển thị hoặc ẩn các thuộc tính tuỳ chỉnh trong phản hồi
Hãy nhớ rằng nếu bạn đặt phần tử GenerateResponse của chính sách này thành true, bản trình bày JSON đầy đủ của mã thông báo sẽ được trả về trong phản hồi, bao gồm bất kỳ tuỳ chỉnh mà bạn đã đặt. Trong một số trường hợp, bạn có thể muốn ẩn một số hoặc tất cả trong phản hồi để các thuộc tính đó không hiển thị với các ứng dụng khách.
Theo mặc định, các thuộc tính tuỳ chỉnh sẽ xuất hiện trong phản hồi. Nếu muốn ẩn quảng cáo, bạn có thể đặt thông số display thành false. Ví dụ:
<Attributes> <Attribute name="employee_id" ref="employee.id" display="false"/> <Attribute name="employee_name" ref="employee.name" display="false"/> </Attributes>
Giá trị của thuộc tính display
không
duy trì. Giả sử bạn tạo một mã truy cập có các thuộc tính tuỳ chỉnh mà bạn muốn ẩn trong
tạo phản hồi. Việc thiết lập display=false
sẽ giúp bạn đạt được mục tiêu đó. Tuy nhiên, nếu một người dùng mới
mã truy cập được tạo sau đó bằng mã làm mới, các thuộc tính tuỳ chỉnh ban đầu từ
mã truy cập sẽ xuất hiện trong phản hồi mã làm mới. Lý do là vì Edge không nhớ điều đó
ban đầu, thuộc tính display
được đặt thành false
trong chính sách tạo mã truy cập--tuỳ chỉnh
chỉ là một phần trong siêu dữ liệu của mã truy cập.
Bạn sẽ thấy hành vi tương tự nếu bạn thêm các thuộc tính tùy chỉnh vào mã uỷ quyền--khi một mã truy cập được tạo bằng mã đó, các thuộc tính tuỳ chỉnh đó sẽ xuất hiện trong mã truy cập của bạn. Xin nhắc lại, đây có thể không phải là hành vi bạn mong muốn.
Để ẩn các mục tuỳ chỉnh trong những trường hợp này, bạn có các lựa chọn sau:
- Đặt lại rõ ràng các thuộc tính tuỳ chỉnh trong chính sách về mã làm mới và đặt màn hình của các thuộc tính đó thành false. Trong trường hợp này, bạn có thể cần phải truy xuất các giá trị tuỳ chỉnh ban đầu từ các mã truy cập bằng chính sách GetOAuthV2Info.
- Sử dụng chính sách JavaScript hậu xử lý để trích xuất các thuộc tính tuỳ chỉnh mà bạn không muốn xem trong phản hồi.
Hãy xem thêm bài viết Tuỳ chỉnh mã thông báo và Mã uỷ quyền.
Mặc định: |
|
Sự hiện diện: |
Không bắt buộc |
Giá trị hợp lệ: |
|
Dùng với các loại quyền: |
|
<ClientId> phần tử
<ClientId>request.formparam.client_id</ClientId>
Trong một số trường hợp, ứng dụng khách phải gửi mã ứng dụng khách đến máy chủ uỷ quyền. Chiến dịch này
cho phép bạn chỉ định nơi Edge sẽ tìm ID ứng dụng khách. Chỉ số hợp lệ
vị trí mà bạn có thể đặt là vị trí mặc định
vị trí, biến luồng request.formparam.client_id
. Đang cài đặt ClientId
với bất kỳ biến nào khác không được hỗ trợ.
Xem thêm phần Yêu cầu mã truy cập và uỷ quyền
mã.
Mặc định: |
request.formparam.client_id (một x-www-form-urlcoded và được chỉ định trong yêu cầu nội dung) |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: | Biến luồng: request.formparam.client_id |
Dùng với các loại quyền: |
Cũng có thể được sử dụng với thao tác GenerateLicenseCode. |
<Code> phần tử
<Code>request.queryparam.code</Code>
Trong quy trình loại cấp uỷ quyền, khách hàng phải gửi mã uỷ quyền cho máy chủ uỷ quyền (Apigee Edge). Phần tử này cho phép bạn chỉ định nơi Edge sẽ tìm kiếm mã uỷ quyền. Ví dụ: mã có thể được gửi dưới dạng tham số truy vấn, tiêu đề HTTP hoặc biểu mẫu tham số (mặc định).
Biến request.queryparam.auth_code
cho biết rằng
mã uỷ quyền phải hiển thị dưới dạng tham số truy vấn, giống như đối với
ví dụ: ?auth_code=AfGlvs9
. Để yêu cầu mã uỷ quyền trong HTTP
đầu trang, ví dụ: đặt giá trị này thành request.header.auth_code
. Xem thêm
Yêu cầu mã truy cập và
mã uỷ quyền.
Mặc định: |
request.formparam.code (a x-www-form-url encrypted và được chỉ định trong nội dung yêu cầu) |
Sự hiện diện: |
tùy chọn |
Loại: | Chuỗi |
Giá trị hợp lệ: | Bất kỳ biến luồng nào có thể truy cập vào chính sách này trong thời gian chạy |
Dùng với các loại quyền: | authorization_code |
<ExpiresIn> phần tử
<ExpiresIn>10000</ExpiresIn>
Áp dụng thời gian hết hạn của mã truy cập và mã uỷ quyền tính bằng mili giây. (Đối với
mã làm mới, hãy sử dụng <RefreshTokenExpiresIn>
.) Giá trị thời gian hết hạn là
giá trị do hệ thống tạo cùng với giá trị <ExpiresIn>
. Nếu
<ExpiresIn>
được đặt thành -1, mã thông báo hoặc mã sẽ hết hạn theo thời hạn tối đa của mã truy cập OAuth.
Nếu bạn không chỉ định <ExpiresIn>
, hệ thống sẽ áp dụng một
giá trị mặc định được định cấu hình ở cấp hệ thống.
Thời gian hết hạn cũng có thể được đặt trong thời gian chạy bằng cách sử dụng giá trị mặc định, được cố định giá trị trong mã hoặc bằng
khi tham chiếu đến một biến luồng. Ví dụ: bạn có thể lưu trữ giá trị thời hạn của mã thông báo trong một khoá-giá trị
ánh xạ, truy xuất dữ liệu, gán biến cho một biến và tham chiếu đến biến đó trong chính sách. Ví dụ:
kvm.oauth.expires_in
.
Với Apigee Edge dành cho Cloud Public, Edge giúp bạn các thực thể sau trong bộ nhớ đệm trong tối thiểu 180 giây sau khi các thực thể được truy cập.
- Mã truy cập OAuth. Tức là mã thông báo bị thu hồi vẫn có thể thành công trong tối đa 3 mã phút cho đến khi giới hạn bộ nhớ đệm hết hạn.
- Thực thể Dịch vụ quản lý khoá (KMS) (Ứng dụng, Nhà phát triển, Sản phẩm API).
- Thuộc tính tuỳ chỉnh trên mã thông báo OAuth và thực thể KMS.
Đoạn văn sau đây cũng chỉ định một biến luồng và một giá trị mặc định. Lưu ý rằng quy trình giá trị của biến được ưu tiên hơn giá trị mặc định đã chỉ định.
<ExpiresIn ref="kvm.oauth.expires_in"> 3600000 <!--default value in milliseconds--> </ExpiresIn>
Edge không hỗ trợ cách buộc một mã thông báo hết hạn sau khi tạo. Nếu bạn cần buộc mã thông báo hết hạn (ví dụ: dựa trên một điều kiện), một giải pháp khả thi là được mô tả trong bài đăng này trên thẻ Cộng đồng Apigee.
Theo mặc định, những mã truy cập đã hết hạn sẽ bị xoá hoàn toàn khỏi Apigee Hệ thống Edge sẽ tự động cập nhật sau 3 ngày kể từ khi hết hạn. Xem thêm bài viết Yêu cầu xoá quyền truy cập mã thông báo
Đám mây riêng tư: Đối với việc cài đặt Edge dành cho Đám mây riêng tư, lựa chọn mặc định
do thuộc tính conf_keymanagement_oauth_auth_code_expiry_time_in_millis
đặt.
Cách đặt tài sản này:
- Mở tệp
message-processor.properties
trong trình chỉnh sửa. Nếu tệp không tồn tại, hãy tạo tệp:vi /opt/apigee/customer/application/message-processor.properties
- Đặt thuộc tính như mong muốn:
conf_keymanagement_oauth_auth_code_expiry_time_in_millis=3600000
- Đảm bảo rằng tệp thuộc tính thuộc sở hữu của "apigee" người dùng:
chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- Khởi động lại Trình xử lý thư.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
Mặc định: |
Nếu không được chỉ định, hệ thống sẽ áp dụng một giá trị mặc định được định cấu hình ở hệ thống cấp độ. |
Sự hiện diện: |
Không bắt buộc |
Loại: | Số nguyên |
Giá trị hợp lệ: |
|
Dùng với các loại quyền: |
Cũng được dùng cùng với hoạt động GeneratePermissionCode. |
<ExternalAccessToken> phần tử
<ExternalAccessToken>request.queryparam.external_access_token</ExternalAccessToken>
Cho Apigee Edge biết nơi tìm mã truy cập bên ngoài (mã truy cập không được tạo bởi Apigee Edge).
Biến request.queryparam.external_access_token
cho biết rằng
mã truy cập bên ngoài sẽ xuất hiện dưới dạng tham số truy vấn, như đối với
ví dụ: ?external_access_token=12345678
. Để yêu cầu mã truy cập bên ngoài
trong tiêu đề HTTP, ví dụ: đặt giá trị này
thành request.header.external_access_token
. Xem thêm bài viết Sử dụng OAuth của bên thứ ba
Mã thông báo.
<ExternalAuthorization> phần tử
<ExternalAuthorization>true</ExternalAuthorization>
Nếu phần tử này sai hoặc không có, thì Edge sẽ xác thực client_id và client_secret thường nhắm đến cửa hàng uỷ quyền Apigee Edge. Sử dụng phần tử này khi bạn muốn làm việc với mã thông báo OAuth của bên thứ ba. Để biết chi tiết về cách sử dụng phần tử này, hãy xem phần Sử dụng OAuth của bên thứ ba Mã thông báo.
Mặc định: |
false |
Sự hiện diện: |
Không bắt buộc |
Loại: | Boolean |
Giá trị hợp lệ: | true hoặc false |
Dùng với các loại quyền: |
|
<ExternalAuthorizationCode> phần tử
<ExternalAuthorizationCode>request.queryparam.external_auth_code</ExternalAuthorizationCode>
Cho Apigee Edge biết nơi tìm mã xác thực bên ngoài (mã xác thực không được tạo bởi Apigee Edge).
Biến request.queryparam.external_auth_code
cho biết rằng
mã xác thực bên ngoài phải hiển thị dưới dạng tham số truy vấn, như đối với
ví dụ: ?external_auth_code=12345678
. Để yêu cầu xác thực bên ngoài
mã
trong tiêu đề HTTP, ví dụ: đặt giá trị này
thành request.header.external_auth_code
. Xem thêm bài viết Sử dụng OAuth của bên thứ ba
Mã thông báo.
<ExternalRefreshToken> phần tử
<ExternalRefreshToken>request.queryparam.external_refresh_token</ExternalRefreshToken>
Cho Apigee Edge biết nơi tìm mã làm mới bên ngoài (mã làm mới không được tạo bởi Apigee Edge).
Biến request.queryparam.external_refresh_token
cho biết rằng
mã làm mới bên ngoài sẽ xuất hiện dưới dạng tham số truy vấn, như đối với
ví dụ: ?external_refresh_token=12345678
. Để yêu cầu mã làm mới bên ngoài
trong tiêu đề HTTP, ví dụ: đặt giá trị này
thành request.header.external_refresh_token
. Xem thêm bài viết Sử dụng OAuth của bên thứ ba
Mã thông báo.
<GenerateResponse> phần tử
<GenerateResponse enabled='true'/>
Nếu bạn đặt thành true
, chính sách này sẽ tạo và trả về một phản hồi. Ví dụ: đối với
CreateAccessToken, phản hồi có thể có dạng như sau:
{ "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" }
Nếu giá trị là false
, thì sẽ không có phản hồi nào được gửi. Thay vào đó, một nhóm biến luồng được điền sẵn
có các giá trị liên quan đến chức năng của chính sách. Ví dụ: biến luồng có tên là
oauthv2authcode.OAuthV2-GenerateAuthorizationCode.code
được điền sẵn thông tin
mã uỷ quyền được tạo. Xin lưu ý rằng expires_in được biểu thị bằng giây trong giá trị
của bạn.
Mặc định: |
false |
Sự hiện diện: |
Không bắt buộc |
Loại: | string |
Giá trị hợp lệ: | true hoặc false |
Dùng với các loại quyền: |
|
<GenerateErrorResponse> phần tử
<GenerateErrorResponse enabled='true'/>
Nếu bạn đặt thành true
, chính sách này sẽ tạo và trả về phản hồi nếu
Thuộc tính ContinueOnError được đặt thành true. Nếu false
(mặc định), không
đã gửi phản hồi. Thay vào đó, một nhóm biến luồng được điền sẵn các giá trị liên quan đến
chức năng của chính sách.
Mặc định: |
false |
Sự hiện diện: |
Không bắt buộc |
Loại: | string |
Giá trị hợp lệ: | true hoặc false |
Dùng với các loại quyền: |
|
<GrantType>
<GrantType>request.queryparam.grant_type</GrantType>
Cho chính sách biết nơi tìm thông số loại cấp quyền được chuyển trong một yêu cầu. Theo thông số OAuth 2.0, loại cấp quyền phải được cung cấp cùng với yêu cầu về mã truy cập và mã uỷ quyền. Biến có thể là tiêu đề, tham số truy vấn hoặc tham số biểu mẫu (mặc định).
Ví dụ: request.queryparam.grant_type
cho biết rằng Mật khẩu
sẽ xuất hiện dưới dạng tham số truy vấn, chẳng hạn như ?grant_type=password
.
Ví dụ: để yêu cầu loại cấp quyền trong tiêu đề HTTP, hãy đặt giá trị này
thành request.header.grant_type
. Xem thêm phần Yêu cầu mã truy cập và uỷ quyền
mã.
Mặc định: |
request.formparam.grants_type (x-www-form-url encrypted và được chỉ định trong yêu cầu nội dung) |
Sự hiện diện: |
Không bắt buộc |
Loại: | string |
Giá trị hợp lệ: | Một biến, như đã giải thích ở trên. |
Dùng với các loại quyền: |
|
<Operation> phần tử
<Operation>GenerateAuthorizationCode</Operation>
Chính sách này đã thực thi thao tác OAuth 2.0.
Mặc định: |
Nếu bạn không chỉ định |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: |
|
<PassWord> phần tử
<PassWord>request.queryparam.password</PassWord>
Phần tử này được dùng với chỉ loại cấp mật khẩu. Bằng
loại cấp mật khẩu, thông tin xác thực của người dùng (mật khẩu và tên người dùng) phải được cung cấp cho
Chính sách OAuthV2. Các phần tử <PassWord>
và <UserName>
là
dùng để chỉ định những biến mà Edge có thể tìm thấy các giá trị này. Nếu các yếu tố này không được chỉ định,
chính sách yêu cầu tìm các giá trị (theo mặc định) trong các tham số biểu mẫu có tên là username
và password
. Nếu không tìm thấy giá trị, chính sách sẽ gửi thông báo lỗi. Bạn có thể sử dụng
các phần tử <PassWord>
và <UserName>
để tham chiếu đến bất kỳ
biến luồng chứa thông tin xác thực.
Ví dụ: bạn có thể chuyển mật khẩu vào yêu cầu mã thông báo bằng cách sử dụng tham số truy vấn và đặt
như sau:
<PassWord>request.queryparam.password</PassWord>
.
Đến
yêu cầu mật khẩu trong tiêu đề HTTP, hãy đặt giá trị này
đến request.header.password
.
Chính sách OAuthV2 không thực hiện bất kỳ hành động nào khác đối với các giá trị thông tin xác thực này; Edge đơn giản là xác minh rằng chúng có mặt. Nhà phát triển API có quyền truy xuất yêu cầu giá trị và gửi mã đó đến một nhà cung cấp danh tính trước khi thực thi chính sách tạo mã thông báo.
Xem thêm bài viết Yêu cầu mã truy cập và mã uỷ quyền.
Mặc định: |
request.formparam.password (x-www-form-urlcoded và được chỉ định trong yêu cầu nội dung) |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: | Bất kỳ biến luồng nào có sẵn cho chính sách trong thời gian chạy. |
Dùng với các loại quyền: | mật khẩu |
<RedirectUri> phần tử
<RedirectUri>request.queryparam.redirect_uri</RedirectUri>
Chỉ định vị trí Edge sẽ tìm kiếm tham số redirect_uri
trong
của bạn.
Giới thiệu về URI chuyển hướng
URI chuyển hướng được dùng cùng với mã uỷ quyền và các loại cấp quyền ngầm ẩn. Lệnh chuyển hướng URI cho máy chủ uỷ quyền (Edge) biết nơi gửi mã uỷ quyền (đối với mã xác thực) cấp quyền) hoặc mã truy cập (đối với loại cấp quyền ngầm ẩn). Bạn cần phải hiểu rõ khi nào tham số là bắt buộc, khi nào là không bắt buộc và cách sử dụng tham số:
-
(bắt buộc) Nếu URL gọi lại được đăng ký với ứng dụng của nhà phát triển được liên kết với khoá ứng dụng của yêu cầu và nếu
redirect_uri
có trong yêu cầu, thì hai số đó phải khớp chính xác. Nếu không khớp, hệ thống sẽ trả về lỗi. Để biết thông tin về cách đăng ký ứng dụng của nhà phát triển trên Edge và chỉ định URL gọi lại, hãy xem bài viết Đăng ký ứng dụng và quản lý API khoá. - (không bắt buộc) Nếu một URL gọi lại đã được đăng ký và thiếu
redirect_uri
từ yêu cầu, thì Edge sẽ chuyển hướng đến URL gọi lại đã đăng ký. - (bắt buộc) Nếu URL gọi lại chưa được đăng ký, thì
redirect_uri
sẽ là bắt buộc. Xin lưu ý rằng trong trường hợp này, Edge sẽ chấp nhận BẤT KỲ URL nào. Trường hợp này có thể đưa ra vấn đề bảo mật, và do đó chỉ nên được sử dụng với khách hàng đáng tin cậy của chúng tôi. Nếu ứng dụng khách không đáng tin cậy thì phương pháp hay nhất là luôn yêu cầu đăng ký một URL gọi lại.
Bạn có thể gửi tham số này trong một tham số truy vấn hoặc trong một tiêu đề. Chiến lược phát hành đĩa đơn
biến request.queryparam.redirect_uri
cho biết RedirectUri
sẽ xuất hiện dưới dạng tham số truy vấn, vì
ví dụ: ?redirect_uri=login.myapp.com
. Để yêu cầu RedirectUri trong HTTP
đầu trang, ví dụ: đặt giá trị này thành request.header.redirect_uri
. Xem
Yêu cầu mã truy cập và
mã uỷ quyền.
Mặc định: |
request.formparam.redirect_uri (một x-www-form-urlcoded và được chỉ định trong yêu cầu nội dung) |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: | Bất kỳ biến luồng nào có thể truy cập được trong chính sách trong thời gian chạy |
Dùng với các loại quyền: |
Cũng được sử dụng cùng với hoạt động GeneratePermissionCode. |
<RefreshToken> phần tử
<RefreshToken>request.queryparam.refreshtoken</RefreshToken>
Khi yêu cầu mã làm mới bằng mã làm mới, bạn phải cung cấp mã làm mới trong yêu cầu. Phần tử này cho phép bạn chỉ định nơi Edge sẽ tìm mã làm mới. Cho ví dụ: mã có thể được gửi dưới dạng tham số truy vấn, tiêu đề HTTP hoặc tham số biểu mẫu (mặc định).
Biến request.queryparam.refreshtoken
cho biết quá trình làm mới
mã thông báo sẽ được hiển thị dưới dạng tham số truy vấn, vì
ví dụ: ?refresh_token=login.myapp.com
. Để yêu cầu RefreshToken trong HTTP
đầu trang, ví dụ: đặt giá trị này thành request.header.refresh_token
. Xem
Yêu cầu mã truy cập và
mã uỷ quyền.
Mặc định: |
request.formparam.refresh_token (một x-www-form-urlcoded và được chỉ định trong yêu cầu nội dung) |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: | Bất kỳ biến luồng nào có thể truy cập được trong chính sách trong thời gian chạy |
Dùng với các loại quyền: |
|
<RefreshTokenExpiresIn> phần tử
<RefreshTokenExpiresIn>1000</RefreshTokenExpiresIn>
Thực thi thời gian hết hạn của mã thông báo làm mới tính bằng mili giây. Giá trị thời gian hết hạn là một hệ thống
giá trị đã tạo cộng với giá trị <RefreshTokenExpiresIn>
. Nếu
<RefreshTokenExpiresIn>
được đặt thành -1, mã làm mới
hết hạn theo thời hạn tối đa của mã làm mới OAuth. Nếu không chỉ định <RefreshTokenExpiresIn>
,
hệ thống sẽ áp dụng một giá trị mặc định được định cấu hình ở cấp hệ thống. Liên hệ với Bộ phận hỗ trợ Apigee Edge để biết thêm thông tin
thông tin về các chế độ cài đặt mặc định của hệ thống.
Thời gian hết hạn cũng có thể được đặt trong thời gian chạy bằng cách sử dụng giá trị mặc định, được cố định giá trị trong mã hoặc bằng
khi tham chiếu đến một biến luồng. Ví dụ: bạn có thể lưu trữ giá trị thời hạn của mã thông báo trong một khoá-giá trị
ánh xạ, truy xuất dữ liệu, gán biến cho một biến và tham chiếu đến biến đó trong chính sách. Cho
ví dụ: kvm.oauth.expires_in
.
Đoạn văn sau đây cũng chỉ định một biến luồng và một giá trị mặc định. Lưu ý rằng quy trình giá trị của biến được ưu tiên hơn giá trị mặc định đã chỉ định.
<RefreshTokenExpiresIn ref="kvm.oauth.expires_in"> 3600000 <!--default value in milliseconds--> </RefreshTokenExpiresIn>
Đám mây riêng tư: Đối với việc cài đặt Edge dành cho Đám mây riêng tư, lựa chọn mặc định
do thuộc tính conf_keymanagement_oauth_refresh_token_expiry_time_in_millis
đặt.
Cách đặt tài sản này:
- Mở tệp
message-processor.properties
trong trình chỉnh sửa. Nếu tệp không tồn tại, hãy tạo tệp:vi /opt/apigee/customer/application/message-processor.properties
- Đặt thuộc tính như mong muốn:
conf_keymanagement_oauth_refresh_token_expiry_time_in_millis=3600000
- Đảm bảo rằng tệp thuộc tính thuộc sở hữu của "apigee" người dùng:
chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- Khởi động lại Trình xử lý thư.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
Mặc định: |
63072000000 mili giây (2 năm) (có hiệu lực từ ngày 5 tháng 8 năm 2024) |
Sự hiện diện: |
Không bắt buộc |
Loại: | Số nguyên |
Giá trị hợp lệ: |
|
Dùng với các loại quyền: |
|
<ResponseType> phần tử
<ResponseType>request.queryparam.response_type</ResponseType>
Phần tử này thông báo cho Edge biết loại cấp quyền mà ứng dụng khách đang yêu cầu. Chỉ dùng với mã uỷ quyền và các luồng loại cấp quyền ngầm ẩn.
Theo mặc định, Edge sẽ tìm giá trị loại phản hồi trong một truy vấn response_type
. Nếu bạn muốn ghi đè chế độ mặc định này, hãy sử dụng <ResponseType> thành phần tử
định cấu hình biến luồng chứa giá trị loại phản hồi. Ví dụ: nếu bạn đặt thuộc tính này
với request.header.response_type
, Edge sẽ tìm loại phản hồi
được chuyển vào tiêu đề yêu cầu. Xem thêm phần Yêu cầu mã truy cập và uỷ quyền
mã.
Mặc định: |
request.formparam.response_type (một x-www-form-urlcoded và được chỉ định trong yêu cầu nội dung) |
Sự hiện diện: |
Không bắt buộc. Sử dụng phần tử này nếu bạn muốn ghi đè hành vi mặc định. |
Loại: | Chuỗi |
Giá trị hợp lệ: | code (đối với loại cấp mã uỷ quyền) hoặc token
(đối với loại cấp quyền ngầm) |
Dùng với các loại quyền: |
|
<ReuseRefreshToken> phần tử
<ReuseRefreshToken>true</ReuseRefreshToken>
Khi bạn đặt thành true
, mã làm mới hiện có sẽ được sử dụng lại cho đến khi hết hạn. Nếu
false
thân mến, mã làm mới mới do Apigee Edge cấp khi mã làm mới hợp lệ là
trình bày.
Mặc định: |
|
Sự hiện diện: |
tùy chọn |
Loại: | boolean |
Giá trị hợp lệ: |
|
Được dùng với loại quyền: |
|
<Scope> phần tử
<Scope>request.queryparam.scope</Scope>
Nếu phần tử này hiện diện ở một trong các GenerateAccessToken hoặc Generateuỷ quyền
chính sách này, trường này được dùng để chỉ định phạm vi cấp mã thông báo hoặc mã. Các giá trị này là
thường được chuyển đến chính sách trong yêu cầu từ ứng dụng khách. Bạn có thể định cấu hình phần tử này để
lấy một biến luồng, cho phép bạn chọn cách truyền phạm vi trong một yêu cầu. Trong
trong ví dụ sau, request.queryparam.scope
cho biết phạm vi phải
xuất hiện dưới dạng tham số truy vấn, ví dụ như ?scope=READ
. Để yêu cầu
phạm vi trong tiêu đề HTTP. Ví dụ: đặt giá trị này
thành request.header.scope
.
Nếu phần tử này xuất hiện trong một "VerifyAccessToken" chính sách, sau đó nó được dùng để chỉ định mà chính sách sẽ thực thi. Trong loại chính sách này, giá trị phải được "mã hoá cứng" phạm vi name -- bạn không thể sử dụng biến. Ví dụ:
<Scope>A B</Scope>
Xem thêm bài viết Làm việc với OAuth2 phạm vi và Yêu cầu mã truy cập và mã uỷ quyền.
Mặc định: |
Không có phạm vi |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: |
Nếu được sử dụng cùng với chính sách Generate*, thì biến luồng. Nếu được sử dụng với VerifyAccessToken, một danh sách tên phạm vi (chuỗi) được phân tách bằng dấu cách. |
Dùng với các loại quyền: |
|
<State> phần tử
<State>request.queryparam.state</State>
Trong trường hợp ứng dụng khách phải gửi thông tin trạng thái đến máy chủ uỷ quyền, phần tử này cho phép bạn chỉ định nơi Edge sẽ tìm kiếm các giá trị trạng thái. Ví dụ: việc này có thể sẽ được gửi dưới dạng tham số truy vấn hoặc trong tiêu đề HTTP. Giá trị trạng thái thường được dùng như biện pháp bảo mật để ngăn chặn các cuộc tấn công CSRF.
Ví dụ: request.queryparam.state
cho biết trạng thái phải là
hiển thị dưới dạng tham số truy vấn, ví dụ như ?state=HjoiuKJH32
. Để yêu cầu
trạng thái trong tiêu đề HTTP, ví dụ: đặt giá trị này
thành request.header.state
. Xem thêm Xem thêm phần Yêu cầu mã truy cập và uỷ quyền
mã.
Mặc định: |
Không có tiểu bang nào |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: | Bất kỳ biến luồng nào có thể truy cập vào chính sách này trong thời gian chạy |
Dùng với các loại quyền: |
|
<StoreToken> phần tử
<StoreToken>true</StoreToken>
Đặt phần tử này thành true
khi <ExternalAuthorization>
là phần tử true
. Phần tử <StoreToken>
yêu cầu Apigee Edge
và lưu trữ mã truy cập bên ngoài. Nếu không, dữ liệu đó sẽ không được duy trì.
Mặc định: |
false |
Sự hiện diện: |
Không bắt buộc |
Loại: | Boolean |
Giá trị hợp lệ: | true hoặc false |
Dùng với các loại quyền: |
|
<SupportedGrantTypes>/<GrantType> phần tử
<SupportedGrantTypes> <GrantType>authorization_code</GrantType> <GrantType>client_credentials</GrantType> <GrantType>implicit</GrantType> <GrantType>password</GrantType> </SupportedGrantTypes>
Chỉ định các loại quyền mà điểm cuối của mã thông báo OAuth trên Apigee Edge hỗ trợ. Một điểm cuối có thể
hỗ trợ nhiều loại quyền cấp (nghĩa là bạn có thể định cấu hình một điểm cuối duy nhất để phân phối quyền truy cập
mã thông báo cho nhiều loại cấp quyền.) Để biết thêm thông tin về các điểm cuối, hãy xem bài viết Tìm hiểu về OAuth
điểm cuối. Loại cấp quyền được chuyển vào yêu cầu mã thông báo trong grant_type
.
Nếu bạn không chỉ định loại tài trợ được hỗ trợ nào, thì các loại tài trợ được phép duy nhất là
authorization_code
và implicit
. Hãy xem thêm phần tử <GrantType> (một phần tử cấp cao hơn được dùng để
chỉ định vị trí mà Apigee Edge sẽ tìm thông số grant_type
được truyền vào
một yêu cầu của máy khách. Edge sẽ đảm bảo rằng giá trị của tham số grant_type
khớp với một trong các loại tài trợ được hỗ trợ).
Mặc định: |
_mã _uỷ quyền và ngầm ẩn |
Sự hiện diện: |
Bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: |
|
<Tokens>/<Token> phần tử
Được dùng với các hoạt động ValidateToken và InvalidateToken. Hãy xem thêm phần Phê duyệt và
thu hồi mã truy cập. <Token> là phần tử xác định biến luồng giúp xác định
nguồn của mã thông báo cần thu hồi. Nếu nhà phát triển dự kiến sẽ gửi mã truy cập dưới dạng
tham số truy vấn có tên access_token
, ví dụ:
sử dụng request.queryparam.access_token
.
<UserName> phần tử
<UserName>request.queryparam.user_name</UserName>
Phần tử này được dùng với chỉ loại cấp mật khẩu. Bằng
loại cấp mật khẩu, thông tin xác thực của người dùng (mật khẩu và tên người dùng) phải được cung cấp cho
Chính sách OAuthV2. Các phần tử <PassWord>
và <UserName>
là
dùng để chỉ định những biến mà Edge có thể tìm thấy các giá trị này. Nếu các yếu tố này không được chỉ định,
chính sách yêu cầu tìm các giá trị (theo mặc định) trong các tham số biểu mẫu có tên là username
và password
. Nếu không tìm thấy giá trị, chính sách sẽ gửi thông báo lỗi. Bạn có thể sử dụng
các phần tử <PassWord>
và <UserName>
để tham chiếu đến bất kỳ
biến luồng chứa thông tin xác thực.
Ví dụ: bạn có thể chuyển tên người dùng vào tham số truy vấn và đặt tham số
Phần tử <UserName>
như sau:
<UserName>request.queryparam.username</UserName>
.
Để yêu cầu
tên người dùng trong tiêu đề HTTP, hãy đặt giá trị này
đến request.header.username
.
Chính sách OAuthV2 không thực hiện bất kỳ hành động nào khác đối với các giá trị thông tin xác thực này; Edge đơn giản là xác minh rằng chúng có mặt. Nhà phát triển API có quyền truy xuất yêu cầu giá trị và gửi mã đó đến một nhà cung cấp danh tính trước khi thực thi chính sách tạo mã thông báo.
Xem thêm bài viết Yêu cầu mã truy cập và mã uỷ quyền.
Mặc định: |
request.formparam.username (x-www-form-url lịch được chỉ định trong yêu cầu nội dung) |
Sự hiện diện: |
Không bắt buộc |
Loại: | Chuỗi |
Giá trị hợp lệ: | Chế độ cài đặt biến bất kỳ. |
Dùng với các loại quyền: | mật khẩu |
Xác minh quyền truy cập mã thông báo
Sau khi thiết lập điểm cuối của mã thông báo cho proxy API, chính sách OAuthV2 tương ứng sẽ
chỉ định toán tử VerifyAccessToken
được đính kèm với Luồng cho thấy
tài nguyên được bảo vệ.
Ví dụ: để đảm bảo rằng tất cả yêu cầu đối với một API đều được uỷ quyền, chính sách sau thực thi việc xác minh mã truy cập:
<OAuthV2 name="VerifyOAuthAccessToken"> <Operation>VerifyAccessToken</Operation> </OAuthV2>
Chính sách này được đính kèm với tài nguyên API cần được bảo vệ. Để đảm bảo rằng tất cả các yêu cầu đến API đã được xác minh, hãy đính kèm chính sách này vào quy trình PreFlow của yêu cầu ProxyEndpoint như sau:
<PreFlow> <Request> <Step><Name>VerifyOAuthAccessToken</Name></Step> </Request> </PreFlow>
Bạn có thể sử dụng các phần tử tuỳ chọn sau để ghi đè chế độ cài đặt mặc định cho phần tử Hoạt động VerifyAccessToken.
Tên | Mô tả |
---|---|
Phạm vi |
Danh sách phạm vi được phân tách bằng dấu cách. Quá trình xác minh sẽ thành công nếu có ít nhất một trong các phạm vi được liệt kê đã có trong mã truy cập. Ví dụ: chính sách sau đây sẽ hãy kiểm tra mã truy cập để đảm bảo rằng mã đó chứa ít nhất một trong các phạm vi được liệt kê. Nếu Bạn có thể dùng chế độ READ hoặc ghi, quy trình xác minh sẽ thành công. <OAuthV2 name="ValidateOauthScopePolicy"> <Operation>VerifyAccessToken</Operation> <Scope>READ WRITE</Scope> </OAuthV2> |
AccessToken | Biến mà mã truy cập dự kiến sẽ được đặt. Ví dụ:
request.queryparam.accesstoken . Theo mặc định, mã truy cập dự kiến sẽ là
được ứng dụng hiển thị trong tiêu đề HTTP uỷ quyền, theo thông số kỹ thuật của OAuth 2.0. Sử dụng bản thảo này
nếu mã truy cập sẽ được hiển thị ở một vị trí không chuẩn, chẳng hạn như
tham số truy vấn hoặc tiêu đề HTTP có tên không phải là Uỷ quyền. |
Xem thêm bài viết Xác minh quyền truy cập và Yêu cầu mã truy cập và mã uỷ quyền.
Chỉ định vị trí của biến yêu cầu
Đối với mỗi loại quyền tài trợ, chính sách đưa ra các giả định về vị trí hoặc thông tin cần thiết trong thông báo yêu cầu. Những giả định này dựa trên quy cách của OAuth 2.0. Nếu ứng dụng của bạn cần đi chệch khỏi quy cách OAuth 2.0, thì bạn có thể chỉ định các vị trí mong muốn cho từng thông số. Ví dụ: khi xử lý mã uỷ quyền, bạn có thể chỉ định vị trí của mã uỷ quyền, mã ứng dụng khách, URI chuyển hướng và phạm vi. Các toán tử này có thể được chỉ định là Tiêu đề HTTP, tham số truy vấn hoặc tham số biểu mẫu.
Ví dụ bên dưới minh hoạ cách bạn có thể chỉ định vị trí của mã uỷ quyền bắt buộc tham số làm tiêu đề 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> ...
Hoặc, nếu cần thiết để hỗ trợ cơ sở ứng dụng khách hàng của mình, bạn có thể kết hợp và so khớp tiêu đề và truy vấn thông số:
... <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> ...
Bạn chỉ có thể thiết lập một vị trí cho mỗi thông số.
Biến luồng
Các biến luồng được xác định trong bảng này được điền sẵn khi các chính sách OAuth tương ứng được được thực thi nên có sẵn cho các chính sách hoặc ứng dụng khác thực thi trong proxy API luồng.
Thao tác VerifyAccessToken
Thao tác VerifyAccessToken thực thi, một số lượng lớn các biến luồng được điền sẵn trong ngữ cảnh thực thi của proxy. Các biến này cung cấp cho bạn các thuộc tính liên quan đến quyền truy cập mã, ứng dụng của nhà phát triển, nhà phát triển và công ty. Bạn có thể dùng chính sách AttributionMessage hoặc JavaScript, ví dụ: để đọc bất kỳ biến nào trong số này và sử dụng chúng nếu cần sau này trong quy trình. Các các biến cũng có thể hữu ích cho mục đích gỡ lỗi.
proxy.pathsuffix
). Bạn không cần phải đặt rõ biến flow.resource.name.
Trong trường hợp sản phẩm API không được định cấu hình bằng các môi trường và proxy API hợp lệ, thì
Bạn phải thiết lập flow.resource.name
một cách rõ ràng để điền các biến sản phẩm API trong
luồng. Để biết chi tiết về cấu hình sản phẩm, hãy xem phần Sử dụng tính năng quản lý Edge
API để xuất bản các API.
Biến dành riêng cho mã thông báo
Biến | Mô tả |
---|---|
organization_name |
Tên của tổ chức nơi thực thi proxy. |
developer.id |
Mã của nhà phát triển được liên kết với ứng dụng khách đã đăng ký. |
developer.app.name |
Tên của nhà phát triển liên kết với ứng dụng đã đăng ký. |
client_id |
Mã ứng dụng khách của ứng dụng khách đã đăng ký. |
grant_type |
Loại tài trợ được liên kết với yêu cầu. |
token_type |
Loại mã thông báo được liên kết với yêu cầu. |
access_token |
Mã truy cập đang được xác minh. |
accesstoken.{custom_attribute} |
Một thuộc tính tuỳ chỉnh đã đặt tên trong mã truy cập. |
issued_at |
Ngày phát hành mã truy cập (thể hiện trong Unix) thời gian bắt đầu của hệ thống tính bằng mili giây. |
expires_in |
Thời gian hết hạn của mã truy cập. Quảng cáo thể hiện bằng
giây. Mặc dù ExpiresIn
phần tử đặt thời gian hết hạn tính bằng mili giây, trong phản hồi mã thông báo và
biến luồng, giá trị được tính bằng giây. |
status |
Trạng thái của mã truy cập (ví dụ: đã phê duyệt hoặc bị thu hồi). |
scope |
Phạm vi (nếu có) liên kết với mã truy cập. |
apiproduct.<custom_attribute_name> |
Thuộc tính tuỳ chỉnh có tên của sản phẩm API được liên kết với khách hàng đã đăng ký . |
apiproduct.name |
Tên của sản phẩm API liên kết với ứng dụng đã đăng ký. |
revoke_reason |
(Chỉ dành cho API kết hợp Apigee) Cho biết lý do mã truy cập bị thu hồi. Giá trị có thể là |
Biến dành riêng cho ứng dụng
Các biến này liên quan đến Ứng dụng của nhà phát triển được liên kết với mã thông báo.
Biến | Mô tả |
---|---|
app.name |
|
app.id |
|
app.accessType |
|
app.callbackUrl |
|
app.status |
đã được phê duyệt hoặc bị thu hồi |
app.scopes |
|
app.appFamily |
|
app.apiproducts |
|
app.appParentStatus |
|
app.appType |
Ví dụ: Nhà phát triển |
app.appParentId |
|
app.created_by |
|
app.created_at |
|
app.last_modified_at |
|
app.last_modified_by |
|
app.{custom_attributes} |
Thuộc tính tuỳ chỉnh được đặt tên của ứng dụng khách đã đăng ký. |
Biến dành riêng cho nhà phát triển
Nếu app.appType là "Company" thì các thuộc tính của công ty sẽ được điền và nếu app.appType là "Nhà phát triển", sau đó các thuộc tính nhà phát triển sẽ được điền sẵn.
Biến | Mô tả |
---|---|
Biến dành riêng cho nhà phát triển | |
developer.id |
|
developer.userName |
|
developer.firstName |
|
developer.lastName |
|
developer.email |
|
developer.status |
đang hoạt động hoặc không hoạt động |
developer.apps |
|
developer.created_by |
|
developer.created_at |
|
developer.last_modified_at |
|
developer.last_modified_by |
|
developer.{custom_attributes} |
Thuộc tính tuỳ chỉnh được đặt tên của nhà phát triển. |
Biến dành riêng cho công ty
Nếu app.appType là "Company" thì các thuộc tính của công ty sẽ được điền và nếu app.appType là "Nhà phát triển", sau đó các thuộc tính nhà phát triển sẽ được điền sẵn.
Biến | Mô tả |
---|---|
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} |
Thuộc tính tuỳ chỉnh được đặt tên của công ty. |
GenerateAuthorizationCode hoạt động
Các biến này được đặt khi hoạt động GenerateLicenseCode thực thi thành công:
Tiền tố: oauthv2authcode.{policy_name}.{variable_name}
Ví dụ: oauthv2authcode.GenerateCodePolicy.code
Biến | Mô tả |
---|---|
code |
Mã uỷ quyền được tạo khi chính sách này thực thi. |
redirect_uri |
URI chuyển hướng được liên kết với ứng dụng khách đã đăng ký. |
scope |
Phạm vi OAuth không bắt buộc được truyền vào yêu cầu ứng dụng. |
client_id |
Mã ứng dụng khách được truyền trong yêu cầu ứng dụng. |
CreateAccessToken và Hoạt động RefreshAccessToken
Các biến này được đặt khi thực thi các hoạt động GenerateAccessToken và RefreshAccessToken thành công. Lưu ý rằng các biến của mã làm mới không áp dụng cho việc cấp thông tin xác thực ứng dụng cho luồng.
Tiền tố: oauthv2accesstoken.{policy_name}.{variable_name}
Ví dụ: oauthv2accesstoken.GenerateTokenPolicy.access_token
Tên biến | Mô tả |
---|---|
access_token |
Mã truy cập đã tạo. |
client_id |
Mã ứng dụng khách của ứng dụng của nhà phát triển được liên kết với mã thông báo này. |
expires_in |
Giá trị hết hạn của mã thông báo. Hãy xem phần <ExpiresIn> để biết thông tin chi tiết. Xin lưu ý rằng trong phản hồi, expires_in được biểu thị bằng giây. |
scope |
Danh sách các phạm vi hiện có được định cấu hình cho mã thông báo. Xem bài viết Làm việc với phạm vi OAuth2. |
status |
approved hoặc revoked . |
token_type |
Được đặt thành BearerToken . |
developer.email |
Địa chỉ email của nhà phát triển đã đăng ký sở hữu ứng dụng của nhà phát triển được liên kết với mã thông báo. |
organization_name |
Tổ chức mà proxy thực thi. |
api_product_list |
Danh sách sản phẩm liên kết với ứng dụng tương ứng của nhà phát triển của mã thông báo. |
refresh_count |
|
refresh_token |
Mã làm mới đã được tạo. Xin lưu ý rằng mã làm mới không được tạo cho loại cấp thông tin đăng nhập của ứng dụng khách. |
refresh_token_expires_in |
Thời gian tồn tại của mã làm mới, tính bằng giây. |
refresh_token_issued_at |
Giá trị thời gian này là chuỗi đại diện của dấu thời gian 32 bit tương ứng số lượng. Ví dụ: "Wed, 21 Aug 2013 19:16:47 UTC" tương ứng với giá trị dấu thời gian của 1377112607413. |
refresh_token_status |
approved hoặc revoked . |
GenerateAccessTokenImplicitGrant
Các biến này được đặt khi thực thi hoạt động GenerateAccessTokenlined thành công đối với quy trình loại cấp quyền ngầm ẩn.
Tiền tố: oauthv2accesstoken.{policy_name}.{variable_name}
Ví dụ: oauthv2accesstoken.RefreshTokenPolicy.access_token
Biến | Mô tả |
---|---|
oauthv2accesstoken.access_token |
Mã truy cập được tạo khi chính sách này thực thi. |
oauthv2accesstoken.{policy_name}.expires_in |
Giá trị hết hạn của mã thông báo, tính bằng giây. Xem phần tử <ExpiresIn> để biết thông tin chi tiết. |
Tham chiếu lỗi
Phần này mô tả các mã lỗi và thông báo lỗi được trả về cũng như các biến lỗi do Edge đặt khi chính sách này kích hoạt lỗi. Thông tin này rất quan trọng nếu bạn đang phát triển các quy tắc lỗi để xử lý lỗi. Để tìm hiểu thêm, hãy xem bài viết Những điều bạn cần biết về lỗi chính sách và Xử lý lỗi.
Lỗi thời gian chạy
Những lỗi này có thể xảy ra khi chính sách này thực thi.
Mã lỗi | Trạng thái HTTP | Nguyên nhân | Được đưa ra theo toán tử |
---|---|---|---|
steps.oauth.v2.access_token_expired |
401 | Mã truy cập đã hết hạn. |
VerifyAccessToken |
steps.oauth.v2.access_token_not_approved |
401 | Đã thu hồi mã truy cập. | VerifyAccessToken |
steps.oauth.v2.apiresource_doesnot_exist |
401 | Tài nguyên được yêu cầu không tồn tại bất kỳ sản phẩm API nào được liên kết với mã truy cập. | VerifyAccessToken |
steps.oauth.v2.FailedToResolveAccessToken |
500 | Chính sách dự kiến sẽ tìm thấy mã truy cập trong một biến được chỉ định trong
<AccessToken> , nhưng không phân giải được biến. |
GenerateAccessToken |
steps.oauth.v2.FailedToResolveAuthorizationCode |
500 | Chính sách này dự kiến sẽ tìm thấy mã uỷ quyền trong một biến được chỉ định trong
<Code> , nhưng không phân giải được biến. |
GenerateAuthorizationCode |
steps.oauth.v2.FailedToResolveClientId |
500 | Chính sách dự kiến sẽ tìm thấy Mã ứng dụng khách trong một biến được chỉ định trong
<ClientId> , nhưng không phân giải được biến. |
GenerateAccessToken GenerateAuthorizationCode GenerateAccessTokenImplicitGrant RefreshAccessToken |
steps.oauth.v2.FailedToResolveRefreshToken |
500 | Chính sách này dự kiến sẽ tìm thấy mã làm mới trong một biến được chỉ định trong
<RefreshToken> , nhưng không phân giải được biến. |
RefreshAccessToken |
steps.oauth.v2.FailedToResolveToken |
500 | Chính sách dự kiến sẽ tìm thấy mã thông báo trong một biến được chỉ định trong
<Tokens> , nhưng không phân giải được biến. |
ValidateToken |
steps.oauth.v2.InsufficientScope |
403 | Mã truy cập được trình bày trong yêu cầu có phạm vi không khớp với phạm vi được chỉ định trong chính sách xác minh mã truy cập. Để tìm hiểu về phạm vi, hãy xem bài viết Làm việc với các phạm vi OAuth2. | VerifyAccessToken |
steps.oauth.v2.invalid_access_token |
401 | Mã truy cập do ứng dụng gửi là không hợp lệ. | VerifyAccessToken |
steps.oauth.v2.invalid_client |
401 |
Tên lỗi này được trả về khi thuộc tính Lưu ý: Bạn nên thay đổi quy tắc lỗi hiện có
để nắm bắt cả |
GenerateAccessToken RefreshAccessToken |
steps.oauth.v2.invalid_request |
400 | Tên lỗi này được dùng cho nhiều loại lỗi, thường là lỗi thiếu
hoặc thông số không chính xác được gửi trong yêu cầu. Nếu <GenerateResponse> là
đặt thành false , sử dụng các biến lỗi (được mô tả bên dưới) để truy xuất thông tin chi tiết về
lỗi, chẳng hạn như tên lỗi và nguyên nhân. |
GenerateAccessToken GenerateAuthorizationCode GenerateAccessTokenImplicitGrant RefreshAccessToken |
steps.oauth.v2.InvalidAccessToken |
401 | Tiêu đề uỷ quyền không có từ "Bearer" bắt buộc. Cho
ví dụ: Authorization: Bearer your_access_token |
VerifyAccessToken |
steps.oauth.v2.InvalidAPICallAsNo\ |
401 |
Proxy API không có trong Sản phẩm được liên kết với mã truy cập. Mẹo: Đảm bảo rằng sản phẩm liên kết với mã truy cập đáp ứng các yêu cầu được định cấu hình chính xác. Ví dụ: nếu bạn sử dụng ký tự đại diện trong đường dẫn tài nguyên, hãy đảm bảo ký tự đại diện đang được sử dụng đúng cách. Xem bài viết Tạo sản phẩm API để biết chi tiết. Xem thêm bài viết này Bài đăng trên thẻ Cộng đồng Apigee để được hướng dẫn thêm về nguyên nhân gây ra lỗi này. |
VerifyAccessToken |
steps.oauth.v2.InvalidClientIdentifier |
500 |
Tên lỗi này được trả về khi thuộc tính |
GenerateAccessToken |
steps.oauth.v2.InvalidParameter |
500 | Chính sách phải chỉ định mã truy cập hoặc mã uỷ quyền, nhưng không được cả hai. | GenerateAuthorizationCode GenerateAccessTokenImplicitGrant |
steps.oauth.v2.InvalidTokenType |
500 | Phần tử <Tokens>/<Token> yêu cầu bạn phải chỉ định mã thông báo
(ví dụ: refreshtoken ). Nếu ứng dụng chuyển sai loại, thì
lỗi được gửi. |
ValidateToken InvalidateToken |
steps.oauth.v2.MissingParameter |
500 | Loại phản hồi là token , nhưng không loại nào được chỉ định. |
GenerateAuthorizationCode GenerateAccessTokenImplicitGrant |
steps.oauth.v2.UnSupportedGrantType |
500 |
Khách hàng đã chỉ định một loại quyền mà chính sách không hỗ trợ (không được liệt kê trong <SupportedGrantTypes> phần tử). Lưu ý: Hiện có lỗi liên quan đến lỗi loại cấp quyền không được hỗ trợ không được gửi đúng cách. Nếu xảy ra lỗi loại cấp quyền không được hỗ trợ, proxy sẽ không hãy nhập Luồng lỗi, như mong đợi. |
GenerateAccessToken GenerateAuthorizationCode GenerateAccessTokenImplicitGrant RefreshAccessToken |
Lỗi triển khai
Những lỗi này có thể xảy ra khi bạn triển khai proxy có chứa chính sách này.
Tên lỗi | Nguyên nhân |
---|---|
InvalidValueForExpiresIn |
Đối với phần tử |
InvalidValueForRefreshTokenExpiresIn |
Đối với phần tử <RefreshTokenExpiresIn> , các giá trị hợp lệ đều là số dương
số nguyên và -1 . |
InvalidGrantType |
Bạn đã chỉ định loại cấp quyền không hợp lệ trong <SupportedGrantTypes>
. Hãy xem tài liệu tham khảo chính sách để biết danh sách các loại hợp lệ. |
ExpiresInNotApplicableForOperation |
Đảm bảo rằng các thao tác được quy định trong <Hoạt động> hỗ trợ phần tử hết hạn. Ví dụ: hoạt động VerifyToken không. |
RefreshTokenExpiresInNotApplicableForOperation |
Đảm bảo rằng các thao tác được quy định trong <Hoạt động> làm mới chế độ hỗ trợ phần tử mã thông báo hết hạn. Ví dụ: hoạt động VerifyToken không. |
GrantTypesNotApplicableForOperation |
Đảm bảo rằng các loại cấp quyền được chỉ định trong <supportedSTARTTypes> được hỗ trợ cho thao tác được chỉ định. |
OperationRequired |
Bạn phải chỉ định một thao tác trong chính sách này bằng Lưu ý: Nếu thiếu phần tử |
InvalidOperation |
Bạn phải chỉ định một thao tác hợp lệ trong chính sách này bằng cách sử dụng
Phần tử Lưu ý: Nếu phần tử |
TokenValueRequired |
Bạn phải chỉ định một giá trị <Token> của mã thông báo trong
Phần tử <Tokens> . |
Biến lỗi
Các biến này được đặt khi chính sách này kích hoạt lỗi trong thời gian chạy.
<GenerateResponse>
được đặt thành
false
. Nếu <GenerateResponse>
là
true
, chính sách này sẽ trả về phản hồi cho ứng dụng ngay lập tức nếu xảy ra lỗi –
luồng lỗi bị bỏ qua và các biến này không được điền. Để biết thêm thông tin, hãy xem
Những việc bạn cần làm
biết về các lỗi chính sách.Biến | Trong đó | Ví dụ: |
---|---|---|
fault.name="fault_name" |
fault_name là tên của lỗi, như được liệt kê trong bảng Lỗi thời gian chạy ở trên. Tên lỗi là phần cuối cùng của mã lỗi. | fault.name = "invalid_request" |
oauthV2.policy_name.failed |
policy_name là tên do người dùng chỉ định của chính sách gây ra lỗi. | oauthV2.GenerateAccesstoken.failed = true |
oauthV2.policy_name.fault.name |
policy_name là tên do người dùng chỉ định của chính sách gây ra lỗi. | oauthV2.GenerateAccesstoken.fault.name = invalid_request
Lưu ý: Đối với hoạt động VerifyAccessToken, tên lỗi sẽ bao gồm hậu tố sau: |
oauthV2.policy_name.fault.cause |
policy_name là tên do người dùng chỉ định của chính sách gây ra lỗi. | oauthV2.GenerateAccesstoken.cause = Required param : grant_type |
Ví dụ về phản hồi khi gặp lỗi
Những phản hồi này sẽ được gửi lại ứng dụng khách nếu <GenerateResponse>
là phần tử true.
errorcode
của phản hồi lỗi. Đừng dựa vào văn bản trong
faultstring
vì mã này có thể thay đổi.Nếu giá trị <GenerateResponse>
là true (đúng) thì chính sách sẽ trả về lỗi
ở định dạng này cho các thao tác tạo mã thông báo và mã. Để xem danh sách đầy đủ, hãy xem
Lỗi HTTP của OAuth
tham chiếu phản hồi.
{"ErrorCode" : "invalid_client", "Error" :"ClientId is Invalid"}
Nếu giá trị <GenerateResponse>
là true (đúng) thì chính sách sẽ trả về lỗi
ở định dạng này để xác minh và xác thực thao tác. Để xem danh sách đầy đủ, hãy xem bài viết Lỗi HTTP OAuth
tham chiếu phản hồi.
{ { "fault":{ "faultstring":"Invalid Access Token", "detail":{ "errorcode":"keymanagement.service.invalid_access_token" } } }
Ví dụ về quy tắc lỗi
<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>
Giản đồ chính sách
Mỗi loại chính sách được xác định bằng một giản đồ XML (.xsd
). Để tham khảo, chính sách
giản đồ có trên GitHub.
Làm việc với OAuth mặc định cấu hình
Mỗi tổ chức (kể cả tổ chức dùng thử miễn phí) trên Apigee Edge đều được cấp phép bằng mã thông báo OAuth điểm cuối. Điểm cuối được định cấu hình sẵn với các chính sách trong proxy API có tên là OAuth. Bạn có thể bắt đầu sử dụng điểm cuối mã thông báo ngay khi tạo một tài khoản trên Apigee Edge. Cho chi tiết, hãy xem bài viết Tìm hiểu về OAuth điểm cuối.
Lấy mã truy cập xoá
Theo mặc định, mã thông báo OAuth2 sẽ bị xoá hoàn toàn khỏi hệ thống Apigee Edge sau 3 ngày (259200 giây) sau khi cả mã truy cập và mã làm mới (nếu có) đã hết hạn. Trong một số trường hợp, bạn có thể muốn thay đổi chế độ mặc định này. Ví dụ: bạn có thể muốn rút ngắn thời gian dọn dẹp xuống tiết kiệm dung lượng ổ đĩa nếu tạo một số lượng lớn mã thông báo.
Nếu đang sử dụng Edge dành cho đám mây riêng tư, bạn có thể thay đổi chế độ mặc định này bằng cách cài đặt tổ chức như được giải thích trong phần này. (Xóa hoàn toàn các mã thông báo đã hết hạn trong 3 ngày áp dụng cho Edge dành cho Private Cloud phiên bản 4.19.01 trở lên. Đối với các phiên bản trước đó, khoảng thời gian hoàn toàn mặc định là 180 ngày).
Cập nhật các tùy chọn cài đặt xóa hoàn toàn cho Edge Private Cloud 4.16.01 và các phiên bản mới hơn
Lưu ý: Chỉ mã thông báo được tạo sau khi các chế độ cài đặt này được tạo đã áp dụng đều bị ảnh hưởng; chế độ cài đặt này không áp dụng cho mã thông báo được tạo trước đó.
- Mở tệp này để chỉnh sửa:
/opt/apigee/customer/application/message-processor.properties
- Thêm thuộc tính sau để thiết lập số giây cần phải chờ trước khi xoá hoàn toàn một mã thông báo
sau khi hết hạn:
conf_keymanagement_oauth.access.token.purge.after.seconds=<number of seconds>
- Khởi động lại trình xử lý thư. Ví dụ:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
<ExpiresIn>
và
Thuộc tính <RefreshTokenExpiresIn>
.
Đang cập nhật hoàn toàn bộ nhớ cài đặt cho Edge Private Cloud 4.15.07
Lưu ý: Chỉ những mã thông báo được tạo sau khi áp dụng các chế độ cài đặt này bị ảnh hưởng; chế độ cài đặt này không áp dụng cho mã thông báo được tạo trước đó.
-
Đặt giá trị dương cho
<ExpiresIn>
và Thuộc tính<RefreshTokenExpiresIn>
trong chính sách OAuthV2. Các giá trị nằm trong mili giây. Ví dụ:<ExpiresIn>1000</ExpiresIn> <RefreshTokenExpiresIn>10000</RefreshTokenExpiresIn>
-
Triển khai lại proxy.
-
Hãy dùng API này để cập nhật các thuộc tính xoá hoàn toàn mã thông báo cho tổ chức của bạn:
POST https://<host-name>/v1/organizations/<org-name>
Tải trọng:
<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>
-
Khởi động lại trình xử lý thư. Ví dụ:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
API này đặt thuộc tính xoá hoàn toàn mã thông báo thành true cho tổ chức được gọi AutomaticOrganization. Trong trường hợp này, mã truy cập sẽ bị xoá hoàn toàn khỏi cơ sở dữ liệu 120 giây sau khi cả mã thông báo và mã làm mới hết hạn.
Hành vi không tuân thủ RFC
Chính sách OAuthV2 trả về phản hồi mã thông báo chứa một số thuộc tính không tuân thủ RFC. Bảng sau đây trình bày các trang web không tuân thủ các thuộc tính do chính sách OAuthV2 trả về và các thuộc tính tuân thủ tương ứng.
OAuthV2 trả về: | Thuộc tính tuân thủ RFC là: |
---|---|
"token_type":"BearerToken" |
"token_type":"Bearer"
|
"expires_in":"3600" |
"expires_in":3600
(Giá trị tuân thủ là một số, không phải một chuỗi.) |
Ngoài ra, phản hồi lỗi cho mã làm mới đã hết hạn khi grant_type = refresh_token
là:
{"ErrorCode" : "invalid_request", "Error" :"Refresh Token expired"}
Tuy nhiên, phản hồi tuân thủ RFC là:
{"error" : "invalid_grant", "error_description" :"refresh token expired"}