keycloak 是一个比较全,而且比较方便的sso 解决方案,同时为我们提供了灵活的扩展特性
备注: 测试使用docker-compose 运行,对于keycloak 使用pg 数据库做为后端存储

环境准备

  • docker-compose文件
version: "3"
services:
openresty:
build:
context: ./
dockerfile: ./Dockerfile
ports:
- "8090:80"
volumes:
- "./nginx_lua/:/opt/app/"
- "./nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf"
auth:
image: jboss/keycloak
ports:
- "8080:8080"
environment:
- "KEYCLOAK_USER=dalong"
- "KEYCLOAK_PASSWORD=dalongrong"
- "DB_VENDOR=postgres"
- "DB_ADDR=postgres"
- "DB_DATABASE=postgres"
- "DB_USER=postgres"
- "DB_PASSWORD=dalong"
- "PROXY_ADDRESS_FORWARDING=true"
postgres:
image: postgres:9.6
ports:
- "5432:5432"
environment:
- "POSTGRES_PASSWORD:dalong"
  • nginx 配置
    dockerfile: 主要是添加lua 包
FROM openresty/openresty:alpine-fat
LABEL author="1141591465@qq.com"
RUN /usr/local/openresty/luajit/bin/luarocks install lua-resty-openidc
EXPOSE 80

nginx.conf: 配置lua-resty-openidc 相关参数(注意realm 需要创建,同时需要创建client 以及添加一个可以登陆的用户)

worker_processes 1;
user root;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
lua_code_cache off;
lua_need_request_body on;
gzip on;
# cache for discovery metadata documents
lua_shared_dict discovery 1m;
# cache for JWKs
lua_shared_dict jwks 1m;
resolver 127.0.0.11 ipv6=off;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
lua_package_path '/opt/app/?.lua;;';
server {
listen 80;
server_name localhost;
charset utf-8;
## 此参数比较重要,因为为了方便我关闭了lua code cache
set $session_secret 623q4hR325t36VsCD3g567922IC0073T;
default_type text/html;
access_by_lua_block {
require("oidc/acc")()
}
expires 0;
add_header Cache-Control private;
location / {
default_type text/plain;
index index.html index.htm;
}
location /redirect_uri {
default_type text/plain;
content_by_lua_block {
ngx.req.read_body()
require("oidc/init")()
}
}
location = /favicon.ico {
root /opt/app/static;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} }
}
  • lua 代码说明
local cjson = require("cjson")
function init()
-- 配置参数从keycloak系统获取
local opts = {
redirect_uri_path = "/redirect_uri",
accept_none_alg = true,
discovery = "http://auth:8080/auth/realms/nginx/.well-known/openid-configuration",
client_id = "nginx",
client_secret = "1fb2d094-3a66-4c30-9cdb-f4210939fb1d",
redirect_uri_scheme = "http",
logout_path = "/logout",
redirect_after_logout_uri = "http://auth:8080/auth/realms/nginx/protocol/openid-connect/logout?redirect_uri=http://localhost:8090/",
redirect_after_logout_with_id_token_hint = false,
session_contents = {id_token = true}
}
-- call introspect for OAuth 2.0 Bearer Access Token validation
local res, err = require("resty.openidc").authenticate(opts)
if err then
ngx.status = 403
ngx.say(err)
ngx.exit(ngx.HTTP_FORBIDDEN)
end
-- ngx.say(cjson.encode(res))
end return init

keycloak 配置信息

  • realm

    *client
  • user

启动&&测试

  • 启动
docker-compose up -d
  • 本地hosts 配置
    因为使用了dns 地址
/etc/hosts
添加
127.0.0.1 auth
  • 测试
    打开 http://localhost:8090 会重定向到keycloak 的登陆页面,输入添加的用户信息


    session 信息

说明

注意我nginx.conf 中注释的说明,因为lua-resty-openidc 使用了lua-resty-session 但是lua-resty-session 在关闭lua cache 的时候
每次session secreet 会重新生成,所以比较靠谱的方便是指定一个session secret ,参考上边nginx 配置

参考资料

https://developers.redhat.com/blog/2018/10/08/configuring-nginx-keycloak-oauth-oidc/
https://github.com/rongfengliang/keycloak-openresty-openidc

 
 
 
 

openresty 集成 keycloak-oauth-oidc的更多相关文章

  1. 集成基于OAuth协议的单点登陆

    在之前的一篇文章中,我们已经介绍了如何为一个应用添加对CAS协议的支持,进而使得我们的应用可以与所有基于CAS协议的单点登陆服务通讯.但是现在的单点登陆服务实际上并不全是通过实现CAS协议来完成的.例 ...

  2. 在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client

    在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client   阅读目录 验证代码流程 Refreshing a Token Built-In Providers 这个包能够让你 ...

  3. VUE集成keycloak和Layui集成keycloak

    一:KEYCLOAK配置部分: 1,下载keycloak,官网地址:https://www.keycloak.org/downloads.html.下载第一个就行 2,下载完毕之后,打开文件,访问 b ...

  4. pushpin Server-sent events && openresty 集成试用

    前边有写过一个简单pushpin 集成stream 的demo,这次测试下sse 的功能 备注: 环境依然使用的是docker-compose运行 环境准备 docker-compose 文件 ver ...

  5. jenkins 集成 keycloak 认证

    keycloak 是很不错的sso 工具,当然也有Jenkins 的插件,我们可以使用jenkins 插件,方便用户账户的管理 环境准别 docker-compose version: "3 ...

  6. gearman openresty 集成试用

    很简单使用了一个openresty 的lua 模块 环境准备 docker-compose 文件 详细配置可以参考 https://github.com/rongfengliang/gearmango ...

  7. pushpin openresty 集成试用

    pushpin 是一个很不错的将restapi 转换为reailtime api 的proxy,openresty 具有很强的nginx 控制能力 可以方便的用来进行api 的开发,默认其他语言pus ...

  8. openresty 集成 sentry 异常系统

    sentry 是一个方便的错误异常追踪系统,同时社区也提供了openresty 的lua 包,使用docker-compose 进行测试 备注: sentry 部分的配置来自官方文档 环境准备 doc ...

  9. openresty 集成lua-resty-mail +smtp2http 扩展灵活的mail 服务

    lua-resty-mail 是一个不错的openresty mail 扩展,我们可以用来进行邮件发送,支持附件功能 smtp2http 是一个smtp 服务,可以将smtp 请求数据转换为http ...

随机推荐

  1. StringUtils详细介绍

    StringUtils详细介绍 public static void TestStr(){ #null 和 "" 操作~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  2. do文件的编写(转)

    以前在使用ModelSim进行仿真的时候,一直是使用其GUI进行操作的,但是这样很繁琐也很费时.故希望学习其自动化仿真do文件,下面是学习的一些总结. 一.编写基本的do文件 下面按照实际仿真的步骤来 ...

  3. Android开发---如何操作资源目录中的资源文件3--圆角边框、背景颜色渐变效果、边框颜色

    Android开发---如何操作资源目录中的资源文件3 效果图 1.圆角边框 2.背景颜色渐变效果 1.activity_main.xml 描述: 定义了一个shape资源管理按钮 <?xml ...

  4. centos7安装maven,git

    1.maven 下载 2.安装包 解压 3.配置maven环境变量 4.检查是否安装成功 5.检查是否安装 git 6.yum 安装 git 7.配置 git 环境变量 8.检查git是否安装成功 1 ...

  5. <YARN><MRv2><Spark on YARN>

    MRv1 VS MRv2 MRv1: - JobTracker: 资源管理 & 作业控制- 每个作业由一个JobInProgress控制,每个任务由一个TaskInProgress控制.由于每 ...

  6. Tap 模拟手势点击坐标

    前言:有时候元素怎么都定位不到,没办法就只能坐标定位了,不过这个坐标定位不准确,换个手机就可能定位不到了,这是一个下下策的定位方式. tap用法 1.tap是模拟手指点击页面上元素语法有两个参数,第一 ...

  7. L267 How to save money

    When it comes to saving money, the struggle is all too real. It's like your bank account and your 20 ...

  8. intellij怎么导入MySQL的驱动包

    1.下载zip格式的驱动包:https://dev.mysql.com/downloads/connector/j/ 2.解压zip,放到任意位置.其中的mysql-connector-java.ja ...

  9. mysql检查-优化-分析

    Mysql分析.检查.优化表 l 分析表 对表进行分析(分析关键字的分布, 分析存储MyISAM等表中键的分布) MySQL中使用ANALYZE TABLE语句来分析表,该语句的基本语法如下: mys ...

  10. table标签总结

    一.table标签:定义一个表格简单表格由table元素以及一个或多个tr(行标签).th(表头单元格标签).td(普通单元格标签) <table border=1><tr>& ...