Oauth是一种授权机制, 用来授权第三方应用, 获取相关数据
实际应用场景举例:
-
授权打印应用能打印用户云相册里的图片
那么打印应用需要进入到用户云相册里面获取图片, 我们可以把用户名和密码提供给打印应用就解决了
但是稍微细想一下, 就会发现有很大的安全隐患, 应用会不会获取云相册里的其他信息(我只想给他获取某个相册的权限)? 应用会不会把用户名和密码泄露给其他人?
所以有没有一种机制可以授权部分权限给第三方应用, 而不用提供用户名和密码呢?
-
应用不建立自己的用户名和密码认证系统, 采用联合认证
应用建立自己的用户名和密码认证系统, 被业界认为是不安全的行为, 而且对用户来说也很麻烦, 需要注册, 设置密码, 等等
那么应用可以不可以利用用户的其他常用的账号来进行认证呢? 比如微信, 而不用新注册一个账号
上面两个场景就需要用到Oauth, 我们已第二种场景, 用微信认证做例子, 说明这种机制的过程:
- 应用开发者在微信上注册一个账号, 获取到client id和client secret, 以及设置一个自己的跳转url
- 当用户点击微信登录时, 服务器会拿client id想微信的认证地址请求, 此时跳转到一个界面, 需要用户扫码认证, 并且同意授权
- 此时会跳转到应用开发者设置的跳转url, 并且微信平台会提供一个有过期时间的code
- 在这个url的后台逻辑里, 会用提供的code, 以及client id和client secret向微信提供token的接口请求, 从而获得token
- 后台在用这个token去微信提供的用户信息api接口, 来获取用户信息, 如果用户是第一次登陆, 那么可以将用户信息写入自己的数据库(如果不是, 则跳过这一步)
- 这样就完成认证了, 跳转到应用自己的业务界面里面即可
如果是Django应用, 想创建自己的Oauth中心, 则可以利用django-oauth-toolkit来做, 按照官方文档做一遍, 就能比较清晰的理解OAuth了