go get -u github.com/nilorg/oauth2
import "github.com/nilorg/oauth2"
Режим авторизации с использованием кода (authorization code) является наиболее полным и строгим режимом авторизации.
Его особенностью является взаимодействие между клиентским фоновым сервером и сервером аутентификации поставщика услуг.
Упрощённый режим (implicit grant type) не проходит через сервер приложения третьей стороны, а запрашивает токен непосредственно у сервера аутентификации в браузере, пропуская шаг «кода авторизации», отсюда и название.
Все шаги выполняются в браузере, токен виден посетителю, и клиенту не требуется аутентификация.
В режиме пароля владельца ресурса (Resource Owner Password Credentials Grant) пользователь предоставляет своё имя пользователя и пароль клиенту.
Клиент использует эту информацию для запроса авторизации у поставщика услуг.
В этом режиме пользователь должен предоставить свой пароль клиенту, но клиент не должен сохранять пароль.
Обычно это используется, когда пользователь очень доверяет клиенту, например, клиент является частью операционной системы или выпущен известной компанией.
И только если другие режимы авторизации не могут быть выполнены, поставщик услуг может рассмотреть возможность использования этого режима.
Режим клиента (Client Credentials Grant), в котором клиент регистрируется напрямую, вместо того чтобы действовать от имени пользователя, запрашивает услуги у поставщика услуг, фактически не существует проблемы авторизации.
Строго говоря, режим клиента не относится к проблеме, которую решает OAuth.
В этом режиме пользователь напрямую регистрируется у клиента, и клиент запрашивает услуги от имени себя, на самом деле нет проблемы авторизации.
Режим устройства (Device Code).
Точка интроспекции токена (Token Introspection).
Точка аннулирования токена (Token Revocation).
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"github.com/nilorg/oauth2"
)
var (
clients = map[string]string{
"oauth2_client": "password",
}
)
func main() {
srv := oauth2.NewServer()
srv.VerifyClient = func(basic *oauth2.ClientBasic) (err error) {
pwd, ok := clients[basic.ID]
if !ok {
err = oauth2.ErrInvalidClient
return
}
basic = &oauth2.ClientBasic{
ID: basic.ID,
Secret: pwd,
}
return
}
srv.VerifyClientID = func(clientID string) (err error) {
_, ok := clients[clientID]
if !ok {
err = oath2.ErrInvalidClient
}
return
}
srv.VerifyCode = func(code, clientID, redirectURI string) (value *oauth2.CodeValue, err error) {
//err = oauth2.ErrUnauthorizedClient
// 查询缓存/数据库中的code信息
value = &oauth2.CodeValue{
ClientID: clientID,
RedirectURI: redirectURI,
Scope: []string{"a", "b", "c"},
}
return
}
srv.GenerateCode = func(clientID, openID, redirectURI string, scope []string) (code string, err error) {
code = oauth2.RandomCode()
return
}}
srv.VerifyRedirectURI = func(clientID, redirectURI string) (err error) {
fmt.Println(clientID)
fmt.Println(redirectURI)
// err = oauth2.ErrInvalidRedirectURI
return
}
srv.VerifyPassword = func(username, password string) (openID string, err error) {
if username != "a" || password != "b" {
err = oauth2.ErrUnauthorizedClient
return
}
openID = "xxxx"
return
}
srv.VerifyScope = func(scopes []string, clientID string) (err error) {
// err = oauth2.ErrInvalidScope
return
}
srv.GenerateAccessToken = oauth2.NewDefaultGenerateAccessToken([]byte("xxxxx"))
srv.RefreshAccessToken = oauth2.NewDefaultRefreshAccessToken([]byte("xxxxx"))
srv.ParseAccessToken = oauth2.NewDefaultParseAccessToken([]byte("xxxxx"))
srv.GenerateDeviceAuthorization = func(issuer, verificationURI, clientID, scope string) (resp *oauth2.DeviceAuthorizationResponse, err error) {
resp = &oauth2.DeviceAuthorizationResponse{
DeviceCode: oauth2.RandomCode(),
UserCode: oauth2.RandomUserCode(),
VerificationURI: verificationURI,
VerificationURIQrcode: "",
ExpiresIn: 0,
Interval:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )