在arkid中新建应用
参考:https://www.yuque.com/longguikeji/arkid/wg29gv
接口详情
上一步完成之后,点击应用的接口详情,后续有用的参数如下
- 应用ID(
client_id) - 应用秘钥(
client_secret) - 重定向端点(
redirect_uris) - 认证地址(
https://server.example.com/oauth/authorize/) - 获取token地址(
https://server.example.com/oauth/token/) - 身份信息地址(
https://server.example.com/oauth/userinfo/)
四种授权方式
参数列表
| 参数 | 描述 |
|---|---|
| reponse_type | 表示请求返回的类型,有code和token两种,code表示请求返回授权码,token表示请求返回accessToken |
| client_id | 客户端注册的时候认证服务器发放的id,用于认证客户端的身份 |
| client_secret | 客户端注册的时候认证服务器发放的客户端秘钥,用于认证客户端的身份 |
| state | 不是必须的,客户端请求认证服务器时候带上一个state,认证服务器返回的时候原封不动地返回这个state,告诉客户端是认证服务器的response,而不是别人,用于防止跨站请求攻击好像。 |
| redirect_uri | 用户授权或者否定授权以后认证服务器重定向回客户端的url |
| scope | 表示请求的权限范围,read,write,read+write |
| code | 授权码,用于客户端向认证服务器请求token,一般10分钟过期,而且只能使用一次 |
| grant_type | 表示授权方式, authorization_code 表示授权码方式,implicit 表示隐式, password表示密码方式, client_credentials表示凭证方式 |
授权码
基于授权码code,是最严谨,最安全,流程最完整的授权模式
- 0) arkid中添加应用,记下
redirect_uris,并在接口详情里查看client_id和client_secret。


1)用户访问客户端(第三方应用),客户端引导(重定向)用户的代理(浏览器)去到授权服务器的授权页面,这个时候客户端会在URI上附上 client_id, redirect_uri, scope以及 state.
这里以浏览器测试为例: ```shell
使用上一步中的 client_id和redirect_uri; state随意写,保证下边的请求一致就行.
修改后,复制粘贴到浏览器地址栏访问
- 2)授权服务器要求用户A输入用户密码认证身份,并询问用户A是否同意授权点击**Authorize**<br />- 3)用户同意授权,授权服务器使用 redirectUri (在authorization request中redirect_uri或者客户端注册是的redirectUri)将用户导向客户端,并附上一个授权码code;不用在意报错,因为我们本地现在并没有应用。<br />- 4)客户端拿到授权码code以后,在后台使用授权码向授权服务器发送post请求换取accessToken令牌,并附上在(1)这个步骤请求授权码的时候的redirect_uri。这里使用postman模拟请求:<br /> Authorization使用 Basic Auth 填 client_id 和 client_cecret<br /> Body 也填上所需的信息<br /><br />- 5)认证服务器认证客户端,检验授权码以及redirectUri,检验成功后发放 accesToken 以及 refreshToken<br />最后客户端就可以使用令牌向**身份信息地址**请求身份信息了。<a name="MrLKp"></a>## 隐式授权码模式的简化版本,缺少了授权码环节<br />有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。<br />OAuth2 允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)“隐藏式”(implicit)<br />令牌直接存储到前端浏览器,是不太安全的。- A)用户访问客户端(第三方应用),客户端引导(重定向)用户的代理(浏览器)去到授权服务器的授权页面,这个时候客户端会在URI上附上 client_id, redirect_uri, scope以及 state,例如:
- B)授权服务器要求用户A输入用户密码认证身份,并询问用户A是否同意授权- C)假设用户同意授权,授权服务器使用 redirectUri (在authorization request中redirectUri或者客户端注册是的redirectUri)将用户导向客户端,并附上令牌 accessToken
令牌的位置URL 锚点(fragment),而不是查询字符串,好像是为了避免中间人攻击啥的 (http)- D、E、G)看网上说是使用一段脚本能够将token从(C)重定向的URI抽取出来,具体怎么时候就不是很清楚了最后客户端就可以使用令牌向**身份信息地址**请求身份信息了。<a name="zNfaO"></a>## 密码第三方应用直接使用资源拥有者的用户密码去获取令牌<br />OAuth2 允许用户把用户名和密码直接告诉该应用,该应用就使用你的密码申请令牌,这种方式称为"密码式"(password),直接提供账号密码,风险很大,所以应当是用户高度信任客户端才会使用这种方式。<br />客户端直接使用用户的账户密码去换取accessToken,发送的post请求:
POST http://server.example.com/oauth/token/ body: grant_type=password&username=user001&password=DasFdf234&client_id=xxx
<a name="PrPmO"></a>## 客户端第三方应用使用客户端凭证请求令牌<br />客户端直接使用客户端凭证(client credentials)向认证服务器请求令牌,适用于没有前端的命令行应用。<br />同样使用post请求:
POST http://server.example.com/oauth/token/ body: grant_type=client_credentials&client_id=xxx&client_secret=SECRET&scope=read ```
RefreshToken
client请求token的时候,服务器会返回一个refreshToken,accessToken的过期时间很短,当accessToken过期了之后,授权服务器允许client通过refreshToken去再次请求一个新的accessToken。所以refreshToken的过期时间肯定是要比accessToken长。
refreshToken是可选的,如果对于安全要求比较高的话,可以不用。
开发示例
https://github.com/reddit-archive/reddit/wiki/OAuth2-Python-Example

