FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

Python48

OAuth2 规定在使用(我们打算用的)「password 流程」时,客户端/用户必须将 username 和 password 字段作为表单数据发送。我们看下在我们应该去如何实现呢。

我们写一个登录接口,默认返回token和token_type

from fastapi import FastAPI, Depends,status,HTTPException
from pydantic import BaseModel
from typing import Optional
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
fake_users = {
    "leizi": {
        "username": "leizi",
        "full_name": "leizishuoceshikaifa",
        "email": "leizi@leizi.com",
        "hashed_password": "leizi",
        "disabled": False
    }
}
app = FastAPI()

def fake_hash_password(password: str):
    return password

class User(BaseModel):
    username: str
    email: Optional[str] = None
    full_name: Optional[str] = None
    disabled: Optional[bool] = None
class UserInDB(User):
    hashed_password: str

def get_user(db, username: str):
    if username in db:
        user_dict = db[username]
        return UserInDB(**user_dict)
def fake_decode_token(token):
    user = get_user(fake_users, token)
    return user

def get_current_user(token: str = Depends(oauth2_scheme)):
    user = fake_decode_token(token)
    print(user)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid authentication",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return user
@app.post("/login")
def login(form_data: OAuth2PasswordRequestForm = Depends()):
#校验密码¶
目前我们已经从数据库中获取了用户数据,但尚未校验密码。

让我们首先将这些数据放入 Pydantic UserInDB 模型中。
永远不要保存明文密码,因此,我们将使用(伪)哈希密码系统。

如果密码不匹配,我们将返回同一个错误。

    user_dict = fake_users.get(form_data.username)
    print(user_dict)
    if not user_dict:
        raise HTTPException(status_code=400, detail="用户名错误")
    user = UserInDB(**user_dict)
    hashed_password = fake_hash_password(form_data.password)
    if not hashed_password == user.hashed_password:
        raise HTTPException(status_code=400, detail="密码错误 ")

    return {"access_token": user.username, "token_type": "bearer"}

@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
    print(current_user)
    return current_user

我们去测试下登录

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

那么我们在测试下带认证的

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

没有带认证,那么我们带下认证看下是否正确

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

我们看下接口返回正确。

代码中的:

UserInDB(**user_dict) 表示:

直接将 user_dict 的键和值作为关键字参数传递,等同于:

UserInDB(
    username = user_dict["username"],
    email = user_dict["email"],
    full_name = user_dict["full_name"],
    disabled = user_dict["disabled"],
    hashed_password = user_dict["hashed_password"],
)

加入我们的状态现在改成了True

fake_users = {
    "leizi": {
        "username": "leizi",
        "full_name": "leizishuoceshikaifa",
        "email": "leizi@leizi.com",
        "hashed_password": "leizi",
        "disabled": True
    }
}

我们不想让disabled为True的时候不能获取。我们看下如何实现的

def get_current_active_user(current_user: User = Depends(get_current_user)):
    if current_user.disabled:
        raise HTTPException(status_code=400, detail="已经删除")
    return current_user
@app.get("/users/me")
def read_users_me(current_user: User = Depends(get_current_active_user)):

    return current_user

其实很简单,我们就是在获取的依赖增加了另一个是否是active的判断的依赖。

文章首发在公众号,欢迎关注。

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

Original: https://www.cnblogs.com/leiziv5/p/15416748.html
Author: 北漂的雷子
Title: FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2



相关阅读1

Title: 【OSCAR开源先锋日】腾讯蓝鲸智云社区版“PaaS平台”及其调度编排SaaS“标准运维”正式开源

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

2019年4月11日,由中国信息通信研究院主办,云计算标准与开源推进委员会承办,云计算开源产业联盟支持,由高效运维社区协办的OSCAR开源先锋日在深圳圆满闭幕。

此次大会由中国信通院云大所所长何宝宏,中国信通院云大所云计算部主任栗蔚领衔指导,活动聚集了行业各界的资深技术专家,共同探讨中国开源事业的未来发展,旨在为本土开源企业与开源软件提供分享与交流的平台,促进国产开源软件的繁荣发展。

在本次大会上腾讯互娱蓝鲸产品中心总监党受辉详细讲述了蓝鲸的核心体系,并且在现场发布一则重磅消息:腾讯蓝鲸智云(以下简称"蓝鲸")社区版"PaaS平台"及其调度编排SaaS"标准运维"正式开源。

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

在上午的活动现场,蓝鲸产品中心总监党受辉全方位介绍蓝鲸体系的框架组成,并且畅谈蓝鲸如何基于PaaS衍生出一套完整的研发运维运营一体化体系,基于该体系下对蓝鲸生态发展的畅想以及持续发展的目标和未来的前景展望。

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

蓝鲸,是一套用于构建企业研发运营一体化体系的PaaS(平台即服务)开发框架,提供了aPaaS(DevOps流水线、运行环境托管、前后台框架)和iPaaS(持续集成、CMDB、作业平台、容器管理、数据平台、AI等原子平台)等模块,帮助企业技术人员快速构建基础运营PaaS,提升企业研发运营效率,助力企业运维团队转型,提供更多增值服务。

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

此前蓝鲸已免费对外开放了支持私有化布署的社区版,得到大量企业运维以及开发人员的使用,帮助一大批企业快速构建运维自动化体系的落地。为了更好的提升社区用户的参与深度以及助力运维从业人员的转型,腾讯蓝鲸智云此次开源社区版的"PaaS平台"以及调度编排SaaS"标准运维"。

此次蓝鲸新晋开源的PaaS平台承载所有SaaS系统/工具,让用户可以简单、快速地创建、部署和管理应用,提供了完善的前后台开发框架、服务总线(API网关)、调度引擎、公共组件等模块,帮助用户快速、低成本、免运维地构建支撑工具和运营系统。它为一个SaaS应用从创建到部署,再到后续的维护管理提供了完善的自动化和自助化服务,从而使开发者可以集中精力关注SaaS应用的逻辑开发。

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

产品包含以下特点:

  • 开发者中心:提供自助化、自动化服务,支持快速、低成本、免运维地构建SaaS应用
  • 统一用户登录体系:支持用户及角色管理,支持对接企业内部登录体系
  • 开发框架:提供统一的SaaS开发框架(前端、后台等), 提升开发效率
  • API网关:支持两种接入模式(在线自助接入和组件编码接入)的企业级服务总线,方便开发者对接企业内已有系统的API服务
  • 多环境部署:支持多环境部署SaaS, 方便开发者进行测试验证及生产环境发布
  • 可插拔式应用:支持SaaS上传自动部署, 方便不同开发者之间的SaaS移植

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2
标准运维(SOPS)是基于PaaS平台开发的官方SaaS应用之一,它能够将PaaS平台之上多个应用的功能串联到一个任务流程之中,实现跨系统调度编排的功能。

标准运维有两大核心服务:

  • 流程编排服务: 基于腾讯蓝鲸PaaS平台的API网关服务,对接企业内部各个系统 API的能力,将在多系统间切换的工作模式整合到一个流程中,实现一键自动化调度。
  • 自助化服务:标准运维屏蔽了底层系统之间的差异,让运维人员可以将业务日常的运维工作交给产品、开发、测试等人员执行,实现业务发布、变更等日常工作的自助化,除此之外,为降低非运维人员的操作成本,标准运维与蓝鲸PaaS平台深度整合,为用户提供了"轻应用"和"职能化"功能,提高自助率。

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2
产品包含以下特点:

  • 多元接入支持:标准运维对接了蓝鲸通知、作业平台、配置平台等服务,还支持用户自定义接入企业内部系统。
  • 可视化流程编排:通过拖拽方式组合原子节点到一个流程模板。 多种流程模式:支持原子节点的串行、并行,支持子流程,可以根据全局参数自动选择分支执行,节点失败处理机制可配置。
  • 参数引擎:支持参数共享,支持参数替换。
  • 可交互的任务执行:任务执行中可以随时暂停、继续、撤销,节点失败后可以重试、跳过。
  • 通用权限管理:通过配置平台同步业务角色,支持流程模板的权限控制。

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

蓝鲸在提升品质的同时也注重提升服务质量,在中国信息通信技术研究院(中国信通院)的指导下,由云计算开源产业联盟和腾讯公司共同推出对腾讯蓝鲸运维自动化工程师(BKOS)和腾讯蓝鲸智云-运维开发工程师(BKDS)的考核认证。通过严格的考核制度确保持证人的能力,并以此筛选合格的合作伙伴,对外保证蓝鲸的品质和口碑。

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

蓝鲸将继续以开放的姿态面向未来,继蓝鲸CMDB开源在社区内获得一致好评之后,蓝鲸PaaS平台、蓝鲸标准运维也将为蓝鲸社区继续添砖加瓦,为开源社区贡献更多资源。蓝鲸接下来会陆续开源容器管理平台、故障自愈等运维平台和SaaS。

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

更多项目详细信息,请进入GitHub查看,欢迎提出你的issue和PR!

项目开源地址(点击链接即可查看):

蓝鲸配置平台(CMDB):

https://github.com/Tencent/bk-cmdb

蓝鲸PaaS平台:

https://github.com/Tencent/bk-PaaS

标准运维:

https://github.com/Tencent/bk-sops

Original: https://www.cnblogs.com/tencent-blueking/p/16287547.html
Author: 腾讯蓝鲸智云
Title: 【OSCAR开源先锋日】腾讯蓝鲸智云社区版“PaaS平台”及其调度编排SaaS“标准运维”正式开源

相关阅读2

Title: 安卓开发——计时器

效果图

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

xml样式文件

<Button
    android:id="@+id/btnOk"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="开始计时"
    android:textSize="15dp" />

<TextView
    android:id="@+id/tvTime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="15dp" />

java功能文件,修改类名

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btnOk;
    private TextView tvTime;

    private boolean bStart=false;
    private Handler mHander=new Handler();
    private int mCount=0;

    private Runnable mCounter=new Runnable() {
        @Override
        public void run() {
            mCount++;
            tvTime.setText("当前计数值:"+mCount);
            mHander.postDelayed(this,1000);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        btnOk = (Button) findViewById(R.id.btnOk);
        tvTime = (TextView) findViewById(R.id.tvTime);

        btnOk.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnOk:
                if (bStart==false){
                    btnOk.setText("停止计时");
                    mHander.post(mCounter);
                }else{
                    btnOk.setText("开始计时");
                    mHander.removeCallbacks(mCounter);
                }
                bStart=!bStart;
                break;
        }
    }
}

Original: https://www.cnblogs.com/mzh2021/p/15538429.html
Author: 发现你走远了
Title: 安卓开发——计时器

相关阅读3

Title: Pandas简单操作(学习总结)

stu = pd.read_excel('./stu_data.xlsx')
stu['新体重'] = pd.cut(stu.体重,bins=[40,50,60,70,80,90],right=False)
stu.head()

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

⭐时间拆分

# stu.日期
stu['年份'] = stu.日期.dt.year
stu['月份'] = stu.日期.dt.month
stu['天数'] = stu.日期.dt.day
stu.head()

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

# Period 日期转换想要的格式
stu["日期"].apply(lambda x:pd.Period(x,freq='H')) # 保留到小时
stu["日期"].apply(lambda x:pd.Period(x,freq='M')) # 保留到月份

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

⭐表连接

# 创建新Series对象
stu1 = pd.Series(np.arange(12345678900,12345678952),name='手机号')
stu1

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

# 合并表stu3 = pd.concat([stu,stu1],axis=1)
stu3.head()

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

undefined

# join表连接
dict1 = {
    'employee_id':['NC001','NC002','NC003','NC004'],
    'name':['zs','lian','ls','wu'],
    'sex':['m','f','f','m'],
    'department':['php','python','c++','java'],
    'item_id':['N100','N103','N103','N100'],
}
dict2 = {
    'item_id':['N100','N102','N103','N104'],
    'item_name':['php','python','c++','java'],
    'location':['SZ','SH','BJ','GZ']
}
items = pd.DataFrame(dict2)
signup = pd.DataFrame(dict1)
print(signup)
print(items)

undefined

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

# join合并表,只输出报名人数不为0的项目及其对应的报名人数
df = items.set_index('item_id').join(signup.set_index('item_id'), on='item_id', how='inner')
df.groupby('item_name')['employee_id'].count()

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

⭐ mode()函数的使用
# Pandas dataframe.mode()函数获取沿所选轴的每个元素的模式。
# 获取身高的众数,并返回对应的身高值
import pandas as pd
Nowcoder = pd.read_excel('./stu_data.xlsx',sheet_name='BSdata')
Nowcoder.head()
Nowcoder.loc[:,['身高']].mode()

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

⭐修改索引

# 修改索引
df1 = Nowcoder[Nowcoder['身高'] == 169].sort_values('支出',ascending=False).head(5)

print(f"原索引为:{df1.index}")

df1.index = ['0','1','2','3']
df1

FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2

Original: https://www.cnblogs.com/lxxduang/p/16521740.html
Author: 小小程序员-lian
Title: Pandas简单操作(学习总结)