使用OAuth打造webapi认证服务供自己的客户端使用(二)

在上一篇”使用OAuth打造webapi认证服务供自己的客户端使用“的文章中我们实现了一个采用了OAuth流程3-密码模式(resource owner password credentials)的WebApi服务端。今天我们来实现一个js+html版本的客户端。

一、angular客户端

angular版本的客户端代码来自于http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/,接下来我们做个简单的梳理,方便大家在项目中使用。

1、新建一个angular module,我们使用ngRoute来实现一个单页面程序,LocalStorageModule用来在本地存放token信息,angular-loading-bar是一个页面加载用的进度条。

var app = angular.module(‘AngularAuthApp‘, [‘ngRoute‘, ‘LocalStorageModule‘, ‘angular-loading-bar‘]);

2、新建一个constant,angular中的constant可以注入到任意service和factory中,是存储全局变量的好帮手。

app.constant(‘ngAuthSettings‘, {
    apiServiceBaseUri: ‘http://localhost:56646/‘,
    clientId: ‘ngAuthApp‘
});

地址:http://localhost:56646/就是我们自己的webApi地址。

3、authService中定义了登录和登出逻辑,登录逻辑就是我们使用OAuth2.0中的流程3获取token的过程,一旦获得到token也就意味着我们登录成功了。

var _login = function (loginData) {

        var data = "grant_type=password&username=" + loginData.userName + "&password=" + loginData.password;

        var deferred = $q.defer();

        $http.post(serviceBase + ‘token‘, data, { headers: { ‘Content-Type‘: ‘application/x-www-form-urlencoded‘ } }).success(function (response) {

            if (loginData.useRefreshTokens) {
                localStorageService.set(‘authorizationData‘, { token: response.access_token, userName: loginData.userName, refreshToken: response.refresh_token, useRefreshTokens: true });
            }
            else {
                localStorageService.set(‘authorizationData‘, { token: response.access_token, userName: loginData.userName, refreshToken: "", useRefreshTokens: false });
            }
            _authentication.isAuth = true;
            _authentication.userName = loginData.userName;
            _authentication.useRefreshTokens = loginData.useRefreshTokens;

            deferred.resolve(response);

        }).error(function (err, status) {
            _logOut();
            deferred.reject(err);
        });

        return deferred.promise;

    };

我们按照OAuth2.0中的流程3来Post数据,拿到token信息后保存在localStorageService。

3、启动AngularClient.Web项目尝试一下登录

由于同源策略的原因,我们需要在WebApi服务端启用cors,打开Startup类配置cors:

4、一旦登录成功意味着我们拿到了token,所以可以凭token访问受限的资源,例如http://localhost:56646/api/orders。只需要在每个请求头中加入Authorization:Bearer {{token}}即可。

我们可以使用angular的拦截功能,只需要在$http服务中拦截每个请求,在请求头中加入token即可。

app.config(function ($httpProvider) {
    $httpProvider.interceptors.push(‘authInterceptorService‘);
});

angular中的provider是可以配置的,正如上面的代码我们添加了一个authInterceptorService拦截服务。

拦截逻辑也很简单:如果在localStorageService中读到token,就添加一个header。

var _request = function (config) {

        config.headers = config.headers || {};

        var authData = localStorageService.get(‘authorizationData‘);
        if (authData) {
            config.headers.Authorization = ‘Bearer ‘ + authData.token;
        }

        return config;
    }

5、再次登录,当登录成功后成功调用到了http://localhost:56646/api/orders服务

二、JQuery客户端

JQuery客户端的实现思路也差不多,首先发一个post请求获取token:

var apiServiceBaseUri = ‘http://localhost:56646/‘;
        $(‘#login‘).click(function () {
            var data = {
                ‘grant_type‘: ‘password‘,
                ‘username‘: $(‘#userName‘).val(),
                ‘password‘: $(‘#password‘).val()
            };
            $.ajax({
                url: apiServiceBaseUri + ‘token‘,
                type: "POST",
                data: data,
                dataType: ‘json‘,
                success: function (data) {
                    $.cookie("token", data.access_token);
                    getOrders();
                },
                error: function (xmlHttpRequest) {
                    $("#message").html(xmlHttpRequest.responseJSON.error_description);
                    $("#message").show();
                }
            });

token一旦获取成功就保存在cookie中。接下来拿token去访问受限的服务:

var getOrders = function () {
            $.ajax({
                beforeSend: function (xhr) {
                    xhr.setRequestHeader(‘Authorization‘, ‘Bearer ‘ + $.cookie("token"));
                },
                url: apiServiceBaseUri + ‘api/orders‘,
                type: "GET",
                dataType: ‘json‘,
                success: function (data) {
                    showOrderTable(data);
                }
            });
        }

通过xhr.setRequestHeader(‘Authorization‘, ‘Bearer ‘ + $.cookie("token")); 的方式将token添加到请求头,相对angular的拦截方案,此方案就显得比较繁琐了,每个http请求都得有添加此行代码。

所有代码同步更新在 https://git.oschina.net/richieyangs/OAuthPractice.git

时间: 2024-08-04 23:44:06

使用OAuth打造webapi认证服务供自己的客户端使用(二)的相关文章

使用OAuth打造webapi认证服务供自己的客户端使用(转)

转自:http://www.cnblogs.com/richieyang/p/4918819.html#!comments 一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.注意是Authorization(授权),而不是Authentication(认证).用来做Authentication(认证)的标准叫做openid connect,我们将在以后的文章中进行介绍. 二.名词定义 理解OAuth中的专业术语能够帮助你理解其流程模

使用OAuth打造webapi认证服务供自己的客户端使用

一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.注意是Authorization(授权),而不是Authentication(认证).用来做Authentication(认证)的标准叫做openid connect,我们将在以后的文章中进行介绍. 二.名词定义 理解OAuth中的专业术语能够帮助你理解其流程模式,OAuth中常用的名词术语有4个,为了便于理解这些术语,我们先假设一个很常见的授权场景: 你访问了一个日志网站(thir

OAuth打造webapi认证服务

使用OAuth打造webapi认证服务供自己的客户端使用 一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.注意是Authorization(授权),而不是Authentication(认证).用来做Authentication(认证)的标准叫做openid connect,我们将在以后的文章中进行介绍. 二.名词定义 理解OAuth中的专业术语能够帮助你理解其流程模式,OAuth中常用的名词术语有4个,为了便于理解这些术语,我们先

OAuth在WebApi中的使用,前后台分离的调用方式

前段时间由于公司架构服务层向WebApi转换,就研究了OAuth在WebApi中的使用,这中间遇到了很多坑,在此记录一下OAuth的正确使用方式. 1.  OAuth是做什么的? 在网上浏览时,大家都见过这样的功能:网站A提供了第三方登录服务,比如使用新浪微博.QQ账户登录.用户使用第三方账户登陆后,第三方返回Token给网站A,当网站A调用第三方服务请求登录用户信息时需传递该Token给第三方,第三方才允许该服务请求.之后的每次请求无需再次认证,直接使用该Token即可.这就是OAuth的典型

Tomcat 配置用户认证服务供C#客户端调用

我美丽又贤惠的老婆大人做大骨头汤去了,今天是六一儿童节,明天是端午节,在这大好的节日,我们也难得的度假一把,大吃大喝一番,感谢我的老婆有这么好的手艺. 今天心情不错,要知道我们在平时的工作日没这么长时间腻歪在一起.现在我把在前段日子做的项目里,遇到的一个小问题来好好的总结一下.因为我们这个项目是用Java写的服务端发布WebService,客户端呢使用C#来调用WebService(本人以前搞过一段时间C#客户端,还总结了一个MVP框架AngelFrame,发布在:http://www.cnbl

net core3.1打造webapi开发框架的实践

https://www.cnblogs.com/datacool/p/datacool_dotnetcore_demo.html 实践技术看点 1.Swagger管理API说明文档 2.JwtBearer token验证 3.Swagger UI增加Authentication 4.EntityFrameworkCore+MySQL 5.在.net core 3.1下使用Log4net 前言 元旦过后就没什么工作上的任务了,这当然不能让领导看在眼里,动手实践一下新技术吧.于是准备搭一个webap

Tomcat 配置用户认证服务供C#客户端调用组滓爪妆抓妆

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

自己开发实现OAuth做webapi认证

一.作为认证服务器,首先需要提供一个可以通过appid/appsecret来获取token这样的一个接口,于是便有了以下代码. public class AuthController : ApiController { [HttpGet] public HttpResponseMessage Token(string appid = "", string appsecret = "") { ApiResponseEntity rep; var isv = AppMa

WebAPI 用户认证防篡改实现(二)AbsBaseAuthenticationAttribute

WebAPI的用户身份认证与MVC一样都是通过Attribute进行验证,此处定义了一个抽象基类,子类需要实现根据合作号获取合作用户信息的抽象方法 AbsBaseAuthenticationAttribute using System; using System.Web; using System.Collections.Specialized; using System.Net; using System.Net.Http; using System.Text.RegularExpressio