• Oauth2.0认证---授权码模式


    目录:

    1.功能描述

    2.客户端的授权模式

    3.授权模式认证流程

    4.代码实现

    1.功能描述

    • OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。"客户端"不能直接登录"服务提供商",只能登录授权层,以此将用户与客户端区分开来。
    • "客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。

    2.客户端的授权模式

    Oautho2.0为客户端定义了4种授权模式:

    • 授权码模式
    • 简化模式
    • 密码模式
    • 客户端模式

    授权码模式是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。

    3.授权模式认证流程

    授权码模式的认证流程:

    (A)用户访问客户端,后者将前者导向认证服务器。

    (B)用户选择是否给予客户端授权。

    (C)假设用户给予授权,认证服务器首先生成一个授权码,并返回给用户,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

    (D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

    (E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

    注意:(C)和(D)中两个重定向URI是不一样的,(C)中的重定向URI是用来核对的,这个是服务器事先指定并保存在数据库里面。而(D)中的重定向URI指的是生成access_token的url。

    4.代码实现

    1)定义客户端信息,并保存在数据库中

    例如:

        id:“app”,
       secret: 'xffcncgmveu6slxg',
       redirectUri: 'http://127.0.0.1:3000/example/auth/callback'

    以上字段是必须的,如果还需要其他描述,可以自行添加字段。

    2)判断用户是否登录:

    function ensureLogin(req,res,next){
        //判断用户是否登录
            //这里假设用户已经登录,且默认如下
            req.loginUserId = 'Along';
        next();              
    }

    3)生成授权码代码:

    http://127.0.0.1:3000/OAuth2/authorize?client_id=a10086&response_type=code&redirect_uri=http%3A%2F%2F127.0.0.1%3A3000%2Fexample%2Fauth%2Fcallback

    • response_type:表示授权类型,必选项,此处的值固定为"code"
    • client_id:表示客户端的ID,必选项
    • redirect_uri:表示重定向URI,可选项
    • scope:表示申请的权限范围,可选项
    • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

    生成授权码的代码如下:

    授权码的信息包括:授权码、用户的id、客户端的id、重定向url

    exports.generatorCode = function(req,res,next){
        var code  = randomString(20);   //生成20长度字符串
        var cdinfo = { 
            code:code,
            userId:userId,
            clientId:clientId,
            redirectUri:redirectUri    
        };  
        //存入数据库  
        (new codeInfo(cdinfo)).save(function(err,doc){
            if(err){
                return callback(err);
            }    
        })  
        callback(null, code);  
    };

     4)生成access_token:

    服务器生成授权码后,将授权码添加到url后面,然后导向这个url如:

    http://127.0.0.1:3000/example/auth/callback?code=Bu9C5OBmO2odzuWpVTpn

    生成access_token的代码如下:

    access_token的信息包括:token、用户id、客户端id

    exports.generateToken = function (userId, clientId,expires,callback) {
        var code = utils.randomString(20) + '.' + (getTimestamp() + expires);
        var tkinfo = {
            token:code,
              userId:userId,
              clientId:clientId
        };
        (new tokenInfo(tkinfo)).save(function(err,doc){
            if(err) return callback(err);
            callback(null,code);
        })
    };

    可以看到生成code和token的方式是一样的,你也可以定义不一样的方式。

      

     

  • 相关阅读:
    POJ1251 Jungle Roads 【最小生成树Prim】
    聪明的kk
    日积月累:weightSum和layout_weight属性合用
    ubuntu 下舒畅的使用libreoffice
    maple 教程
    龙、虎、鲸书杂谈
    百度没出新算法之前这样的最好的的优化方案
    DWR入门实例(二)
    Android应用公布的准备——生成渠道包
    leetcode第一刷_Spiral Matrix II
  • 原文地址:https://www.cnblogs.com/y-yxh/p/5903771.html
Copyright © 2020-2023  润新知