From 29beae028c73b989e436ed5f94d082f7d3324c10 Mon Sep 17 00:00:00 2001 From: shimingxy Date: Thu, 12 Mar 2020 11:09:48 +0800 Subject: [PATCH] o --- docs/images/sso/sso_oauth_conf.png | Bin 0 -> 62371 bytes docs/sso/oauth2.md | 435 ++++++++++++++++++++++++++++- 2 files changed, 434 insertions(+), 1 deletion(-) create mode 100644 docs/images/sso/sso_oauth_conf.png diff --git a/docs/images/sso/sso_oauth_conf.png b/docs/images/sso/sso_oauth_conf.png new file mode 100644 index 0000000000000000000000000000000000000000..d28b3e8da8a8d3c55a1aaddafdbb24648bb2798f GIT binary patch literal 62371 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/sso/oauth2.md b/docs/sso/oauth2.md index 30404ce4c..ebf0a5e34 100644 --- a/docs/sso/oauth2.md +++ b/docs/sso/oauth2.md @@ -1 +1,434 @@ -TODO \ No newline at end of file +

OAuth2应用集成

+本文介绍OAuth2应用如何与MaxKey进行集成。 + +

认证流程

+采用Authorization Code获取Access Token的授权验证流程又被称为Web Server Flow,适用于所有Server端的应用。其调用流程示意图如下: + + + +对于应用而言,其流程由获取Authorization Code和通过Authorization Code获取Access Token这2步组成。 + +1.引导需要授权的用户到如下地址: +
+https://sso.maxkey.org/maxkey/oauth/v20/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI 
+ + +2.页面跳转至 +
+YOUR_REGISTERED_REDIRECT_URI/?code=CODEsss
+
+ +3. 换取Access Token +
+https://sso.maxkey.org/maxkey/oauth/v20/token?client_id=YOUR_CLIENT_ID&client_secret=YOUR _SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE
+ + +返回值 +
        
+{ "access_token":"SlAV32hkKG", "remind_in ":3600, "expires_in":3600 }
+
+ +

应用注册

+应用在MaxKey管理系统进行注册,注册的配置信息如下 + + + +

API接口标准

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
接口 说明 详细说明 调用方法
oauth/v20/authorize 请求用户授权Token https://sso.maxkey.org/maxkey接收app sso认证请求,
client_id为需要认证的应用的id;
APP
oauth/v20/token 获取授权过的 Access Token 后台应用获取 tokencode ,调用接口进行 tokencode 校验;
校验成功获取访问 token
APP
/api/oauth/v20/me 授权用户信息查询接口 通过访问 token 获取登录用户信息 APP
/connect/v10/userinfo OIDC授权用户信息查询接口 通过访问 token 获取登录用户信息 APP
+ +1./oauth/v20/authorize接口 +
请求用户授权Token
+ + + + + + + + + + + + + + +
接口名称 请求用户授权Token
url https://sso.maxkey.org/maxkey/oauth/v20/authorize
请求方式 http get/post
+ +请求参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数 说明
client_id 注册应用时分配的client_id。
redirect_uri 应用回调地址,注册时需要配置
grant_type授权类型。
etc param其他参数。
+ 响应返回app应用程序,包含请求参数如下: +
+ http://app.MaxKey.com/app/callback?tokencode =PQ7q7W91a-oMsCeLvIaQm6bTrgtp7 +
tokencode用于调用oauth/token,接口获取授权后的访问token。
+ +/oauth/v20/token接口 + +通过/oauth/v20/token用tokencode换取访问token + + + + + + + + + + + + + + +
接口名称 token 接口
url https://sso.maxkey.org/maxkey/oauth/v20/token
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数 说明
client_id 注册应用时分配的client_id。
client_secret 注册应用时分配的client_secret
redirect_uri 应用回调地址,注册时需要配置
tokencode调用/oauth/v20/authorize获得的tokencode值。
grant_type授权类型。Grant type
username当grant_type=password时,此参数表示直接认证用户名。
password当grant_type=password时,此参数表示直接认证用户密码。
etc param其他参数
+实际请求如下: +
 
+The actual request might look like:
+POST /oauth/ token HTTP/1.1
+Host: login.MaxKey.com/openapi
+Content-Type: application/x-www-form-urlencoded
+tokencode= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7&
+client_id=QPKKKSADFUP876&
+client_secret={client_secret}&
+redirect_uri=http://app.MaxKey.com/app/callback
+
+
+ 返回数据 +
+ A successful response to this request contains the following fields: +
access_token用该token能调用SSO的API
+ 成功返回JSON数据,如下: +
		
+{
+access_token  :  "token_id"
+…
+}
+
+
+ +用户属性接口/api/oauth/v20/me + + + + + + + + + + + + + +
接口名称 token 接口
url https://sso.maxkey.org/maxkey/api/oauth/v20/me
请求方式 http get/post
+ +
请求参数
+ + + + + + + + + + + + + + + + + + +
参数 说明
access_token 调用sso/ token获得的token值。
+ 实际请求如下: +
 
+POST /oauth/ userinfo HTTP/1.1
+Host: login.MaxKey.com/openapi
+Content-Type: application/x-www-form-urlencoded
+access_token= PQ7q7W91a-oMsCeLvIaQm6bTrgtp7
+
+
+ 返回数据/ response data +
+

成功返回JSON数据,如下:

+
 
+{
+userid     :  “zhangs”,
+				…
+}
+
+zhangs是认证的用户ID +
+ + + + +OAuth认证接口属性列表 + + + + + + + + + + + +
属性名(Attribute) 描述 数据类型
uiduid字符串
+ + +

OAuth2.0 错误码

+ +MaxKey OAuth2.0实现中,授权服务器在接收到验证授权请求时,会按照OAuth2.0协议对本请求的请求头部、请求参数进行检验,若请求不合法或验证未通过,授权服务器会返回相应的错误信息,包含以下几个参数:

+ +error: 错误码 + +error_description: 错误的描述信息 + + + +错误信息的返回方式有两种: + +当请求授权Endpoint:https://sso.maxkey.org/maxkey/oauth/v20/authorize 时出现错误,返回方式是:跳转到redirect_uri,并在uri 的query parameter中附带错误的描述信息。 + +当请求access token endpoint:https://sso.maxkey.org/maxkey/oauth/v20/token 时出现错误,返回方式:返回JSON文本。 + +例如: +
 
+{
+	"error":"unsupported_response_type",
+	"error_description":"不支持的 ResponseType."
+}
+
+ +OAuth2.0错误响应中的错误码定义如下表所示: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
编号错误码(error)描述(error_description)
1empty_client_id参数client_id为空
2empty_client_secret参数client_secret为空
3empty_redirect_uri参数redirect_uri为空
4empty_response_type参数response_type为空
5empty_codecode为空
6app_unsupport_sso应用不支持sso登录
7app_unsupport_oauth应用不支持OAuth认证
8invalid_client_id非法的client_id
9invalid_response_type非法的response_type
10invalid_scope非法的scope
11invalid_grant_type非法的grant_type
12redirect_uri_mismatch非法的redirect_uri
13unsupported_response_type不支持传递的response_type
14invalid_code非法的code
15unsupported_refresh_token不支持refresh_token的方式
16access_token_expriseaccess_token过期
17invalid_access_token非法的access_token
18invalid_refresh_token非法的refresh_token
19refresh_token_expriserefresh_token过期