
# 认证鉴权
华为云Astro轻应用提供的所有接口都需要通过认证之后才可以访问。认证方式主要分以下两类：
- 在请求消息头上，设置"access-token"
- 在请求消息头上，设置"Authorization"
两类方式都是通过不同的认证接口，来获取到Token。Token在计算机系统中代表令牌（临时）的意思，拥有Token代表拥有某种权限。Token认证是在调用API的时候将Token加到请求消息头，从而通过身份认证，获得操作API的权限。
平台用户分以下几类，不同类别的用户访问接口的权限会有所不同：
- 平台用户 (User)：一般对应运行环境、开发环境用户，用于管理开发应用。 使用的认证机制为："账号密码登录认证"、"单点登录认证"和"OAuth 2.0鉴权登录认证"。
  
- 业务用户（Portal User）：业务用户是访问华为云Astro轻应用提供的业务服务的用户。 使用的认证机制为："账号密码登录认证"、"单点登录认证"和"OAuth 2.0鉴权登录认证"。
  
- 匿名用户 （Guest）：对于该类用户，平台接口都需要进行校验，未登录前使用Guest用户身份来访问平台接口，一般会赋予最小的权限。 使用的认证机制为："OAuth 2.0鉴权登录认证"。
  
获取Token的认证接口，如[表1]所示。
 表1认证接口说明 
| 接口                                       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 生成Token的用户 | 是否可以直接访问接口      |
|:---|:---|:---|:---|
| 账号密码登录                                   | 通过账号密码直接访问登录接口，成功校验则返回"access-token"，写到Cookies上。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 平台用户、业务用户  | 是               |
| 单点登录（"CAS"协议）                            | 支持CAS单点登录方式，通过CAS server登录后携带ticket重定向到华为云Astro轻应用。 华为云Astro轻应用后台拿ticket到CAS Server校验ticket合法性，得到ticket对应的账号（可选）、用户信息，然后校验该用户是否存在，在指定了账号的情况下，如果该用户不存在，则创建对应用户； 没有指定租户的情况下该用户不存在则直接报错，并返回到CAS Server。 成功验证用户身份后，则生成Session写到cookie上，重定向到指定页面。                                                                                                                                                                                                                                                                                                                      | 平台用户、业务用户  | 是               |
| 使用OAuth 2.0的客户端（即client_credentials）鉴权模式 | 根据鉴权ID和鉴权密钥，调用获取用户Token的接口，来获取access_token。匿名用户一般通过该方式来获取Token。 具体操作，请参见[客户端模式]。                                                                                                                                                                                                                                                                                                                                                                                                                                               | 平台用户、匿名用户  | 是               |
| 使用OAuth 2.0的授权码（即authorization_code）鉴权模式 | 根据鉴权ID、鉴权密钥、授权码调用获取用户Token接口来获取access_token。后续需要通过access_token获取授权用户信息。 具体操作，请参见[授权码模式]。                                                                                                                                                                                                                                                                                                                                                                                                                                      | 平台用户、匿名用户  | 是               |
| 供华为WeLink单点登录                            | 华为云Astro轻应用开发的轻应用或者We码支持WeLink登录，在WeLink打开轻应用或者We码可以实现免登访问。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 业务用户       | 否               |
| 业务用户登录（服务编排中PORTALUSERLOGIN公式）           | 指定业务用户名，使用服务编排的"PORTALUSERLOGIN"公式来登录。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 业务用户       | 否（只能在服务编排中访问接口） |
| 业务用户通过RefreshToken获取新的Token              | 可以通过配置内置系统参数"bingo.service.refreshtoken.enable"为"是"的方式来选择开启RefreshToken特性。开启后，业务用户通过服务编排的"PORTALUSERLOGIN"公式登录华为云Astro轻应用时，会在Cookies中多返回一个"refresh-token"参数。可再通过发起请求"POST https://*华为云Astro轻应用域名*/baas/auth/v1.0/refreshtoken"来获取一个新的Token（调该接口时需要在请求消息头上设置参数"Content-Type"值为"application/json"，请求消息体中设置参数"grant_type"值为"refresh_token"，"refresh_token"值为Cookies中返回的"refresh-token"参数值）。原有的Token不管有没有失效，都会被置成失效状态。一般情况下，"refresh-token"的有效期会比较长，在用户的权限配置中可通过配置"刷新凭证时长"来控制其有效期。 具体操作，请参见[业务用户通过RefreshToken获取新的Token]。 | 业务用户       | 是               |
| JWT（JSON Web Tokens）鉴权方式                 | 根据其他方式生成的"access-token"，可以通过jwt接口换成一个JWT形式的token。一般用于华为云Astro轻应用内部服务之前的相互访问。内部服务会在etcd上配置一个"SecretKey"，内部网元读取"SecretKey"来解JWT得到用户信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 平台用户       | 是               |
| 供CAS Server使用的账号密码登录方式                   | 华为云Astro轻应用自身的CAS Server没有独立的持久化，使用的Authcenter模块的用户体系，由Authcenter提供一个接口来做用户鉴权。 ``` sequenceDiagram participant CAS Server participant Authcenter CAS Server ->> Authcenter: 通过账号密码访问调用 Authcenter 认证接口 Authcenter -->> CAS Server: 返回认证结果，成功则包含用户账号信息 CAS Server ->> CAS Server: 生成 TCG CAS Server ->> Authcenter: 携带ticket 重定向到 Authcenter ```                                                                                                                                                                                                                  | 平台用户       | 否               |
   
#### OAuth鉴权
华为云Astro轻应用平台提供了两种授权模式进行OAuth鉴权，分别是"客户端模式"和"授权码模式"，两种授权模式适用的鉴权范围有所不同。
- 通过"客户端模式"获取的access-token，可用于调用API接口时进行鉴权，使用时在请求消息头上设置"access-token"。
  1. 在[华为云Astro轻应用服务控制台](https://console.huaweicloud.com/appcube/?locale=zh-cn#/home)的"主页"中，单击"进入首页"，进入应用开发页面。
  
  2. 单击![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000002135136782.png)，选择"环境管理 \> 环境配置"，进入华为云Astro轻应用环境配置页面。
  
  3. 在左侧导航栏中，选择"集成连接 \> OAuth"菜单，新建OAuth管理。
     图1新建客户端模式OAuth管理   
     ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910109764.png "点击放大")
     - **第三方通过OAuth认证接入系统后，将以选择的用户身份操作数据，所以需要确保所选的用户具有调用API的相关权限。**
     
     - **选择的用户的权限不能为匿名用户权限"Anonymous_User_Profile"，因为Guest用户没有访问API的权限，因此无法配置OAuth。**
      
  
  4. 在OAuth管理列表中，单击该鉴权所在行的![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910149772.png)，下载密钥文件。
     表2密钥文件参数 
     | 参数            | 参数说明                                           |
     |:---|:---|
     | username      | 当"授权类型"配置为"客户端模式"时，密钥文件会包含该参数，为创建OAuth时选择的用户名。 |
     | client_id     | 鉴权的客户端ID。                                      |
     | client_secret | 鉴权密钥。                                          |
        
     
  
  5. 根据鉴权客户端ID和鉴权密钥，通过Post请求调用接口"https://华为云Astro轻应用域名/baas/auth/v1.0/oauth2/token"，获取access_token。
     表3请求参数说明 
     | 参数名           | 类型     | 必选（M）/可选（O） | 参数位置 | 参数含义                                                                                                                                                                                                                                                                                                                           | 值                      |
     |:---|:---|:---|:---|:---|:---|
     | grant_type    | String | M           | Body | 授权模式，OAuth2.0中的grant_type字段的取值。取值范围如下： - client_credentials：客户端模式。  - authorization_code：授权码模式。   | client_credentials     |
     | client_id     | String | M           | Body | 鉴权的客户端ID，可在OAuth查看。                                                                                                                                                                                                                                                                                                            | 从上一步骤获取。               |
     | client_secret | String | M           | Body | 鉴权密钥，可在OAuth查看。 **URL查询参数中，请勿配置client_secret，建议将其配置到请求体中。**                                                                                                                                                                                                                               | 从上一步骤获取。               |
     | redirect_url  | String | O           | Body | 重定向URL。                                                                                                                                                                                                                                                                                                                        | http://www.example.com |
     | locale        | String | O           | Body | 语言。                                                                                                                                                                                                                                                                                                                            | en_US                  |
        
     表4返回参数说明 
     | 参数           | 参数说明                     |
     |:---|:---|
     | access_token | 认证后可信任的Token凭证。          |
     | expires_in   | 当前access_token的有效期，单位：秒。 |
     | token_type   | access_token类型。          |
        
     图2接口调用结果   
     ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001944028937.png "点击放大")
     当接口调用出错时，会返回错误码"400"及错误信息说明，错误响应的Body体格式如下所示。
     ```
     {
         "error": "unauthorized_client",
         "error_description": "The client is not authorized to request a token using this method."
     }
     ```
     其中，error表示错误提示，error_description表示错误描述信息。
     
  
  6. 将Headers中的**access-token** 参数，设置为上一步得到的access_token，成功调用自定义的API接口。
     图3成功调通API接口   
     ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910149740.png "点击放大")
     返回消息体中包含三种参数，"resCode"和"resMsg"参数代表此次请求的状态码及请求信息，您可以通过自定义错误码信息来设置请求错误时的返回信息，具体参考[错误码（数据面）](https://support.huaweicloud.com/api-astrozero/astrozero_api_0082.html)。"result"参数为调用的接口返回的数据，与查看API信息时接口"返回消息"内容一致。
     
   
- 通过"授权码模式"获取的access-token，可用于获取用户信息时进行鉴权，使用时在请求消息头上设置"Authorization"。
  1. 在[华为云Astro轻应用服务控制台](https://console.huaweicloud.com/appcube/?locale=zh-cn#/home)的主页中，单击"进入首页"，进入应用开发页面。
  
  2. 在页面左上方单击![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001964336513.png)，选择"环境管理 \> 环境配置"，进入环境配置。
  
  3. 在左侧导航栏中，选择"集成连接 \> OAuth"菜单，新建OAuth管理。
     图4新建授权码模式OAuth管理   
     ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001944028909.png "点击放大")
     **重定向地址将作为第三方系统同意授权后的跳转页面，并在页面地址上携带授权码信息。**
     
  
  4. 在OAuth管理列表中，单击该鉴权所在行的![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910109788.png)，下载密钥文件。
     表5密钥文件参数 
     | 参数            | 参数说明                                        |
     |:---|:---|
     | redirect_uri  | 当"授权类型"配置为"授权码模式"时，密钥文件会包含该参数，为上一步设置的重定向地址。 |
     | client_id     | 鉴权的客户端ID。                                   |
     | client_secret | 鉴权密钥。                                       |
        
     
  
  5. 根据鉴权ID和重定向地址，在浏览器上的访问接口"https://华为云Astro轻应用域名/baas/auth/v1.0/oauth2/authorize"，获取授权码信息。
     表6请求参数说明 
     | 参数名           | 类型     | 必选（M）/可选（O） | 参数位置   | 参数含义               | 值        |
     |:---|:---|:---|:---|:---|:---|
     | response_type | String | M           | Params | 授权接口返回类型，即返回授权码    | code     |
     | client_id     | String | M           | Params | 客户端鉴权ID，可在OAuth查看。 | 从上一步骤获取。 |
     | redirect_url  | String | M           | Params | 重定向地址。             | 从上一步骤获取。 |
        
     
  
  6. 单击"授权"按钮，跳转到重定向地址，并携带授权码信息。
     图5授权码信息   
     ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910149728.png "点击放大") 
  
  7. 根据授权码code，根据鉴权ID、鉴权密钥通过Post请求调用接口"https://华为云Astro轻应用域名/baas/auth/v1.0/oauth2/token"，获取access_token。
     表7请求参数说明 
     | 参数名           | 类型     | 必选（M）/可选（O） | 参数位置 | 参数含义                            | 值                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
     |:---|:---|:---|:---|:---|:---|
     | grant_type    | String | M           | Body | 授权模式，OAuth2.0中的grant_type字段的取值。 |  **参数解释**： 授权模式，OAuth2.0中的grant_type字段的取值。 **约束限制**： 不涉及。 **取值范围**： - authorization_code（即授权码模式）   **默认取值**： 不涉及。 |
     | client_id     | String | M           | Body | 客户端鉴权ID，可在OAuth查看。              | 从[4]中获取。                                                                                                                                                                                                                                                                                                                                                                                                                              |
     | client_secret | String | M           | Body | 客户端鉴权密钥，可在OAuth查看。              | 从[4]中获取。                                                                                                                                                                                                                                                                                                                                                                                                                              |
     | redirect_url  | String | M           | Body | 重定向地址。                          | 从[4]中获取。                                                                                                                                                                                                                                                                                                                                                                                                                              |
     | code          | String | M           | Body | 授权码。                            | 从[6]中获取。                                                                                                                                                                                                                                                                                                                                                                                                                              |
     | locale        | String | O           | Body | 语言。                             | en_US                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
        
     表8返回参数说明 
     | 参数            | 参数说明                |
     |:---|:---|
     | access_token  | 认证后可信任的Token凭证。     |
     | expires_in    | 当前access_token的有效期。 |
     | refresh_token | 用于刷新access_token。   |
     | token_type    | access_token类型。     |
        
     图6接口调用结果   
     ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001944028917.png "点击放大")
     
     **使用授权码获取access-token后即失效，重新获取access-token需要重新生成授权码。**
     
  
  8. 将得到的token_type与access_token进行拼接，以{token_type} {access_token}的形式设置为Headers中的Authorization参数，通过Get请求调用接口"https://华为云Astro轻应用域名/u-route/baas/oauth/v1.0/userinfo"，获取用户信息。
     图7获取用户信息   
     ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910149752.png "点击放大") 
   
 
 #### 业务用户通过RefreshToken获取新的Token
1. 开启RefreshToken特性。 
   1. 在[华为云Astro轻应用服务控制台](https://console.huaweicloud.com/appcube/?locale=zh-cn#/home)的"主页"中，单击"进入首页"，进入应用开发页面。
   
   2. 在页面左上方单击![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001937261668.png)，选择"环境管理 \> 环境配置"，进入环境配置。
   
   3. 在左侧导航栏中，选择"系统设置 \> 系统参数"。
   
   4. 在"内置系统参数"页签，查找"bingo.service.refreshtoken.enable"，单击搜索结果中的该参数名，在参数详情页单击"值"后的编辑按钮，设置参数值为"是"，单击"保存"。
      图8查找参数   
      ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910149764.png "点击放大")
      图9修改值为是   
      ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001944028925.png "点击放大") 
   
   
   
   
2. 业务用户（例如"test_cs"）通过服务编排的"PORTALUSERLOGIN"公式登录华为云Astro轻应用。 
   1. 在"我的应用"中，单击某个应用，进入应用开发平台。
   
   2. 将鼠标放在左侧某个文件夹，单击界面上出现的"+"，在弹出菜单中选择"服务编排"。
   
   3. 设置标签为"testPortalUserLogin"，单击"名称"的输入框，系统会自动填充。然后单击"添加"。
   
   4. 在服务编排编辑器页面右侧，选择![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001944028929.png)，在全局上下文页面单击"公式"后的加号。
   
   5. 在公式页面设置"名称"为"portal"，"数据类型"设置为"文本"，表达式为"PORTALUSERLOGIN("test_cs")"，单击"保存"，创建公式变量"portal"，表达式中的"test_cs"为要登录系统的业务用户名。
      图10新建公式变量   
      ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910149768.png "点击放大") 
   
   6. 在服务编排编辑器页面右侧，选择![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910149748.png)。
   
   7. 在全局上下文页面，单击"变量"后的加号，默认创建名为"variable0"的文本类型变量。
   
   8. 在服务编排编辑器页面右侧，选择![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910109792.png)，按照下图从全局上下文页面中拖拽参数到出参区域，设置服务编排的出参。
      图11设置服务编排的出参   
      ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910109776.png "点击放大") 
   
   9. 在左侧拖拽"逻辑"下"赋值"图标至画布中，按照下图设置赋值图元。
      图12设置赋值图元   
      ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910149756.png "点击放大") 
   
   10. 连接所有元素。 ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910109784.png "点击放大")
       
   
   11. 在页面上方，单击![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910109752.png)，保存服务编排。
   
   12. 保存成功后，单击![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001944028941.png)，不用设置输入参数直接单击"运行"，运行服务编排。
       输出如下，表示业务用户已登录华为云Astro轻应用。
       ```
       {
         "interviewId": "002N000000jeTG4DKxSS",
         "outputs": {
           "variable0": "XXX"
         }
       }
       ```
       其中，"variable0"取值为业务用户的access-token值。
       
   
   13. 在输出的页面，按"F12"或者"Ctrl + Shift + I"，可开启调试工具。
   
   14. 在Cookies中，获取"refresh-token"值。
       ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001910109748.png "点击放大")
       
   
   
   
   
3. 使用[Postman](https://www.getpostman.com/)发送请求，获取新Token。
   
   1. 在本地PC上下载并安装[Postman](https://www.postman.com/downloads/)工具，该工具仅用于测试使用。
   
   2. 使用Postman进行POST请求，URL配置为"https://华为云Astro轻应用域名/baas/auth/v1.0/refreshtoken"，在请求消息头上设置参数"Content-Type"值为"application/json"，请求消息体中设置参数"grant_type"值为"refresh_token"，"refresh_token"值为[2.n]获取的"refresh-token"参数值。输出的result值即为新的Token，原有的Token不管有没有失效，都会被置成失效状态。
      图13Postman发送请求   
      ![](https://support.huaweicloud.com/api-astrozero/zh-cn_image_0000001944028945.png "点击放大")
      表9请求消息头 
      | 消息头名称        | 描述                                                                              | 是否必选 |
      |:---|:---|:---|
      | Content-Type | HTTP协议中设定的一个参数，用于标识返回的内容用什么格式去解析，此处必须配置为"application/json"。表示浏览器将返回内容解析为json对象。 | 是    |
         
      表10消息体说明 
      | 参数名           | 描述                                                                 | 是否必选 |
      |:---|:---|:---|
      | grant_type    | 授权类型，配置为"refresh_token"。                                           | 是    |
      | refresh_token | 配置为[2.n]获取的"refresh-token"参数值。 | 是    |
         
      
   
   
   
   
 
