我想使用OAuth来授权用户(由
username
我是说,
password
)在内联网上,但我不太明白如何使用OAuth来满足我的需求。
我主要关心的是防止
backend
(客户端),收集用户的密码和前端,接收访问令牌。
如果我使用
密码授予类型
,只有
前端
无法收集用户凭据,但是没有重定向或
授权码
对于这个补助计划,
前端
也会得到
访问令牌
因此可以被偷。
还有,用这个
密码授予类型
,和
前端
必须同时提供
客户id
和
客户端密码
只有
后端
是的。
如何使用oauth
密码授权
在这种情况下?
用例
我正在编写一个intranet平台,该平台应该接受来自ActiveDirectoryServer的用户最简单的解决方案是使用以下形式:
<form method="post">
<input type="text" name="username" required>
<input type="password" name="password" required>
<input type="submit" name="login">
</form>
因此
后端
可以使用活动目录服务器验证接收到的凭据但是,这是一个非常不安全的解决方案,因为
后端
可以收集用户的密码。在我编写应用程序时,这非常诱人:(
因此,我想在我无法控制的情况下设置第三方OAuth服务器,以便使用此表单:
<form action="http://oauth.company.com" method="post">
<input type="hidden" name="redirect" value="http://intranet.company.com">
<input type="hidden" name="grant_type" value="password">
<input type="hidden" name="client_id" value="badbeef">
<input type="text" name="username" required>
<input type="password" name="password" required>
<input type="submit" name="login">
</form>
有了这个解决方案,只有
前端
会看到密码,但由于任何用户都可以检查源代码,这会阻止我尝试获取他们的密码,因为我会暴露太多。
与
非统组织
密码授权
我有两个问题:
-
这个
前端
必须意识到
client_secret
.
-
这个
前端
将收到
访问令牌
.
所以我想要两个解决方案:
-
这个
前端
得到一个
授权码
然后传送到
后端
-
这个
授权服务器
亲自通知
后端
的
访问令牌
是的。
希望的身份验证流
从
前端
,和
资源所有者
输入发送到
授权服务器
,因此
顾客
不知道
资源所有者
资格证书。
POST /oauth/token HTTP/1.1
Host: oauth.company.com
grant_type=password
&username=jdoe
&password=secret
&client_id=intranet-id
&state=123
&redirect=http://intranet.company.com/auth
这个
授权服务器
授予用户并将其发送回
方端
以下内容:
HTTP/1.1 302 Found
Location: https://intranet.company.com/auth?code=g0ZGZmNjVmOWI&state=dkZmYxMzE2
然后后端请求
访问令牌
收到
代码
以下内容:
POST /oauth/token HTTP/1.1
Host: oauth.company.com
grant_type=????
&code=g0ZGZmNjVmOWI&state=dkZmYxMzE2
&client_id=intranet-id
&client_secret=intranet-secret
然后它收到:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
"scope":"create"
}
从这一点来看,
后端
重定向
前端
到内部网门户。