zoukankan      html  css  js  c++  java
  • OAuth2.0 四种授权方式

    【什么是OAuth】

    OAth是一种授权机制。数据所有者授权第三方应用获取一定权限。数据所有者产生一个代替密码的令牌(token)供第三方应用使用。

    比方说,我想使用QQ快捷登录一个应用,但我又不想我的账号密码泄露。那么使用OAuth2.0我登录QQ验证了自己的身份,然后QQ便发送一个token给应用,

    应用登录。应用获取到token的同时,可能还会获得头像,昵称等(但密码不会泄露)

    【token与密码的区别】

    1.token是短期的,会过期,密码不修改不会过期

    2.token可撤销,密码只能修改不能撤销

    3.token有权限范围,他只能获取一定权限,而密码则是所有

    【四种授权方式】

    一.授权码

    第三方应用首先申请一个授权码,通过授权码获取相关权限

    步骤:

    1.A网站提供一个B网站的链接让用户登录

    https://b.com/oauth/authorize?
      response_type=code&
      client_id=CLIENT_ID&
      redirect_uri=CALLBACK_URL&
      scope=read
    redirect_uri表示登录之后跳转的页面,
    client_id表示请求对象
    code表示是以授权码的形式
    scope表示授权范围(只读)

    2.用户在B网站登录之后,返回授权码

    https://a.com/callback?code=AUTHORIZATION_CODE

    code就是授权码

    3.A网站拿到授权码之后就可以向B网站发送请求,获取令牌

    https://b.com/oauth/token?
     client_id=CLIENT_ID&
     client_secret=CLIENT_SECRET&
     grant_type=authorization_code&
     code=AUTHORIZATION_CODE&
     redirect_uri=CALLBACK_URL
    client_id和client_secret确认请求对象的身份
    grant_type表示认证方式是授权码
    code就是获取的授权码
    4.B网站接受请求在之后,就会以json形式发送token
    {    
      "access_token":"ACCESS_TOKEN",
      "token_type":"bearer",
      "expires_in":2592000,
      "refresh_token":"REFRESH_TOKEN",
      "scope":"read",
      "uid":100101,
      "info":{...}
    }

    access_token就是要获取的token

    二. 隐藏式

     不使用授权码(没有后端接收,只在前端),直接获取token

    步骤:

     1.A网站提供一个B网站的链接让用户登录

    https://b.com/oauth/authorize?
      response_type=token&
      client_id=CLIENT_ID&
      redirect_uri=CALLBACK_URL&
      scope=read

    直接让响应的类型为token

    2.登录成功之后跳转A网站

    https://a.com/callback#token=ACCESS_TOKEN

    这里token在URL锚点位置,而不是和上面一样附在请求头。因为锚点不会发送到服务器

    但这样不安全,因为直接返回到前端,显示在锚点上面

    三. 密码式

    直接使用你的账号密码申请token

     1.A网站提供一个B网站的链接让用户登录

    https://oauth.b.com/token?
      grant_type=password&
      username=USERNAME&
      password=PASSWORD&
      client_id=CLIENT_ID

     2.直接获取token,这里没有跳转,拿到token之后以json的形式使用http回应

    必须对应用高度信任

    四. 凭证式

    试用于没有前端的应用

    步骤:

    1.A应用向B发送请求

    https://oauth.b.com/token?
      grant_type=client_credentials&
      client_id=CLIENT_ID&
      client_secret=CLIENT_SECRET

    2.验证通过之后,直接返回令牌

    针对第三方应用,共用token

    拿到token之后以后向B网站请求数据都必须在请求头带上token,

    curl -H "Authorization: Bearer ACCESS_TOKEN" 

    【更新token】

    方法:向B网站请求两个token,一个用于登录,一个用于更新

    https://b.com/oauth/token?
      grant_type=refresh_token&
      client_id=CLIENT_ID&
      client_secret=CLIENT_SECRET&
      refresh_token=REFRESH_TOKEN
     
    记录编程的点滴,体会学习的乐趣
  • 相关阅读:
    GDI+重绘笔记
    VC++动态链接库(DLL)编程深入浅出(四)
    VC++动态链接库(DLL)编程深入浅出(三)
    VC++动态链接库(DLL)编程深入浅出(二)
    VC++动态链接库(DLL)编程深入浅出(一)
    AOP在 .NET中的七种实现方法
    [c#菜鸟]lambda表达式
    C# IP地址与整数之间的转换
    log4net在xp下不能写日志到mdb,报错Could not load type 'System.Security.Claims.ClaimsIdentity'
    Active Directory 域服务之AD DS 逻辑组件概述
  • 原文地址:https://www.cnblogs.com/AduBlog/p/13597603.html
Copyright © 2011-2022 走看看