zoukankan      html  css  js  c++  java
  • 使用ms owin 搭建oauth2 server

    http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

    有示例代码

    关于token的加密解密

    server 端

    app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
    {

    其中AccessTokenFormat可以设置身份的序列化和加密方式,遗憾的是不能用简单的json或xml,因为有循环引用

    是一个实现了ISecureDataFormat<AuthenticationTicket>的类,AuthenticationTicket 中有循环引用,所以json不能

    resource端

    app.UseOAuthBearerAuthentication(new Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationOptions(){
        AccessTokenFormat=……
    });

    要设置成同样的处理方式

    server端加密,resource端解密

    关于Cookie中的Base64字符串

    示例代码中,身份认证用的是mvc5新的identiy,而我的身份认证是自定义的(基于以前的一个网站)。cookie中存的是base64的字符,其中可能会存在加号(+)

    用原本的Request.Cookie获取,加号取出来就是加号

    但是通过IOwinContext取出来,+号变成了空格。

    要注意对这部分进行处理

    关于客户端和服务器端的交互

    整个oauth,可以认为有3方

    1、oauth认证服务(server)

    2、api服务(resource)

    3、要调用api的网站(client)

    最终的目的是client获取resource的数据,但是resource的数据不是谁都可以随便取的,所以需要先经过server的认证和授权

    如果用.net开发客户端和服务端,则按照例子中的,用DotNetOpenAuth.OAuth2这个,也挺方便

    但我们搭建oauth,是要为其他网站服务的,不能仅适用于.net,所以有必要了解一下客户端的流程

    首先,针对每一个第三方的客户端(网站或手机app之类的)都需要给他分配(或自己设定)

    1、client id 字符串,能够唯一标识一个第三方应用

    2、secret  对应的密钥

    3、redirect uri  认证之后,认证服务会跳转会应用的页面,此页面接收返回的token

    大体流程如下

    1、客户端在需要认证的时候,跳转到认证服务器

    http://server/OAuth/Authorize?client_id=…&redirect_uri=…&state=…&response_type=code

    此时,页面会停留在认证服务器,要浏览器点确定按钮(如果没登录,会先跳转到登录页,登录后还回到这个页)

    当用户点确定(同意授权)之后,会跳转会传来的redirect_uri这个参数对应的网址,

    http://www.abc.com/test/authback

    然后在后面会有参数

    ?code=….&state=….

    其中state是你发给服务什么,服务就原样给你返回什么。

    你可以,在发送给服务端之前,生成一些随机数,然后保存在cookie,当服务器返回后,与cookie中的比对,来确定在过程中是否有被劫持或进行过其他的改动。

    code是关键性的东西,之后我们要写一些程序来向服务发起一个请求会用到此code

    2、http://server/OAuth/Token发送post请求到这个地址,并且

    form的值包括

    redirect_uri=…&grant_type=authorization_code&code=…
    其中code,就是上一步获取到的code,grant_type是固定值(这里只针对AuthorizationCodeGrant这种方式)
    redirect_uri还是同样的那个地址(注意这里不能用不一样的地址,因为在注册应用的时候,只设定了这一个地址,所以对所有的返回应用的地址,都要使用这一个)
    并且,要在header中传递
    Authorization,值为 
     
    clientid+冒号+secret(clientid+”:"+secret)
    把这个结果用utf8编码方式转成base64字符串
    Authorization这个header中的值为 "Basic "+base64字符串(注意有个空格)
    如果一切正常,我们能够拿到一个json的返回值,包含了access token,refresh token,以及过期时间等
     
    3、拿access token去api服务端获取数据
    同样,我们在请求api的时候,需要设置header
    Authorization 值为 "bearer "+accesstoken
    
    
    


     

    关于过期时间和刷新

    在第二步拿到的json,除了access token以外,还会有

    expires_in 和 refresh_token

    expires_in是秒

    如果过期了,可以拿refresh_token重新获取一个

    post请求http://server/OAuth/Token

    head与第二步一样

    form:

    grant_type = refresh_token (固定值)

    refresh_token(第二步拿到的字符串)

    请求成功后,获取到json(与第二步格式一样)

    server中owin的option里可以设置AuthorizationCode和AccessToken的时间,默认是5分钟和20分钟

  • 相关阅读:
    hdu4612 无向图中随意加入一条边后使桥的数量最少 / 无向图缩点+求树的直径
    Python 之 安装模块的多种方法
    开源项目Universal Image Loader for Android 说明文档 (1) 简单介绍
    IDEA下使用Jetty进行Debug模式调试
    离线安装Cloudera Manager5.3.4与CDH5.3.4(一)
    让你提前认识软件开发(38):完毕第一个新需求
    Windows App开发之经常使用控件与应用栏
    【剑指Offer学习】【面试题58:二叉树的下一个结点】
    【Win】编写简单的bat文件
    【Linux】MySQL解压版安装及允许远程访问
  • 原文地址:https://www.cnblogs.com/czcz1024/p/4057479.html
Copyright © 2011-2022 走看看