什么是 OAuth 授权?

一、什么是 OAuth 协议

OAuth(开放授权) 是一个开放标准, 所谓 OAuth(即 Open Authorization,开放授权),它是为用户资源授权提供了一种安全简单的标准,

允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息。

而这种授权无需将用户提供用户名和密码提供给该第三方网站而是直接从服务商提供的页面直接登录。

OAuth 允许用户提供一个访问标记 (专业点叫做令牌) 给第三方网站,一个访问标记 (专业点叫做令牌) 对应一个特定的第三方网站,同时该访问标记 (专业点叫做令牌) 只能在特定的时间内访问特定的资源

说白了就是: 也就是说用户在访问第三方 web 或应用的时候,第三方在不知道用户的账号和密码的情况下 经过用户授权后就可以获取用户在服务商哪里存储的文章, 微博信息等等信息

OAuth授权过程 - 图1

可参考这个实现: https://github.com/go-oauth2/oauth2


一、OAuth 授权必须经过三个步骤

第一步: 获取未授权的 Request Token (请求标记) 跳转到服务商的登录页面

第二步: 获取用户授权 Request Token(请求标记) 用户输入账号密码进行登录授权

第三步: 用授权过的 Request Token(请求标记) 换取 Access Token (访问标记)

以上三个步骤是 OAuth 授权的必须步骤 , 可能很多公司的授权方式各有不同, 但是大致步骤是一样的

下面以新浪微博为例子 介绍下如何进行 OAuth 授权:

1. 首先你要成为新浪的开发者 点击这里进入开发者网站:http://open.weibo.com

进入后注册一个账号 添加开发者个人信息 , 你可以直接用你的微博账号登录 然后加入开发者即可 详细步骤这里不再赘述

2. 创建应用 如何创建应用, 直接点击顶部导航栏的我的应用 即可 创建

*假设你创建的应用名称加做 “程序源微博 “

*应用创建完毕默认 就进入 “开发阶段” 就具备了授权资格

*这个时候点击我的应用 —> 应用信息 你会看到如下的信息

OAuth授权过程 - 图2

App Key:917518064 应用的唯一标识

App Secret:b18853174e2902fd05b04dc34d7be792 密钥

应用地址:https://itunes.apple.com/cn/genre/ios/id36?mt=8

这是时候我们还需要设置一个回调页面, 就是授权成功后跳转的页面 如何设置?

OAuth授权过程 - 图3

点击编辑 然后输入你要回调的页面网址即可

2. 有了上面的设置之后 我们就可以进行资源授权了 我们现在都是 OAuth 授权 2.0

(1) 首先第一步获取未授权的 Request Token 来到服务器的登录界面

*新浪提供的页面是这个页面:https://api.weibo.com/oauth2/authorize

*必须要传递的两个参数:

client_id (string 类型) 申请应用时分配的 AppKey // 得知道给哪个应用授权
redirect_uri (string 类型) 授权回调地址 // 授权成功后跳转到哪个页面

也就是说我们要正确的来到服务器提供的授权登录界面完整的 url 地址应该是这样的:

https://api.weibo.com/oauth2/authorize?client_id=917518064&redirect_uri=http://www.cnblogs.com/syios

打开上面的地址你会看到如下界面:

OAuth授权过程 - 图4

此时我们输入我们的微博账号 这里也可以自己给自己授权也就是说你可以用户刚刚创建应用的账号 对你的应用进行授权

当我们点击登录后 , 这次授权就成功了, 当然如果你是第一次授权可能看到不是上面的界面 而是授权界面 这个时候你点击授权即可

登录成功后回跳转到回调页面

(2) 获取授权过的 Request Token

授权成功后回自动跳转到回调页面

OAuth授权过程 - 图5

你会发现新浪会在回调页面后面拼接一个参数 这个参数 code 就是授权成功后的 Request Token (请求标记)

(3) 根据授权过 Request Token(请求标记) 获取一个 Access Token(访问标记)

这个时候新浪提供了另外一个地址 用来获取访问标记

URL : https://api.weibo.com/oauth2/access_token

当然也必须要传如下的参数 才能成功获取访问标记:

client_id string 申请应用时分配的 AppKey。
client_secret string 申请应用时分配的 AppSecret。
grant_type string 请求的类型,填写 authorization_code
code string 调用 authorize 获得的 code 值。
redirect_uri string 回调地址,需需与注册应用里的回调地址一致

这个时候我们只需要将所有的参数通过 POST 方式发送给新浪服务器之后我们会得到服务器的返回数据 返回结果如下:

{
“access_token”=”2.00vWf4GEUSKa7D739148f7608SXA9B”;
“expires_in” = 137596133;
“remind_in” = 137596133;
uid = 1258537523;
}

access_token: 就是我们需要的访问标记 我们只需要获取这个标记 保存即可

uid: 表示当前登录用户的 ID

这里需要大家明白一个知识点:

access_token : 1 个用户给 1 个应用授权成功后,就获得对应的 1 个 access_token,作用是:允许 1 个应用访问 1 个用户的数据
uid:1 个用户对应 1 个 uid,每 1 个用户都有自己唯一的 uid
举例:

张三 / 李四
应用 1 / 应用 2
张三给应用 1、应用 2 授权成功了:1 个 uid、2 个 access_token
李四给应用 2 授权成功了:1 个 uid、1 个 access_token
上面操作:产生了 2 个 uid,3 个 access_token

3. 授权过程中的常见错误

1.invalid_request
1> 没有传递必填的请求参数
2> 请求参数不对
3> URL 中间留有空格

2.invalid_client
1> client_id 的值传递错误(AppKey 不对)

3.redirect_uri_mismatch
1> 回调地址不对

提醒: 授权帐号注意 如果应用还没有经过新浪审核,只能访问自己或者其他 15 个测试帐号的微博数据

https://www.cnblogs.com/syios/p/4762546.html