使用oauth2作为Django REST和客户端应用程序我在登录客户端时遇到问题

时间:2018-06-04 15:54:41

标签: django oauth-2.0 django-rest-framework django-authentication

我对Django并不是很有经验,当然也没有获得授权,但不知怎的,我还没有找到解决问题的好方法。

我有两个Django应用程序:一个用作服务器端应用程序(服务器应用程序),另一个用作客户端应用程序(客户端应用程序)。服务器应用程序使用django-rest-framework提供REST API。

这个api不应该是公开可见的,因此我决定使用django-auth-toolkit(oauth 2.0)。我按照here所述在授权服务器上注册了一个应用程序。该应用程序使用授权类型authorization_code,是一种公共客户端类型。

我可以在登录服务器应用程序并随后按下应用程序的授权按钮后获取授权。我也能够交换访问令牌的授权码。到目前为止一切都很好。

然而,在整个流程开始时,我需要在客户端应用程序上登录。然后,这个客户端需要使用get请求获取授权代码,并使用post请求访问代码(如上所述,这很好)。只有在提到的服务器应用程序成功登录后才能实现这些功能(理想情况下是相同的登录凭据)。但是,当这一切都完成后,我需要再次登录到客户端应用程序,它以某种方式记录下来。所以在这个流程中我需要登录三次:1。在客户端流程的开始,2。在服务器应用程序的请求,3。返回到客户端应用程序。

知道我做错了什么吗?在将http请求发送到服务器应用程序时,如何避免从客户端应用程序进行日志记录?理想情况下当然只需要一次登录,但我还没看到如何做到这一点。

代码的一些相关部分: 在客户端应用程序中,我使用以下方式获取授权代码:

if ($thewebform->data[6][0] == $row->id) //this is the row that needs to be 
edited

echo '<link type="text/css" rel="stylesheet" 
href="/sites/default/files/awardsvoting/awardsvoting.css"/>';
echo '<hr/>';
echo "<strong>form name</strong><br/>";


// get the webform module
include_once(drupal_get_path('module', 'webform') 
."/includes/webform.submissions.inc");

// get all the webform submissions with the nid of the webform
$filters = array('nid' => 6548);

try {
$thewebforms = webform_get_submissions($filters);
// print_r($thewebforms);

//determine how many votes the project is entitled to, based on membership 
type
// if it's a corporate membership, they get two votes
if ($row->membership_type == '6'){
$votesallowed = 2;  
}
// if it's a non-profit membership, they get two votes
else if ($row->membership_type == '3'){
$votesallowed = 2;  
}

// if it's a student membership, they get none
else if ($row->membership_type == '5') {
$votesallowed = 0;  
}

// if it's any other type of membership, they get one
else {
$votesallowed = 1;
}
//echo "votes allowed = " . $votesallowed;
// figure out how many votes the project has already cast, if any
// the index of $thewebform->data has to be readjusted for the index of the 
org_id in the webform
$votesused = array();
    foreach($thewebforms as $thewebform) {
    // echo $thewebform->data[6][0];
    // print_r($row->id);
    if ($thewebform->data[6][0] == $row->id) {
        $votesused[] = $thewebform;
        }
    }

// determine if the project has any votes left  
$votesremaining = $votesallowed - count($votesused);
//echo "remaining votes: " . $votesremaining;
echo "Votes remaining: " . $votesremaining . "/" . $votesallowed . "<br/>";

if ($votesremaining > 0) {
    echo '<a class="myButton" href="voting url' . $row->id . '&cid=' . 
$_SESSION[CiviCRM][userID] . '">Vote! 
</a>';
}
echo '<hr/>';
}
catch (exception $e) {
drupal_set_message($e->getMessage());
}

在客户端应用程序交换访问令牌的授权码:

class GetTokenView(RedirectView):
    url = '/'

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            get_token_url='http://localhost:8000/o/authorize?client_id=my_client_id&state=random_state_string&response_type=code'
            r = requests.get(url=get_token_url)
            return HttpResponseRedirect(r.url)

        return HttpResponseRedirect('/login/')

0 个答案:

没有答案